codicent-app-sdk 0.7.8 → 0.7.10

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.
@@ -35,6 +35,14 @@ export interface ColumnDefinition {
35
35
  action?: ColumnAction;
36
36
  /** Optional formatter function to transform the cell value for display. Receives the raw value and returns the formatted string. */
37
37
  format?: (value: unknown) => string;
38
+ /** Maps a display value to a CSS background color (e.g. { "Active": "#c6efce" }). */
39
+ colorMap?: Record<string, string>;
40
+ /** When "row", the colorMap colors the entire row based on this column's value. Default is "cell". */
41
+ colorScope?: "row" | "cell";
42
+ /** When true, renders the value as a colored badge/pill using colorMap. */
43
+ badge?: boolean;
44
+ /** Dynamic color function — receives the raw value and full row data. Takes precedence over colorMap. */
45
+ colorFn?: (value: unknown, row: Record<string, unknown>) => string | undefined;
38
46
  }
39
47
  export interface ListViewProps {
40
48
  data: Record<string, unknown>[];
@@ -45,6 +53,10 @@ export interface ListViewProps {
45
53
  onToggleCheckbox?: (item: Record<string, unknown>, key: string | string[], newValue: boolean, index: number) => void;
46
54
  onEnumChange?: (item: Record<string, unknown>, key: string | string[], newValue: string, index: number) => void;
47
55
  onFilteredDataChange?: (filteredData: Record<string, unknown>[]) => void;
56
+ /** Callback to compute a CSS background color for an entire row. Takes precedence over column colorScope:"row". */
57
+ rowColor?: (row: Record<string, unknown>) => string | undefined;
58
+ /** Reduces row height to 36px and cell padding for a denser, Excel-like view. Activated via ?compact in the URL. */
59
+ compact?: boolean;
48
60
  }
49
61
  export declare const ListView: React.FC<ListViewProps>;
50
62
  declare const _default: React.NamedExoticComponent<ListViewProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"ListView.d.ts","sourceRoot":"","sources":["../../../src/components/ListView.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAmB5D,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,kHAAkH;IAClH,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;IAC1B,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACpD,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAgOD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IACxF,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,2HAA2H;IAC3H,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,wFAAwF;IACxF,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,kFAAkF;IAClF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gHAAgH;IAChH,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,2HAA2H;IAC3H,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,oIAAoI;IACpI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChH,oBAAoB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;CAC1E;AAmJD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAkkB5C,CAAC;;AAGF,wBAAoC"}
1
+ {"version":3,"file":"ListView.d.ts","sourceRoot":"","sources":["../../../src/components/ListView.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAmB5D,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,kHAAkH;IAClH,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;IAC1B,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACpD,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA4OD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IACxF,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,2HAA2H;IAC3H,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,wFAAwF;IACxF,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,kFAAkF;IAClF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gHAAgH;IAChH,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,2HAA2H;IAC3H,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,oIAAoI;IACpI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACpC,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,sGAAsG;IACtG,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yGAAyG;IACzG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;CAChF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChH,oBAAoB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;IACzE,mHAAmH;IACnH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;IAChE,oHAAoH;IACpH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAmJD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAknB5C,CAAC;;AAGF,wBAAoC"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),n=require("@fluentui/react-components"),i=require("@fluentui/react-icons"),r=require("../services/codicent.js"),l=require("../hooks/useLocalization.js");const a=n.makeStyles({container:{width:"100%",overflowX:"auto",userSelect:"text"},table:{width:"100%",borderCollapse:"collapse",backgroundColor:"#ffffff",fontSize:"14px",tableLayout:"fixed",userSelect:"text"},th:{textAlign:"left",padding:"12px 8px",borderBottom:"2px solid #e0e0e0",fontWeight:"600",backgroundColor:"#f5f5f5",position:"sticky",top:0,zIndex:1,cursor:"pointer",userSelect:"none","&:hover":{backgroundColor:"#e8e8e8"}},td:{padding:"12px 8px",borderBottom:"1px solid #e0e0e0",verticalAlign:"top",wordWrap:"break-word",overflow:"hidden",userSelect:"text"},tdTruncated:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap","@media (hover: none)":{cursor:"pointer"}},tr:{height:"57px","&:hover":{backgroundColor:"#f9f9f9"}},emptyState:{padding:"20px",textAlign:"center",color:"#666"},sortIndicator:{marginLeft:"4px",fontSize:"10px"},hideOnMobile:{"@media (max-width: 768px)":{display:"none"}},dialogContent:{wordWrap:"break-word",whiteSpace:"pre-wrap",maxHeight:"60vh",overflowY:"auto"},thumbnail:{maxWidth:"50px",maxHeight:"50px",objectFit:"cover"},tooltip:{maxWidth:"600px",whiteSpace:"normal",wordWrap:"break-word"},editButton:{minWidth:"auto",padding:"4px 8px"},actionsColumn:{width:"100px",textAlign:"center"},filterInput:{width:"100%",padding:"4px 8px",fontSize:"14px",border:"1px solid #e0e0e0",borderRadius:"4px",paddingRight:"28px"},filterWrapper:{position:"relative"},clearFilterButton:{position:"absolute",right:"6px",top:"50%",transform:"translateY(-50%)",minWidth:"auto",height:"20px",padding:"0 6px",lineHeight:"18px"},filterToolbar:{display:"flex",justifyContent:"flex-end",padding:"8px",gap:"8px"},cellWithAction:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"4px"},actionIcon:{minWidth:"auto",padding:"2px",marginLeft:"4px",flexShrink:0,cursor:"pointer",opacity:.7,"&:hover":{opacity:1}},thumbnailRow:{display:"flex",gap:"4px",flexWrap:"wrap"},cellText:{flex:1,overflow:"hidden",textOverflow:"ellipsis"}}),o=e=>{if(/^\d{4}-\d{2}-\d{2}/.test(e)){const t=new Date(e);if(!isNaN(t.getTime()))return t.getTime()}const t=e.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})/);if(t){const e=parseInt(t[1],10),n=parseInt(t[2],10)-1,i=parseInt(t[3],10),r=new Date(i,n,e);if(r.getFullYear()===i&&r.getMonth()===n&&r.getDate()===e)return r.getTime()}return null},s=e=>{const t=e.trim().replace(/[\s\u00a0]/g,"");if(""===t||"-"===t)return null;const n=(t.match(/,/g)||[]).length,i=(t.match(/\./g)||[]).length;let r;r=1===n&&0===i?/,\d{1,2}$/.test(t)?t.replace(/,\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/,/g,""):1===i&&0===n?/\.\d{1,2}$/.test(t)?t.replace(/\.\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/\./g,""):t.replace(/[,.]/g,"");const l=Number(r);return""!==r&&isFinite(l)?l:null},c=(e,t)=>{if("string"==typeof t)return e[t];for(const n of t)if(void 0!==e[n])return e[n]},d=new Set,u=n.makeStyles({img:{maxWidth:"40px",maxHeight:"40px",objectFit:"cover",borderRadius:"3px",display:"block"},fileIcon:{width:"24px",height:"24px",verticalAlign:"middle"}}),p=({fileId:n})=>{const[l,a]=t.useState((()=>!d.has(n))),o=u();return e.jsx("a",{href:r.CodicentService.getFileUrl(n),target:"_blank",rel:"noopener noreferrer",children:l?e.jsx("img",{src:r.CodicentService.getImageUrl(n,40),alt:"",className:o.img,onError:()=>{d.add(n),a(!1)}}):e.jsx(i.Attach24Regular,{className:o.fileIcon})})},h=({value:i,options:r,optionsLoader:l,minChars:a=2,maxResults:o=50,columnKey:s,item:c,actualIndex:d,onEnumChange:u,label:p,t:h})=>{const[x,m]=t.useState(i),[f,g]=t.useState([]),[y,j]=t.useState(!1),b=t.useRef(null);t.useEffect((()=>{m(i)}),[i]),t.useEffect((()=>{if(l){if(!(x.length<a))return b.current&&clearTimeout(b.current),b.current=setTimeout((async()=>{j(!0);try{const e=await l(x);g(e.slice(0,o))}finally{j(!1)}}),250),()=>{b.current&&clearTimeout(b.current)};g([])}}),[x,l,a,o]);const v=t.useMemo((()=>(r??[]).filter((e=>e.toLowerCase().includes(x.toLowerCase()))).slice(0,o)),[r,x,o]),S=l?f:v;return e.jsx(n.Combobox,{value:x,freeform:!0,"aria-label":p,placeholder:y?h("Loading..."):l&&x.length<a?h(`Type ${a}+ characters to search...`):void 0,onChange:e=>m(e.target.value),onOptionSelect:(e,t)=>{t.optionValue&&(m(t.optionValue),u&&u(c,s,t.optionValue,d))},onBlur:()=>{u&&u(c,s,x,d)},style:{width:"100%"},children:S.map((t=>e.jsx(n.Option,{value:t,children:t},t)))})},x=({data:d,columns:u,canEdit:x,onEdit:m,onDelete:f,onToggleCheckbox:g,onEnumChange:y,onFilteredDataChange:j})=>{const b=a(),{visibleColumns:v,defaultSortIndex:S,defaultSortDirection:w}=t.useMemo((()=>{const e=d&&d.length>0?Array.from(new Set(d.flatMap((e=>Object.keys(e))))):[],t=(u||e.map((e=>({key:e})))).filter((e=>!e.hidden)),n=t.findIndex((e=>e.defaultSort));return{visibleColumns:t,defaultSortIndex:n,defaultSortDirection:n>=0&&t[n].defaultSort||null}}),[d,u]),[C,k]=t.useState(S>=0?S:null),[N,W]=t.useState(w),[I,O]=t.useState(!1),[A,$]=t.useState({title:"",text:""}),[M,L]=t.useState({}),[T,D]=t.useState(0),F=t.useRef(null),{t:B}=l.default();t.useEffect((()=>()=>{null!==F.current&&cancelAnimationFrame(F.current)}),[]);const R=e=>e.title?B(e.title):Array.isArray(e.key)?e.key[0]:e.key,E=e=>{const t=[];return e.hideOnMobile&&t.push(b.hideOnMobile),t.join(" ")},q=(e,t)=>{L((n=>{const i={...n};return""===t.trim()?delete i[e]:i[e]=t,i}))},_=e=>null==e||"string"==typeof e&&e.startsWith("[")&&e.endsWith("]")?"":"object"==typeof e?JSON.stringify(e):String(e),z=t.useMemo((()=>{const e=[...d];if(null!==C&&N){const t=v[C];e.sort(((e,n)=>{const i=c(e,t.key),r=c(n,t.key);if(null==i)return 1;if(null==r)return-1;let l=0;if("string"==typeof i&&"string"==typeof r){const e=o(i),t=o(r);if(null!==e&&null!==t)l=e-t;else{const e=s(i),t=s(r);l=null!==e&&null!==t?e-t:i.localeCompare(r)}}else if("number"==typeof i&&"number"==typeof r)l=i-r;else{const e=s(String(i)),t=s(String(r));l=null!==e&&null!==t?e-t:String(i).localeCompare(String(r))}return"asc"===N?l:-l}))}return e}),[d,C,N,v]),H=t.useMemo((()=>z.filter((e=>{for(const[t,n]of Object.entries(M)){const i=parseInt(t),r=v[i],l=c(e,r.key),a=_(l).toLowerCase(),o=n.toLowerCase();if(!("enum"===r.type&&r.enumOptions?a===o:a.includes(o)))return!1}return!0}))),[z,M,v]);t.useEffect((()=>{j&&j(H)}),[H,j]);const P="undefined"!=typeof window?window.innerHeight-250:600,V=Math.max(0,Math.floor(T/57)-5),Y=Math.min(H.length,Math.ceil((T+P)/57)+5),U=H.slice(V,Y),K=57*H.length,J=57*V,X=(e,t)=>{if(void 0!==e.id)return String(e.id);if(void 0!==e._id)return String(e._id);if(void 0!==e.originalMessageId)return String(e.originalMessageId);return`row-${t}-${(e=>{let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return Math.abs(t)})(v.slice(0,3).map((t=>String(c(e,t.key)??""))).join("-"))}`};return d&&0!==d.length?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:b.container,onScroll:e=>{const t=e.currentTarget.scrollTop;null!==F.current&&cancelAnimationFrame(F.current),F.current=requestAnimationFrame((()=>{D(t),F.current=null}))},style:{maxHeight:"calc(100vh - 200px)",overflowY:"auto"},children:e.jsxs("table",{className:b.table,children:[e.jsxs("thead",{children:[e.jsxs("tr",{children:[v.map(((t,n)=>{const i=t.maxWidth?{width:`${t.maxWidth}px`,maxWidth:`${t.maxWidth}px`}:{};return e.jsxs("th",{className:`${b.th} ${E(t)}`.trim(),style:i,onClick:()=>(e=>{C===e?"asc"===N?W("desc"):"desc"===N&&(k(null),W(null)):(k(e),W("asc"))})(n),children:[R(t),C===n&&e.jsx("span",{className:b.sortIndicator,children:"asc"===N?"▲":"▼"})]},n)})),x&&e.jsx("th",{className:`${b.th} ${b.actionsColumn}`,style:{width:"100px"},children:B("Actions")})]}),e.jsxs("tr",{children:[v.map(((t,i)=>{const r=t.maxWidth?{width:`${t.maxWidth}px`,maxWidth:`${t.maxWidth}px`}:{};return e.jsx("th",{className:E(t),style:r,children:t.filterable&&e.jsx("div",{className:b.filterWrapper,children:"enum"===t.type&&t.enumOptions?e.jsxs(n.Select,{className:b.filterInput,value:M[i]||"",onChange:(e,t)=>q(i,t.value),onClick:e=>e.stopPropagation(),children:[e.jsx("option",{value:"",children:B("All")}),t.enumOptions.filter((e=>""!==e)).map((t=>e.jsx("option",{value:t,children:B(t)},t)))]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",className:b.filterInput,placeholder:B("Filter")+"...",value:M[i]||"",onChange:e=>q(i,e.target.value),onClick:e=>e.stopPropagation()}),(M[i]||"").length>0&&e.jsx(n.Button,{appearance:"subtle",className:b.clearFilterButton,onClick:e=>{e.stopPropagation(),(e=>{L((t=>{const n={...t};return delete n[e],n}))})(i)},children:"×"})]})})},i)})),x&&e.jsx("th",{className:b.actionsColumn})]})]}),e.jsxs("tbody",{children:[V>0&&e.jsx("tr",{style:{height:`${J}px`},children:e.jsx("td",{colSpan:v.length+(x?1:0),style:{padding:0,border:"none"}})}),U.map(((t,l)=>{const a=t._index,o="number"==typeof a?a:V+l;return e.jsxs("tr",{className:b.tr,children:[v.map(((i,l)=>{const a=c(t,i.key),s=i.format?i.format(a):_(a),d=i.maxWidth?`${b.td} ${b.tdTruncated} ${E(i)}`.trim():`${b.td} ${E(i)}`.trim(),u=()=>{window.matchMedia("(hover: hover)").matches||i.maxWidth&&s.length>0&&($({title:R(i),text:s}),O(!0))};if("thumbnail"===i.type){const t=Array.isArray(a)?a:[];return e.jsx("td",{className:d,children:e.jsx("div",{className:b.thumbnailRow,children:t.map((t=>e.jsx(p,{fileId:t},t)))})},l)}if("file"===i.type&&s)return e.jsx("td",{className:d,onClick:u,children:e.jsx("a",{href:r.CodicentService.getFileUrl(s),target:"_blank",rel:"noopener noreferrer",children:B("Download")})},l);if("checkbox"===i.type){const r=!0===a||"true"===a||"yes"===a||"1"===a;return e.jsx("td",{className:d,children:e.jsx(n.Checkbox,{checked:r,onChange:(e,n)=>{g&&g(t,i.key,!0===n.checked,o)}})},l)}if("enum"===i.type&&i.enumOptions&&i.editable)return e.jsx("td",{className:d,children:e.jsxs(n.Select,{value:s,"aria-label":i.title?B(i.title):Array.isArray(i.key)?i.key[0]:i.key,onChange:(e,n)=>{y&&y(t,i.key,n.value,o)},style:{width:"100%"},children:[!i.enumOptions.includes(s)&&s&&e.jsx("option",{value:s,children:s}),i.enumOptions.map((t=>e.jsx("option",{value:t,children:B(t)},t)))]})},l);if("combobox"===i.type&&i.editable&&(i.enumOptions||i.enumOptionsLoader))return e.jsx("td",{className:d,children:e.jsx(h,{value:s,options:i.enumOptions,optionsLoader:i.enumOptionsLoader,minChars:i.enumOptionsLoaderMinChars,maxResults:i.enumOptionsLoaderMaxResults,columnKey:i.key,item:t,actualIndex:o,onEnumChange:y,label:i.title?B(i.title):Array.isArray(i.key)?i.key[0]:i.key,t:B})},l);const x=()=>i.maxWidth&&s.length>0?e.jsx(n.Tooltip,{content:{children:s,style:{maxWidth:"600px",whiteSpace:"normal"}},relationship:"description",children:e.jsx("span",{children:s})}):s,m=()=>{if(!i.action)return null;const r=i.action,l=i.action.icon,a=e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(l,{}),className:b.actionIcon,onClick:e=>{e.stopPropagation(),r.onClick(t)},size:"small"});return r.tooltip?e.jsx(n.Tooltip,{content:B(r.tooltip),relationship:"label",children:a}):a};return e.jsx("td",{className:d,onClick:u,children:i.action?e.jsxs("div",{className:b.cellWithAction,children:[i.action.iconLeft&&m(),e.jsx("span",{className:b.cellText,children:x()}),!i.action.iconLeft&&m()]}):x()},l)})),x&&(m||f)&&e.jsx("td",{className:`${b.td} ${b.actionsColumn}`,children:e.jsxs("div",{style:{display:"flex",gap:"4px",justifyContent:"center"},children:[m&&e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(i.Edit24Regular,{}),className:b.editButton,onClick:()=>m(t,o),title:B("Edit")}),f&&e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(i.Delete24Regular,{}),className:b.editButton,onClick:()=>f(t,o),title:B("Delete")})]})})]},X(t,o))})),Y<H.length&&e.jsx("tr",{style:{height:K-J-57*U.length+"px"},children:e.jsx("td",{colSpan:v.length+(x?1:0),style:{padding:0,border:"none"}})})]})]})}),e.jsx(n.Dialog,{open:I,onOpenChange:(e,t)=>O(t.open),children:e.jsx(n.DialogSurface,{children:e.jsxs(n.DialogBody,{children:[e.jsx(n.DialogTitle,{children:A.title}),e.jsx(n.DialogContent,{className:b.dialogContent,children:A.text})]})})})]}):e.jsx("div",{className:b.emptyState,children:B("No data to display")})};var m=t.memo(x);exports.ListView=x,exports.default=m;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),n=require("@fluentui/react-components"),r=require("@fluentui/react-icons"),o=require("../services/codicent.js"),i=require("../hooks/useLocalization.js");const l=n.makeStyles({container:{width:"100%",overflowX:"auto",userSelect:"text"},table:{width:"100%",borderCollapse:"collapse",backgroundColor:"#ffffff",fontSize:"14px",tableLayout:"fixed",userSelect:"text"},th:{textAlign:"left",padding:"12px 8px",borderBottom:"2px solid #e0e0e0",fontWeight:"600",backgroundColor:"#f5f5f5",position:"sticky",top:0,zIndex:1,cursor:"pointer",userSelect:"none","&:hover":{backgroundColor:"#e8e8e8"}},td:{padding:"12px 8px",borderBottom:"1px solid #e0e0e0",verticalAlign:"top",wordWrap:"break-word",overflow:"hidden",userSelect:"text"},tdTruncated:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap","@media (hover: none)":{cursor:"pointer"}},tr:{height:"57px","&:hover":{backgroundColor:"#f9f9f9"}},emptyState:{padding:"20px",textAlign:"center",color:"#666"},sortIndicator:{marginLeft:"4px",fontSize:"10px"},hideOnMobile:{"@media (max-width: 768px)":{display:"none"}},dialogContent:{wordWrap:"break-word",whiteSpace:"pre-wrap",maxHeight:"60vh",overflowY:"auto"},thumbnail:{maxWidth:"50px",maxHeight:"50px",objectFit:"cover"},tooltip:{maxWidth:"600px",whiteSpace:"normal",wordWrap:"break-word"},editButton:{minWidth:"auto",padding:"4px 8px"},actionsColumn:{width:"100px",textAlign:"center"},filterInput:{width:"100%",padding:"4px 8px",fontSize:"14px",border:"1px solid #e0e0e0",borderRadius:"4px",paddingRight:"28px"},filterWrapper:{position:"relative"},clearFilterButton:{position:"absolute",right:"6px",top:"50%",transform:"translateY(-50%)",minWidth:"auto",height:"20px",padding:"0 6px",lineHeight:"18px"},filterToolbar:{display:"flex",justifyContent:"flex-end",padding:"8px",gap:"8px"},cellWithAction:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"4px"},actionIcon:{minWidth:"auto",padding:"2px",marginLeft:"4px",flexShrink:0,cursor:"pointer",opacity:.7,"&:hover":{opacity:1}},thumbnailRow:{display:"flex",gap:"4px",flexWrap:"wrap"},cellText:{flex:1,overflow:"hidden",textOverflow:"ellipsis"},badge:{borderRadius:"12px",padding:"2px 8px",fontSize:"12px",fontWeight:"600",display:"inline-block",whiteSpace:"nowrap"},tdCompact:{paddingTop:"4px",paddingBottom:"4px"}}),a=e=>{if(/^\d{4}-\d{2}-\d{2}/.test(e)){const t=new Date(e);if(!isNaN(t.getTime()))return t.getTime()}const t=e.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})/);if(t){const e=parseInt(t[1],10),n=parseInt(t[2],10)-1,r=parseInt(t[3],10),o=new Date(r,n,e);if(o.getFullYear()===r&&o.getMonth()===n&&o.getDate()===e)return o.getTime()}return null},s=e=>{const t=e.trim().replace(/[\s\u00a0]/g,"");if(""===t||"-"===t)return null;const n=(t.match(/,/g)||[]).length,r=(t.match(/\./g)||[]).length;let o;o=1===n&&0===r?/,\d{1,2}$/.test(t)?t.replace(/,\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/,/g,""):1===r&&0===n?/\.\d{1,2}$/.test(t)?t.replace(/\.\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/\./g,""):t.replace(/[,.]/g,"");const i=Number(o);return""!==o&&isFinite(i)?i:null},c=(e,t)=>{if("string"==typeof t)return e[t];for(const n of t)if(void 0!==e[n])return e[n]},d=new Set,p=n.makeStyles({img:{maxWidth:"40px",maxHeight:"40px",objectFit:"cover",borderRadius:"3px",display:"block"},fileIcon:{width:"24px",height:"24px",verticalAlign:"middle"}}),u=({fileId:n})=>{const[i,l]=t.useState((()=>!d.has(n))),a=p();return e.jsx("a",{href:o.CodicentService.getFileUrl(n),target:"_blank",rel:"noopener noreferrer",children:i?e.jsx("img",{src:o.CodicentService.getImageUrl(n,40),alt:"",className:a.img,onError:()=>{d.add(n),l(!1)}}):e.jsx(r.Attach24Regular,{className:a.fileIcon})})},h=({value:r,options:o,optionsLoader:i,minChars:l=2,maxResults:a=50,columnKey:s,item:c,actualIndex:d,onEnumChange:p,label:u,t:h})=>{const[x,m]=t.useState(r),[f,g]=t.useState([]),[y,j]=t.useState(!1),b=t.useRef(null);t.useEffect((()=>{m(r)}),[r]),t.useEffect((()=>{if(i){if(!(x.length<l))return b.current&&clearTimeout(b.current),b.current=setTimeout((async()=>{j(!0);try{const e=await i(x);g(e.slice(0,a))}finally{j(!1)}}),250),()=>{b.current&&clearTimeout(b.current)};g([])}}),[x,i,l,a]);const C=t.useMemo((()=>(o??[]).filter((e=>e.toLowerCase().includes(x.toLowerCase()))).slice(0,a)),[o,x,a]),v=i?f:C;return e.jsx(n.Combobox,{value:x,freeform:!0,"aria-label":u,placeholder:y?h("Loading..."):i&&x.length<l?h(`Type ${l}+ characters to search...`):void 0,onChange:e=>m(e.target.value),onOptionSelect:(e,t)=>{t.optionValue&&(m(t.optionValue),p&&p(c,s,t.optionValue,d))},onBlur:()=>{p&&p(c,s,x,d)},style:{width:"100%"},children:v.map((t=>e.jsx(n.Option,{value:t,children:t},t)))})},x=({data:d,columns:p,canEdit:x,onEdit:m,onDelete:f,onToggleCheckbox:g,onEnumChange:y,onFilteredDataChange:j,rowColor:b,compact:C})=>{const v=l(),{visibleColumns:w,defaultSortIndex:S,defaultSortDirection:k}=t.useMemo((()=>{const e=d&&d.length>0?Array.from(new Set(d.flatMap((e=>Object.keys(e))))):[],t=(p||e.map((e=>({key:e})))).filter((e=>!e.hidden)),n=t.findIndex((e=>e.defaultSort));return{visibleColumns:t,defaultSortIndex:n,defaultSortDirection:n>=0&&t[n].defaultSort||null}}),[d,p]),[N,W]=t.useState(S>=0?S:null),[M,$]=t.useState(k),[I,O]=t.useState(!1),[A,T]=t.useState({title:"",text:""}),[L,F]=t.useState({}),[D,B]=t.useState(0),R=t.useRef(null),{t:E}=i.default(),q=C?36:57;t.useEffect((()=>()=>{null!==R.current&&cancelAnimationFrame(R.current)}),[]);const z=e=>e.title?E(e.title):Array.isArray(e.key)?e.key[0]:e.key,_=e=>{const t=[];return e.hideOnMobile&&t.push(v.hideOnMobile),t.join(" ")},H=(e,t)=>{F((n=>{const r={...n};return""===t.trim()?delete r[e]:r[e]=t,r}))},P=e=>null==e||"string"==typeof e&&e.startsWith("[")&&e.endsWith("]")?"":"object"==typeof e?JSON.stringify(e):String(e),V=t.useMemo((()=>{const e=[...d];if(null!==N&&M){const t=w[N];e.sort(((e,n)=>{const r=c(e,t.key),o=c(n,t.key);if(null==r)return 1;if(null==o)return-1;let i=0;if("string"==typeof r&&"string"==typeof o){const e=a(r),t=a(o);if(null!==e&&null!==t)i=e-t;else{const e=s(r),t=s(o);i=null!==e&&null!==t?e-t:r.localeCompare(o)}}else if("number"==typeof r&&"number"==typeof o)i=r-o;else{const e=s(String(r)),t=s(String(o));i=null!==e&&null!==t?e-t:String(r).localeCompare(String(o))}return"asc"===M?i:-i}))}return e}),[d,N,M,w]),Y=t.useMemo((()=>V.filter((e=>{for(const[t,n]of Object.entries(L)){const r=parseInt(t),o=w[r],i=c(e,o.key),l=P(i).toLowerCase(),a=n.toLowerCase();if(!("enum"===o.type&&o.enumOptions?l===a:l.includes(a)))return!1}return!0}))),[V,L,w]);t.useEffect((()=>{j&&j(Y)}),[Y,j]);const U="undefined"!=typeof window?window.innerHeight-250:600,K=Math.max(0,Math.floor(D/q)-5),J=Math.min(Y.length,Math.ceil((D+U)/q)+5),X=Y.slice(K,J),G=Y.length*q,Q=K*q,Z=(e,t)=>{if(void 0!==e.id)return String(e.id);if(void 0!==e._id)return String(e._id);if(void 0!==e.originalMessageId)return String(e.originalMessageId);return`row-${t}-${(e=>{let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return Math.abs(t)})(w.slice(0,3).map((t=>String(c(e,t.key)??""))).join("-"))}`};return d&&0!==d.length?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:v.container,onScroll:e=>{const t=e.currentTarget.scrollTop;null!==R.current&&cancelAnimationFrame(R.current),R.current=requestAnimationFrame((()=>{B(t),R.current=null}))},style:{maxHeight:"calc(100vh - 200px)",overflowY:"auto"},children:e.jsxs("table",{className:v.table,children:[e.jsxs("thead",{children:[e.jsxs("tr",{children:[w.map(((t,n)=>{const r=t.maxWidth?{width:`${t.maxWidth}px`,maxWidth:`${t.maxWidth}px`}:{};return e.jsxs("th",{className:`${v.th} ${_(t)}`.trim(),style:r,onClick:()=>(e=>{N===e?"asc"===M?$("desc"):"desc"===M&&(W(null),$(null)):(W(e),$("asc"))})(n),children:[z(t),N===n&&e.jsx("span",{className:v.sortIndicator,children:"asc"===M?"▲":"▼"})]},n)})),x&&e.jsx("th",{className:`${v.th} ${v.actionsColumn}`,style:{width:"100px"},children:E("Actions")})]}),e.jsxs("tr",{children:[w.map(((t,r)=>{const o=t.maxWidth?{width:`${t.maxWidth}px`,maxWidth:`${t.maxWidth}px`}:{};return e.jsx("th",{className:_(t),style:o,children:t.filterable&&e.jsx("div",{className:v.filterWrapper,children:"enum"===t.type&&t.enumOptions?e.jsxs(n.Select,{className:v.filterInput,value:L[r]||"",onChange:(e,t)=>H(r,t.value),onClick:e=>e.stopPropagation(),children:[e.jsx("option",{value:"",children:E("All")}),t.enumOptions.filter((e=>""!==e)).map((t=>e.jsx("option",{value:t,children:E(t)},t)))]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",className:v.filterInput,placeholder:E("Filter")+"...",value:L[r]||"",onChange:e=>H(r,e.target.value),onClick:e=>e.stopPropagation()}),(L[r]||"").length>0&&e.jsx(n.Button,{appearance:"subtle",className:v.clearFilterButton,onClick:e=>{e.stopPropagation(),(e=>{F((t=>{const n={...t};return delete n[e],n}))})(r)},children:"×"})]})})},r)})),x&&e.jsx("th",{className:v.actionsColumn})]})]}),e.jsxs("tbody",{children:[K>0&&e.jsx("tr",{style:{height:`${Q}px`},children:e.jsx("td",{colSpan:w.length+(x?1:0),style:{padding:0,border:"none"}})}),X.map(((t,i)=>{const l=t._index,a="number"==typeof l?l:K+i;let s;if(b&&(s=b(t)),!s)for(const e of w)if("row"===e.colorScope&&e.colorMap){const n=e.format?e.format(c(t,e.key)):P(c(t,e.key));if(s=e.colorMap[n],s)break}return e.jsxs("tr",{className:v.tr,style:{height:`${q}px`,...s?{backgroundColor:s}:{}},children:[w.map(((r,i)=>{const l=c(t,r.key),s=r.format?r.format(l):P(l),d=r.maxWidth?`${v.td} ${v.tdTruncated} ${C?v.tdCompact:""} ${_(r)}`.trim():`${v.td} ${C?v.tdCompact:""} ${_(r)}`.trim(),p=r.colorFn?r.colorFn(l,t):r.colorMap&&"row"!==r.colorScope?r.colorMap[s]:void 0,x=()=>{window.matchMedia("(hover: hover)").matches||r.maxWidth&&s.length>0&&(T({title:z(r),text:s}),O(!0))};if("thumbnail"===r.type){const t=Array.isArray(l)?l:[];return e.jsx("td",{className:d,children:e.jsx("div",{className:v.thumbnailRow,children:t.map((t=>e.jsx(u,{fileId:t},t)))})},i)}if("file"===r.type&&s)return e.jsx("td",{className:d,onClick:x,children:e.jsx("a",{href:o.CodicentService.getFileUrl(s),target:"_blank",rel:"noopener noreferrer",children:E("Download")})},i);if("checkbox"===r.type){const o=!0===l||"true"===l||"yes"===l||"1"===l;return e.jsx("td",{className:d,children:e.jsx(n.Checkbox,{checked:o,onChange:(e,n)=>{g&&g(t,r.key,!0===n.checked,a)}})},i)}if("enum"===r.type&&r.enumOptions&&r.editable)return e.jsx("td",{className:d,children:e.jsxs(n.Select,{value:s,"aria-label":r.title?E(r.title):Array.isArray(r.key)?r.key[0]:r.key,onChange:(e,n)=>{y&&y(t,r.key,n.value,a)},style:{width:"100%"},children:[!r.enumOptions.includes(s)&&s&&e.jsx("option",{value:s,children:s}),r.enumOptions.map((t=>e.jsx("option",{value:t,children:E(t)},t)))]})},i);if("combobox"===r.type&&r.editable&&(r.enumOptions||r.enumOptionsLoader))return e.jsx("td",{className:d,children:e.jsx(h,{value:s,options:r.enumOptions,optionsLoader:r.enumOptionsLoader,minChars:r.enumOptionsLoaderMinChars,maxResults:r.enumOptionsLoaderMaxResults,columnKey:r.key,item:t,actualIndex:a,onEnumChange:y,label:r.title?E(r.title):Array.isArray(r.key)?r.key[0]:r.key,t:E})},i);const m=()=>{if(r.badge&&r.colorMap){const t=r.colorMap[s];return e.jsx("span",{className:v.badge,style:t?{backgroundColor:t}:{backgroundColor:"#e0e0e0"},children:s})}return r.maxWidth&&s.length>0?e.jsx(n.Tooltip,{content:{children:s,style:{maxWidth:"600px",whiteSpace:"normal"}},relationship:"description",children:e.jsx("span",{children:s})}):s},f=()=>{if(!r.action)return null;const o=r.action,i=r.action.icon,l=e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(i,{}),className:v.actionIcon,onClick:e=>{e.stopPropagation(),o.onClick(t)},size:"small"});return o.tooltip?e.jsx(n.Tooltip,{content:E(o.tooltip),relationship:"label",children:l}):l};return e.jsx("td",{className:d,style:p?{backgroundColor:p}:void 0,onClick:x,children:r.action?e.jsxs("div",{className:v.cellWithAction,children:[r.action.iconLeft&&f(),e.jsx("span",{className:v.cellText,children:m()}),!r.action.iconLeft&&f()]}):m()},i)})),x&&(m||f)&&e.jsx("td",{className:`${v.td} ${v.actionsColumn}`,children:e.jsxs("div",{style:{display:"flex",gap:"4px",justifyContent:"center"},children:[m&&e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(r.Edit24Regular,{}),className:v.editButton,onClick:()=>m(t,a),title:E("Edit")}),f&&e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(r.Delete24Regular,{}),className:v.editButton,onClick:()=>f(t,a),title:E("Delete")})]})})]},Z(t,a))})),J<Y.length&&e.jsx("tr",{style:{height:G-Q-X.length*q+"px"},children:e.jsx("td",{colSpan:w.length+(x?1:0),style:{padding:0,border:"none"}})})]})]})}),e.jsx(n.Dialog,{open:I,onOpenChange:(e,t)=>O(t.open),children:e.jsx(n.DialogSurface,{children:e.jsxs(n.DialogBody,{children:[e.jsx(n.DialogTitle,{children:A.title}),e.jsx(n.DialogContent,{className:v.dialogContent,children:A.text})]})})})]}):e.jsx("div",{className:v.emptyState,children:E("No data to display")})};var m=t.memo(x);exports.ListView=x,exports.default=m;
@@ -1 +1 @@
1
- {"version":3,"file":"ListPage.d.ts","sourceRoot":"","sources":["../../../src/pages/ListPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAuB3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAuE3D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IACxB,+FAA+F;IAC/F,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;IACpD;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;IACxD,sGAAsG;IACtG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;CAClE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,eAAO,MAAM,QAAQ,wDAAyD,aAAa,4CAsnB1F,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"ListPage.d.ts","sourceRoot":"","sources":["../../../src/pages/ListPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAuB3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAuE3D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IACxB,+FAA+F;IAC/F,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;IACpD;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;IACxD,sGAAsG;IACtG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;CAClE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,eAAO,MAAM,QAAQ,wDAAyD,aAAa,4CAwnB1F,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react");require("../components/Markdown.js"),require("../components/Textarea.js"),require("../components/Button.js"),require("../components/CompoundButton.js");var r=require("@fluentui/react-components");require("../components/Spinner.js");var n=require("../components/TextHeader.js");require("../components/TypingIndicator.js"),require("../components/Dialog.js"),require("../components/ChatInput.js"),require("../components/CombinedPlaceholderDialog.js"),require("../components/ChatMessage.js"),require("../components/Header.js");var a=require("@fluentui/react-icons");require("../services/codicent.js");var s=require("../services/dataCache.js"),i=require("../utils/MessageContent.js");require("../node_modules/tinycolor2/esm/tinycolor.js"),require("../_virtual/index.js"),require("../config/index.js"),require("../utils/cacheManager.js"),require("../lib/wavtools/lib/wav_packer.js"),require("../lib/wavtools/lib/analysis/audio_analysis.js"),require("../lib/wavtools/lib/wav_stream_player.js"),require("../lib/wavtools/lib/wav_recorder.js");var o=require("../utils/excelExport.js");require("./AppFrame.js"),require("./Canvas.js"),require("./Chat.js"),require("./Compose.js"),require("./Snap.js"),require("./Search.js"),require("./Menu.js"),require("./Log.js"),require("./Login.js"),require("./Home.js"),require("./CrmPage.js"),require("./CrmPagePersistent.js"),require("./ImageView.js"),require("./FormInvite.js"),require("./FormAccept.js"),require("./Sales.js");var c=require("react-router-dom");require("./Purchase.js"),require("../components/Content.js");var l=require("../components/Page.js");require("./QrScan.js");var u=require("../hooks/useLocalization.js");require("../components/FileThumbnail.js"),require("react-dom/client"),require("../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js"),require("../hooks/useAppStyles.js");var d=require("../hooks/useUserRoles.js");require("../components/MessageInput.js"),require("../components/UploadFile.js"),require("../components/SnapFooter.js"),require("../components/Profile.js"),require("../components/MessageItem.js"),require("../components/AiInput.js");var p=require("../components/SearchBox.js");require("../components/DataMessagePicker.js"),require("../components/HtmlView.js"),require("../components/Footer.js"),require("../components/QrCodeDialog.js"),require("../components/QrScanner.js"),require("../components/OfflineMessage.js"),require("../components/LanguageSelector.js");var m=require("../components/ListView.js"),g=require("../components/RecordModal.js");require("../components/BulkUploadDialog.js"),require("../components/CookieBanner.js"),require("../components/audit/AuditCircularProgress.js"),require("../components/audit/AuditHorizontalProgress.js"),require("../components/audit/AuditRoleIndicator.js"),require("../components/audit/AuditUnitSwitcher.js"),require("../components/audit/AuditAnswerCell.js"),require("../components/audit/AuditSearchBar.js"),require("../components/audit/AuditFilterChips.js"),require("../components/audit/AuditFilterBar.js"),require("../components/audit/AuditGroupsProgress.js"),require("../components/audit/AuditSummaryDashboard.js"),require("../components/audit/AuditRequirementDialog.js"),require("../components/audit/AuditUnitExportDialog.js"),require("../components/audit/AuditUnitImportDialog.js"),require("../components/audit/AuditBulkExportDialog.js"),require("../components/audit/AuditBulkUploadDialog.js"),require("../components/audit/AuditSortPresets.js");var h=require("../node_modules/lodash/lodash.js");const f=r.makeStyles({container:{width:"100%",flex:1,maxWidth:"100%",height:"100%",minHeight:0,backgroundColor:"#ffffff",display:"flex",flexDirection:"column",margin:"0 auto",overflow:"hidden","@media (max-width: 768px)":{maxWidth:"100%",borderRadius:"0"},touchAction:"pan-y",paddingLeft:"16px",paddingRight:"16px"},listContainer:{position:"relative",overflow:"hidden",flex:1,minHeight:0,marginTop:"10px"},loadingIndicator:{padding:"8px 0",color:"#666"},headerRow:{display:"flex",justifyContent:"space-between",alignItems:"center",gap:"10px",flexWrap:"wrap"},buttonGroup:{display:"flex",gap:"8px",flexWrap:"wrap"},addButton:{minWidth:"auto",whiteSpace:"nowrap"},recordsCount:{fontSize:"14px",color:"#666",marginTop:"8px"},backButton:{marginBottom:"10px"},searchBox:{marginTop:"8px"},loadMoreContainer:{display:"flex",justifyContent:"center",padding:"16px 0",borderTop:"1px solid #e0e0e0",marginTop:"4px"}}),j=500,q=({state:q,getColumnDefs:x,getListConfig:C,filterData:S})=>{const[y,w]=c.useSearchParams(),A=y.get("tag")||"logbook",v=y.get("title")||"",k=y.get("contentTitle"),b="true"===y.get("loadAll"),D="true"===y.get("canAdd"),M="true"===y.get("canEdit"),I="false"!==y.get("canExport"),R=y.get("addUrl")||"",B=y.get("q")||"",E=k?`${A}-${B}-${k}`:`${A}-${B||"all"}`,$=s.dataCache.get(E),[P,_]=t.useState(B),[T,N]=t.useState(B),{service:L}=q,[U,F]=t.useState((()=>$??[])),[O,H]=t.useState((()=>!$)),[W,z]=t.useState((()=>!!$&&!b&&!k&&$.length>=j)),[V,G]=t.useState(!1),J=t.useRef(null),Q=t.useRef(B),K=t.useRef(""),X=t.useRef(0),Y=t.useRef(L);Y.current=L;const Z=!!L,[ee,te]=t.useState(0),[re,ne]=t.useState(null),ae=f(),{t:se}=u.default(),ie=c.useNavigate(),{getCurrentUserName:oe}=d.useUserRoles(L,q.context.nickname,q.context.selectedApp),ce=t.useMemo((()=>(k?[{key:k,title:k,maxWidth:250}]:C?C(A)?.columns??[]:x?x(A):[]).map((e=>({...e,title:e.title?se(e.title):void 0})))),[k,A,se,x,C]),[le,ue]=t.useState(!1),[de,pe]=t.useState(null),[me,ge]=t.useState(!1),[he,fe]=t.useState(null),je=t.useMemo((()=>`listpage_searches_${A}`),[A]),qe=e=>{try{const t=localStorage.getItem(e);return t?JSON.parse(t):[]}catch{return[]}},[xe,Ce]=t.useState((()=>qe(je)));t.useEffect((()=>{Ce(qe(je))}),[je]);const Se=t.useCallback((e=>{const t=e.trim();t&&Ce((e=>{const r=[t,...e.filter((e=>e!==t))].slice(0,20);try{localStorage.setItem(je,JSON.stringify(r))}catch{}return r}))}),[je]),ye=t.useCallback((e=>{Ce((t=>{const r=t.filter((t=>t!==e));try{localStorage.setItem(je,JSON.stringify(r))}catch{}return r}))}),[je]),we=t.useMemo((()=>h.lodashExports.debounce((e=>N(e)),500)),[N]);t.useEffect((()=>()=>{we.cancel()}),[we]);const Ae=t.useCallback((e=>{_(e),we(e)}),[we]),ve=t.useCallback((e=>{Se(e)}),[Se]);t.useEffect((()=>{if(!y.get("q")){const e=y.get(`filter_${A}`);if(e){let t=e;if("%USERNAME%"===t){const e=oe();if(!e)return;t=e}_(t),N(t),Q.current=t}}}),[A,y,oe]),t.useEffect((()=>{const e=y.get("q")||"";e!==Q.current&&e!==T&&(_(e),N(e),Q.current=e,K.current="")}),[y]),t.useEffect((()=>(J.current&&clearTimeout(J.current),J.current=setTimeout((()=>{if(Q.current!==P){const e=new URLSearchParams(y);P?e.set("q",P):e.delete("q"),w(e,{replace:!0}),Q.current=P}}),500),()=>{J.current&&clearTimeout(J.current)})),[P,y,w]),t.useEffect((()=>{if(!Y.current)return;const e=`${A}-${k}-${b}-${ee}-${T}`;if(e===K.current)return;K.current=e;const t=++X.current,r=()=>t===X.current,n=k?`${A}-${T}-${k}`:`${A}-${T||"all"}`,a=s.dataCache.get(n);if(!a){if(z(!1),H(!0),k)Y.current.getMessagesFast([A],T).then((e=>{if(!r())return;const t=e.map((e=>{const t=new Date(e.createdAt).toLocaleString();return{id:e.id,data:{[k]:new i.default(e.content).content,createdAt:t},fileId:null,fileIds:[],tags:[A],mentions:[Y.current.codicent],createdAt:t}}));s.dataCache.set(n,t),F(t)})).catch(console.warn).finally((()=>{r()&&H(!1)}));else{const e=T||"",t=b||e?void 0:j;Y.current.readDataMessages(A,e,void 0,0,t).then((t=>{r()&&(s.dataCache.set(n,t),F(t),z(!b&&!e&&t.length===j))})).catch(console.warn).finally((()=>{r()&&H(!1)}))}return()=>{K.current=""}}if(F(a),H(!1),z(!b&&!k&&a.length>=j),!k&&!T&&a.length>0){const e=a.reduce(((e,t)=>t.createdAt>e?t.createdAt:e),a[0].createdAt);Y.current.readDataMessages(A,"",void 0,void 0,void 0,e).then((e=>{r()&&F((t=>{const r=new Set(t.map((e=>e.id))),a=e.filter((e=>!r.has(e.id)));if(0===a.length)return t;const i=[...a,...t];return s.dataCache.set(n,i),i}))})).catch(console.warn)}}),[A,k,b,T,ee,Z]);const ke=t.useMemo((()=>{const e={};y.forEach(((t,r)=>{r.startsWith("filter_")&&(e[r.replace("filter_","")]=t)}));let t=U.map(((e,t)=>({item:e,index:t})));for(const[r,n]of Object.entries(e)){const e=n.replace("%USERNAME%",oe()),a=q.context.nickname||"";t=t.filter((({item:t})=>{const n=t.data[r];return null!=n&&(String(n).includes(e)||String(n).includes(a))}))}if(S){const e=S(t.map((({item:e})=>e)),A),r=new Set(e.map((e=>e.id)));t=t.filter((({item:e})=>r.has(e.id)))}const r=t.map((({item:e,index:t})=>({...e.data,createdAt:e.createdAt,_id:e.id,originalMessageId:e.originalMessageId||e.id,_fileIds:e.fileIds??[],_index:t}))),n=C?.(A)?.deduplicateBy;if(n){const e=Array.isArray(n)?n:[n],t=t=>{for(const r of e){const e=t[r];if(null!=e&&""!==String(e).trim())return String(e)}},a=new Set;return r.filter((e=>{const r=t(e);return void 0===r||!a.has(r)&&(a.add(r),!0)}))}return r}),[U,y,q.context.nickname,oe,S,A,C]),be=t.useMemo((()=>{const e=(P||"").trim().toLowerCase();if(!e)return ke;const t=ce.filter((e=>!e.hidden)).map((e=>e.key));return ke.filter((r=>{for(const n of t)if(Array.isArray(n))for(const t of n){const n=r[t];if(null!=n&&String(n).toLowerCase().includes(e))return!0}else{const t=r[n];if(null!=t&&String(t).toLowerCase().includes(e))return!0}return!1}))}),[ke,P,ce]),De=t.useCallback((()=>{s.dataCache.clearPattern(A),K.current="",te((e=>e+1))}),[A]),Me=t.useCallback((async()=>{G(!0);try{const e=await Y.current.readDataMessages(A,"",void 0,U.length,j),t=[...U,...e];F(t),s.dataCache.set(`${A}-all`,t),z(e.length===j)}catch(e){console.warn(e)}finally{G(!1)}}),[U,A]),Ie=t.useCallback((e=>{ne(e)}),[]),Re=()=>{ge(!1),fe(null)},Be=t.useCallback((async()=>{const e=`${A}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const t=null!==re?re:be;await o.exportToExcel(t,ce,e,se)||console.warn("No data to export")}),[re,be,ce,A,se]),Ee=t.useMemo((()=>null!==re?re.length:be.length),[re,be]);return e.jsx(l.Page,{hideHeader:!0,children:e.jsxs("div",{className:ae.container,children:[e.jsx("div",{className:ae.backButton,children:e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(a.ArrowLeft24Regular,{}),onClick:()=>ie(-1),children:se("Tillbaka")})}),e.jsxs("div",{className:ae.headerRow,children:[e.jsx(n.default,{title:se(v||"Loggbok")}),e.jsxs("div",{className:ae.buttonGroup,children:[e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(a.ArrowClockwise24Regular,{}),onClick:De,title:se("Refresh"),children:se("Refresh")}),I&&e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(a.ArrowDownload24Regular,{}),onClick:Be,title:se("Export to Excel"),children:se("Export to Excel")}),(D||R)&&e.jsx(r.Button,{appearance:"primary",icon:e.jsx(a.Add24Regular,{}),onClick:D?()=>{pe(null),ue(!0)}:()=>window.open(R,"_blank"),className:ae.addButton,children:se("Add Record")})]})]}),e.jsx("div",{className:ae.searchBox,children:e.jsx(p.default,{placeholder:se("Sök")+"...",value:P,onChange:Ae,recentSearches:xe,onCommitSearch:ve,onRemoveRecentSearch:ye})}),!O&&e.jsxs("div",{className:ae.recordsCount,children:[se("Total"),": ",Ee," ",se("records"),Ee!==U.length&&` (${se("filtered from")} ${U.length})`]}),e.jsxs("div",{className:ae.listContainer,children:[O&&U.length>0&&e.jsx("div",{className:ae.loadingIndicator,children:se("Söker")+"..."}),O&&0===U.length?e.jsx("p",{children:se("Söker")+"..."}):e.jsx(m.default,{data:be,columns:ce,canEdit:M,onEdit:(e,t)=>{const r=U[t];r&&(pe({data:{...r.data,_fileIds:r.fileIds??[]},index:t}),ue(!0))},onDelete:(e,t)=>{const r=U[t];r&&(fe({index:t,id:r.id}),ge(!0))},onToggleCheckbox:async(e,t,r,n)=>{const a=U[n];if(a){const e=Array.isArray(t)?t[0]:t,i={...a.data,[e]:String(r)},o=await L.updateDataMessage(a.id,i);F((e=>{const t=[...e];return t[n]={...a,id:o,data:i},t})),s.dataCache.clearPattern(A)}},onEnumChange:async(e,t,r,n)=>{const a=U[n];if(a){const e=Array.isArray(t)?t[0]:t,i={...a.data,[e]:r},o=await L.updateDataMessage(a.id,i);F((e=>{const t=[...e];return t[n]={...a,id:o,data:i},t})),s.dataCache.clearPattern(A)}},onFilteredDataChange:Ie})]}),W&&!P.trim()&&e.jsx("div",{className:ae.loadMoreContainer,children:e.jsx(r.Button,{appearance:"primary",size:"medium",onClick:Me,disabled:V,children:V?se("Laddar..."):se("Visa fler")+` (${U.length} ${se("laddade")})`})}),e.jsx(g.RecordModal,{open:le,onClose:()=>ue(!1),onSave:async e=>{const t=new Set(ce.filter((e=>"thumbnail"===e.type)).map((e=>Array.isArray(e.key)?e.key[0]:e.key)));if(de){const r=U[de.index];if(r){const n={};for(const r in e){if(t.has(r))continue;const a=e[r];n[r]=null==a?"":String(a)}const a=await L.updateDataMessage(r.id,n);F((e=>{const t=[...e];return t[de.index]={...r,id:a,data:n},t})),s.dataCache.clearPattern(A)}}else{const r={};for(const n in e){if(t.has(n))continue;const a=e[n];r[n]=null==a?"":String(a)}const n={id:await L.createDataMessage(A,r),data:r,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[A],mentions:[L.codicent]};F((e=>[n,...e])),s.dataCache.clearPattern(A)}},columns:ce,initialData:de?.data}),e.jsx(r.Dialog,{open:me,onOpenChange:(e,t)=>!t.open&&Re(),children:e.jsx(r.DialogSurface,{children:e.jsxs(r.DialogBody,{children:[e.jsx(r.DialogTitle,{children:se("Confirm Delete")}),e.jsx(r.DialogContent,{children:se("Are you sure you want to delete this record? This action cannot be undone.")}),e.jsxs(r.DialogActions,{children:[e.jsx(r.Button,{appearance:"secondary",onClick:Re,children:se("Cancel")}),e.jsx(r.Button,{appearance:"primary",onClick:async()=>{if(he)try{await L.deleteDataMessage(he.id),F((e=>e.filter(((e,t)=>t!==he.index)))),s.dataCache.clearPattern(A)}catch(e){console.error("Failed to delete record:",e)}finally{ge(!1),fe(null)}},children:se("Delete")})]})]})})})]})})};exports.ListPage=q,exports.default=q;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react");require("../components/Markdown.js"),require("../components/Textarea.js"),require("../components/Button.js"),require("../components/CompoundButton.js");var r=require("@fluentui/react-components");require("../components/Spinner.js");var a=require("../components/TextHeader.js");require("../components/TypingIndicator.js"),require("../components/Dialog.js"),require("../components/ChatInput.js"),require("../components/CombinedPlaceholderDialog.js"),require("../components/ChatMessage.js"),require("../components/Header.js");var n=require("@fluentui/react-icons");require("../services/codicent.js");var s=require("../services/dataCache.js"),i=require("../utils/MessageContent.js");require("../node_modules/tinycolor2/esm/tinycolor.js"),require("../_virtual/index.js"),require("../config/index.js"),require("../utils/cacheManager.js"),require("../lib/wavtools/lib/wav_packer.js"),require("../lib/wavtools/lib/analysis/audio_analysis.js"),require("../lib/wavtools/lib/wav_stream_player.js"),require("../lib/wavtools/lib/wav_recorder.js");var o=require("../utils/excelExport.js");require("./AppFrame.js"),require("./Canvas.js"),require("./Chat.js"),require("./Compose.js"),require("./Snap.js"),require("./Search.js"),require("./Menu.js"),require("./Log.js"),require("./Login.js"),require("./Home.js"),require("./CrmPage.js"),require("./CrmPagePersistent.js"),require("./ImageView.js"),require("./FormInvite.js"),require("./FormAccept.js"),require("./Sales.js");var c=require("react-router-dom");require("./Purchase.js"),require("../components/Content.js");var l=require("../components/Page.js");require("./QrScan.js");var u=require("../hooks/useLocalization.js");require("../components/FileThumbnail.js"),require("react-dom/client"),require("../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js"),require("../hooks/useAppStyles.js");var d=require("../hooks/useUserRoles.js");require("../components/MessageInput.js"),require("../components/UploadFile.js"),require("../components/SnapFooter.js"),require("../components/Profile.js"),require("../components/MessageItem.js"),require("../components/AiInput.js");var p=require("../components/SearchBox.js");require("../components/DataMessagePicker.js"),require("../components/HtmlView.js"),require("../components/Footer.js"),require("../components/QrCodeDialog.js"),require("../components/QrScanner.js"),require("../components/OfflineMessage.js"),require("../components/LanguageSelector.js");var m=require("../components/ListView.js"),g=require("../components/RecordModal.js");require("../components/BulkUploadDialog.js"),require("../components/CookieBanner.js"),require("../components/audit/AuditCircularProgress.js"),require("../components/audit/AuditHorizontalProgress.js"),require("../components/audit/AuditRoleIndicator.js"),require("../components/audit/AuditUnitSwitcher.js"),require("../components/audit/AuditAnswerCell.js"),require("../components/audit/AuditSearchBar.js"),require("../components/audit/AuditFilterChips.js"),require("../components/audit/AuditFilterBar.js"),require("../components/audit/AuditGroupsProgress.js"),require("../components/audit/AuditSummaryDashboard.js"),require("../components/audit/AuditRequirementDialog.js"),require("../components/audit/AuditUnitExportDialog.js"),require("../components/audit/AuditUnitImportDialog.js"),require("../components/audit/AuditBulkExportDialog.js"),require("../components/audit/AuditBulkUploadDialog.js"),require("../components/audit/AuditSortPresets.js");var h=require("../node_modules/lodash/lodash.js");const f=r.makeStyles({container:{width:"100%",flex:1,maxWidth:"100%",height:"100%",minHeight:0,backgroundColor:"#ffffff",display:"flex",flexDirection:"column",margin:"0 auto",overflow:"hidden","@media (max-width: 768px)":{maxWidth:"100%",borderRadius:"0"},touchAction:"pan-y",paddingLeft:"16px",paddingRight:"16px"},listContainer:{position:"relative",overflow:"hidden",flex:1,minHeight:0,marginTop:"10px"},loadingIndicator:{padding:"8px 0",color:"#666"},headerRow:{display:"flex",justifyContent:"space-between",alignItems:"center",gap:"10px",flexWrap:"wrap"},buttonGroup:{display:"flex",gap:"8px",flexWrap:"wrap"},addButton:{minWidth:"auto",whiteSpace:"nowrap"},recordsCount:{fontSize:"14px",color:"#666",marginTop:"8px"},backButton:{marginBottom:"10px"},searchBox:{marginTop:"8px"},loadMoreContainer:{display:"flex",justifyContent:"center",padding:"16px 0",borderTop:"1px solid #e0e0e0",marginTop:"4px"}}),j=500,q=({state:q,getColumnDefs:x,getListConfig:C,filterData:S})=>{const[y,w]=c.useSearchParams(),A=y.get("tag")||"logbook",v=y.get("title")||"",k=y.get("contentTitle"),b="true"===y.get("loadAll"),D="true"===y.get("canAdd"),M="true"===y.get("canEdit"),I="false"!==y.get("canExport"),R=y.has("compact"),B=y.get("addUrl")||"",E=y.get("q")||"",$=k?`${A}-${E}-${k}`:`${A}-${E||"all"}`,P=s.dataCache.get($),[_,T]=t.useState(E),[N,L]=t.useState(E),{service:U}=q,[F,O]=t.useState((()=>P??[])),[H,W]=t.useState((()=>!P)),[z,V]=t.useState((()=>!!P&&!b&&!k&&P.length>=j)),[G,J]=t.useState(!1),Q=t.useRef(null),K=t.useRef(E),X=t.useRef(""),Y=t.useRef(0),Z=t.useRef(U);Z.current=U;const ee=!!U,[te,re]=t.useState(0),[ae,ne]=t.useState(null),se=f(),{t:ie}=u.default(),oe=c.useNavigate(),{getCurrentUserName:ce}=d.useUserRoles(U,q.context.nickname,q.context.selectedApp),le=t.useMemo((()=>(k?[{key:k,title:k,maxWidth:250}]:C?C(A)?.columns??[]:x?x(A):[]).map((e=>({...e,title:e.title?ie(e.title):void 0})))),[k,A,ie,x,C]),[ue,de]=t.useState(!1),[pe,me]=t.useState(null),[ge,he]=t.useState(!1),[fe,je]=t.useState(null),qe=t.useMemo((()=>`listpage_searches_${A}`),[A]),xe=e=>{try{const t=localStorage.getItem(e);return t?JSON.parse(t):[]}catch{return[]}},[Ce,Se]=t.useState((()=>xe(qe)));t.useEffect((()=>{Se(xe(qe))}),[qe]);const ye=t.useCallback((e=>{const t=e.trim();t&&Se((e=>{const r=[t,...e.filter((e=>e!==t))].slice(0,20);try{localStorage.setItem(qe,JSON.stringify(r))}catch{}return r}))}),[qe]),we=t.useCallback((e=>{Se((t=>{const r=t.filter((t=>t!==e));try{localStorage.setItem(qe,JSON.stringify(r))}catch{}return r}))}),[qe]),Ae=t.useMemo((()=>h.lodashExports.debounce((e=>L(e)),500)),[L]);t.useEffect((()=>()=>{Ae.cancel()}),[Ae]);const ve=t.useCallback((e=>{T(e),Ae(e)}),[Ae]),ke=t.useCallback((e=>{ye(e)}),[ye]);t.useEffect((()=>{if(!y.get("q")){const e=y.get(`filter_${A}`);if(e){let t=e;if("%USERNAME%"===t){const e=ce();if(!e)return;t=e}T(t),L(t),K.current=t}}}),[A,y,ce]),t.useEffect((()=>{const e=y.get("q")||"";e!==K.current&&e!==N&&(T(e),L(e),K.current=e,X.current="")}),[y]),t.useEffect((()=>(Q.current&&clearTimeout(Q.current),Q.current=setTimeout((()=>{if(K.current!==_){const e=new URLSearchParams(y);_?e.set("q",_):e.delete("q"),w(e,{replace:!0}),K.current=_}}),500),()=>{Q.current&&clearTimeout(Q.current)})),[_,y,w]),t.useEffect((()=>{if(!Z.current)return;const e=`${A}-${k}-${b}-${te}-${N}`;if(e===X.current)return;X.current=e;const t=++Y.current,r=()=>t===Y.current,a=k?`${A}-${N}-${k}`:`${A}-${N||"all"}`,n=s.dataCache.get(a);if(!n){if(V(!1),W(!0),k)Z.current.getMessagesFast([A],N).then((e=>{if(!r())return;const t=e.map((e=>{const t=new Date(e.createdAt).toLocaleString();return{id:e.id,data:{[k]:new i.default(e.content).content,createdAt:t},fileId:null,fileIds:[],tags:[A],mentions:[Z.current.codicent],createdAt:t}}));s.dataCache.set(a,t),O(t)})).catch(console.warn).finally((()=>{r()&&W(!1)}));else{const e=N||"",t=b||e?void 0:j;Z.current.readDataMessages(A,e,void 0,0,t).then((t=>{r()&&(s.dataCache.set(a,t),O(t),V(!b&&!e&&t.length===j))})).catch(console.warn).finally((()=>{r()&&W(!1)}))}return()=>{X.current=""}}if(O(n),W(!1),V(!b&&!k&&n.length>=j),!k&&!N&&n.length>0){const e=n.reduce(((e,t)=>t.createdAt>e?t.createdAt:e),n[0].createdAt);Z.current.readDataMessages(A,"",void 0,void 0,void 0,e).then((e=>{r()&&O((t=>{const r=new Set(t.map((e=>e.id))),n=e.filter((e=>!r.has(e.id)));if(0===n.length)return t;const i=[...n,...t];return s.dataCache.set(a,i),i}))})).catch(console.warn)}}),[A,k,b,N,te,ee]);const be=t.useMemo((()=>{const e={};y.forEach(((t,r)=>{r.startsWith("filter_")&&(e[r.replace("filter_","")]=t)}));let t=F.map(((e,t)=>({item:e,index:t})));for(const[r,a]of Object.entries(e)){const e=a.replace("%USERNAME%",ce()),n=q.context.nickname||"";t=t.filter((({item:t})=>{const a=t.data[r];return null!=a&&(String(a).includes(e)||String(a).includes(n))}))}if(S){const e=S(t.map((({item:e})=>e)),A),r=new Set(e.map((e=>e.id)));t=t.filter((({item:e})=>r.has(e.id)))}const r=t.map((({item:e,index:t})=>({...e.data,createdAt:e.createdAt,_id:e.id,originalMessageId:e.originalMessageId||e.id,_fileIds:e.fileIds??[],_index:t}))),a=C?.(A)?.deduplicateBy;if(a){const e=Array.isArray(a)?a:[a],t=t=>{for(const r of e){const e=t[r];if(null!=e&&""!==String(e).trim())return String(e)}},n=new Set;return r.filter((e=>{const r=t(e);return void 0===r||!n.has(r)&&(n.add(r),!0)}))}return r}),[F,y,q.context.nickname,ce,S,A,C]),De=t.useMemo((()=>{const e=(_||"").trim().toLowerCase();if(!e)return be;const t=le.filter((e=>!e.hidden)).map((e=>e.key));return be.filter((r=>{for(const a of t)if(Array.isArray(a))for(const t of a){const a=r[t];if(null!=a&&String(a).toLowerCase().includes(e))return!0}else{const t=r[a];if(null!=t&&String(t).toLowerCase().includes(e))return!0}return!1}))}),[be,_,le]),Me=t.useCallback((()=>{s.dataCache.clearPattern(A),X.current="",re((e=>e+1))}),[A]),Ie=t.useCallback((async()=>{J(!0);try{const e=await Z.current.readDataMessages(A,"",void 0,F.length,j),t=[...F,...e];O(t),s.dataCache.set(`${A}-all`,t),V(e.length===j)}catch(e){console.warn(e)}finally{J(!1)}}),[F,A]),Re=t.useCallback((e=>{ne(e)}),[]),Be=()=>{he(!1),je(null)},Ee=t.useCallback((async()=>{const e=`${A}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const t=null!==ae?ae:De;await o.exportToExcel(t,le,e,ie)||console.warn("No data to export")}),[ae,De,le,A,ie]),$e=t.useMemo((()=>null!==ae?ae.length:De.length),[ae,De]);return e.jsx(l.Page,{hideHeader:!0,children:e.jsxs("div",{className:se.container,children:[e.jsx("div",{className:se.backButton,children:e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowLeft24Regular,{}),onClick:()=>oe(-1),children:ie("Tillbaka")})}),e.jsxs("div",{className:se.headerRow,children:[e.jsx(a.default,{title:ie(v||"Loggbok")}),e.jsxs("div",{className:se.buttonGroup,children:[e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowClockwise24Regular,{}),onClick:Me,title:ie("Refresh"),children:ie("Refresh")}),I&&e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowDownload24Regular,{}),onClick:Ee,title:ie("Export to Excel"),children:ie("Export to Excel")}),(D||B)&&e.jsx(r.Button,{appearance:"primary",icon:e.jsx(n.Add24Regular,{}),onClick:D?()=>{me(null),de(!0)}:()=>window.open(B,"_blank"),className:se.addButton,children:ie("Add Record")})]})]}),e.jsx("div",{className:se.searchBox,children:e.jsx(p.default,{placeholder:ie("Sök")+"...",value:_,onChange:ve,recentSearches:Ce,onCommitSearch:ke,onRemoveRecentSearch:we})}),!H&&e.jsxs("div",{className:se.recordsCount,children:[ie("Total"),": ",$e," ",ie("records"),$e!==F.length&&` (${ie("filtered from")} ${F.length})`]}),e.jsxs("div",{className:se.listContainer,children:[H&&F.length>0&&e.jsx("div",{className:se.loadingIndicator,children:ie("Söker")+"..."}),H&&0===F.length?e.jsx("p",{children:ie("Söker")+"..."}):e.jsx(m.default,{data:De,columns:le,canEdit:M,onEdit:(e,t)=>{const r=F[t];r&&(me({data:{...r.data,_fileIds:r.fileIds??[]},index:t}),de(!0))},onDelete:(e,t)=>{const r=F[t];r&&(je({index:t,id:r.id}),he(!0))},onToggleCheckbox:async(e,t,r,a)=>{const n=F[a];if(n){const e=Array.isArray(t)?t[0]:t,i={...n.data,[e]:String(r)},o=await U.updateDataMessage(n.id,i);O((e=>{const t=[...e];return t[a]={...n,id:o,data:i},t})),s.dataCache.clearPattern(A)}},onEnumChange:async(e,t,r,a)=>{const n=F[a];if(n){const e=Array.isArray(t)?t[0]:t,i={...n.data,[e]:r},o=await U.updateDataMessage(n.id,i);O((e=>{const t=[...e];return t[a]={...n,id:o,data:i},t})),s.dataCache.clearPattern(A)}},onFilteredDataChange:Re,compact:R})]}),z&&!_.trim()&&e.jsx("div",{className:se.loadMoreContainer,children:e.jsx(r.Button,{appearance:"primary",size:"medium",onClick:Ie,disabled:G,children:G?ie("Laddar..."):ie("Visa fler")+` (${F.length} ${ie("laddade")})`})}),e.jsx(g.RecordModal,{open:ue,onClose:()=>de(!1),onSave:async e=>{const t=new Set(le.filter((e=>"thumbnail"===e.type)).map((e=>Array.isArray(e.key)?e.key[0]:e.key)));if(pe){const r=F[pe.index];if(r){const a={};for(const r in e){if(t.has(r))continue;const n=e[r];a[r]=null==n?"":String(n)}const n=await U.updateDataMessage(r.id,a);O((e=>{const t=[...e];return t[pe.index]={...r,id:n,data:a},t})),s.dataCache.clearPattern(A)}}else{const r={};for(const a in e){if(t.has(a))continue;const n=e[a];r[a]=null==n?"":String(n)}const a={id:await U.createDataMessage(A,r),data:r,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[A],mentions:[U.codicent]};O((e=>[a,...e])),s.dataCache.clearPattern(A)}},columns:le,initialData:pe?.data}),e.jsx(r.Dialog,{open:ge,onOpenChange:(e,t)=>!t.open&&Be(),children:e.jsx(r.DialogSurface,{children:e.jsxs(r.DialogBody,{children:[e.jsx(r.DialogTitle,{children:ie("Confirm Delete")}),e.jsx(r.DialogContent,{children:ie("Are you sure you want to delete this record? This action cannot be undone.")}),e.jsxs(r.DialogActions,{children:[e.jsx(r.Button,{appearance:"secondary",onClick:Be,children:ie("Cancel")}),e.jsx(r.Button,{appearance:"primary",onClick:async()=>{if(fe)try{await U.deleteDataMessage(fe.id),O((e=>e.filter(((e,t)=>t!==fe.index)))),s.dataCache.clearPattern(A)}catch(e){console.error("Failed to delete record:",e)}finally{he(!1),je(null)}},children:ie("Delete")})]})]})})})]})})};exports.ListPage=q,exports.default=q;
@@ -35,6 +35,14 @@ export interface ColumnDefinition {
35
35
  action?: ColumnAction;
36
36
  /** Optional formatter function to transform the cell value for display. Receives the raw value and returns the formatted string. */
37
37
  format?: (value: unknown) => string;
38
+ /** Maps a display value to a CSS background color (e.g. { "Active": "#c6efce" }). */
39
+ colorMap?: Record<string, string>;
40
+ /** When "row", the colorMap colors the entire row based on this column's value. Default is "cell". */
41
+ colorScope?: "row" | "cell";
42
+ /** When true, renders the value as a colored badge/pill using colorMap. */
43
+ badge?: boolean;
44
+ /** Dynamic color function — receives the raw value and full row data. Takes precedence over colorMap. */
45
+ colorFn?: (value: unknown, row: Record<string, unknown>) => string | undefined;
38
46
  }
39
47
  export interface ListViewProps {
40
48
  data: Record<string, unknown>[];
@@ -45,6 +53,10 @@ export interface ListViewProps {
45
53
  onToggleCheckbox?: (item: Record<string, unknown>, key: string | string[], newValue: boolean, index: number) => void;
46
54
  onEnumChange?: (item: Record<string, unknown>, key: string | string[], newValue: string, index: number) => void;
47
55
  onFilteredDataChange?: (filteredData: Record<string, unknown>[]) => void;
56
+ /** Callback to compute a CSS background color for an entire row. Takes precedence over column colorScope:"row". */
57
+ rowColor?: (row: Record<string, unknown>) => string | undefined;
58
+ /** Reduces row height to 36px and cell padding for a denser, Excel-like view. Activated via ?compact in the URL. */
59
+ compact?: boolean;
48
60
  }
49
61
  export declare const ListView: React.FC<ListViewProps>;
50
62
  declare const _default: React.NamedExoticComponent<ListViewProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"ListView.d.ts","sourceRoot":"","sources":["../../../src/components/ListView.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAmB5D,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,kHAAkH;IAClH,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;IAC1B,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACpD,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAgOD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IACxF,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,2HAA2H;IAC3H,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,wFAAwF;IACxF,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,kFAAkF;IAClF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gHAAgH;IAChH,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,2HAA2H;IAC3H,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,oIAAoI;IACpI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChH,oBAAoB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;CAC1E;AAmJD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAkkB5C,CAAC;;AAGF,wBAAoC"}
1
+ {"version":3,"file":"ListView.d.ts","sourceRoot":"","sources":["../../../src/components/ListView.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAmB5D,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,kHAAkH;IAClH,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;IAC1B,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACpD,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA4OD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IACxF,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,2HAA2H;IAC3H,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,wFAAwF;IACxF,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,kFAAkF;IAClF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gHAAgH;IAChH,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,2HAA2H;IAC3H,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,oIAAoI;IACpI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACpC,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,sGAAsG;IACtG,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yGAAyG;IACzG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;CAChF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChH,oBAAoB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;IACzE,mHAAmH;IACnH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;IAChE,oHAAoH;IACpH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAmJD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAknB5C,CAAC;;AAGF,wBAAoC"}
@@ -1 +1 @@
1
- import{jsx as e,jsxs as t,Fragment as n}from"react/jsx-runtime";import r,{useMemo as i,useState as l,useEffect as o}from"react";import{makeStyles as a,Select as c,Button as s,Checkbox as d,Dialog as p,DialogSurface as u,DialogBody as h,DialogTitle as m,DialogContent as f,Combobox as g,Option as x,Tooltip as y}from"@fluentui/react-components";import{Edit24Regular as b,Delete24Regular as w,Attach24Regular as v}from"@fluentui/react-icons";import{CodicentService as C}from"../services/codicent.js";import k from"../hooks/useLocalization.js";const S=a({container:{width:"100%",overflowX:"auto",userSelect:"text"},table:{width:"100%",borderCollapse:"collapse",backgroundColor:"#ffffff",fontSize:"14px",tableLayout:"fixed",userSelect:"text"},th:{textAlign:"left",padding:"12px 8px",borderBottom:"2px solid #e0e0e0",fontWeight:"600",backgroundColor:"#f5f5f5",position:"sticky",top:0,zIndex:1,cursor:"pointer",userSelect:"none","&:hover":{backgroundColor:"#e8e8e8"}},td:{padding:"12px 8px",borderBottom:"1px solid #e0e0e0",verticalAlign:"top",wordWrap:"break-word",overflow:"hidden",userSelect:"text"},tdTruncated:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap","@media (hover: none)":{cursor:"pointer"}},tr:{height:"57px","&:hover":{backgroundColor:"#f9f9f9"}},emptyState:{padding:"20px",textAlign:"center",color:"#666"},sortIndicator:{marginLeft:"4px",fontSize:"10px"},hideOnMobile:{"@media (max-width: 768px)":{display:"none"}},dialogContent:{wordWrap:"break-word",whiteSpace:"pre-wrap",maxHeight:"60vh",overflowY:"auto"},thumbnail:{maxWidth:"50px",maxHeight:"50px",objectFit:"cover"},tooltip:{maxWidth:"600px",whiteSpace:"normal",wordWrap:"break-word"},editButton:{minWidth:"auto",padding:"4px 8px"},actionsColumn:{width:"100px",textAlign:"center"},filterInput:{width:"100%",padding:"4px 8px",fontSize:"14px",border:"1px solid #e0e0e0",borderRadius:"4px",paddingRight:"28px"},filterWrapper:{position:"relative"},clearFilterButton:{position:"absolute",right:"6px",top:"50%",transform:"translateY(-50%)",minWidth:"auto",height:"20px",padding:"0 6px",lineHeight:"18px"},filterToolbar:{display:"flex",justifyContent:"flex-end",padding:"8px",gap:"8px"},cellWithAction:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"4px"},actionIcon:{minWidth:"auto",padding:"2px",marginLeft:"4px",flexShrink:0,cursor:"pointer",opacity:.7,"&:hover":{opacity:1}},thumbnailRow:{display:"flex",gap:"4px",flexWrap:"wrap"},cellText:{flex:1,overflow:"hidden",textOverflow:"ellipsis"}}),N=e=>{if(/^\d{4}-\d{2}-\d{2}/.test(e)){const t=new Date(e);if(!isNaN(t.getTime()))return t.getTime()}const t=e.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})/);if(t){const e=parseInt(t[1],10),n=parseInt(t[2],10)-1,r=parseInt(t[3],10),i=new Date(r,n,e);if(i.getFullYear()===r&&i.getMonth()===n&&i.getDate()===e)return i.getTime()}return null},W=e=>{const t=e.trim().replace(/[\s\u00a0]/g,"");if(""===t||"-"===t)return null;const n=(t.match(/,/g)||[]).length,r=(t.match(/\./g)||[]).length;let i;i=1===n&&0===r?/,\d{1,2}$/.test(t)?t.replace(/,\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/,/g,""):1===r&&0===n?/\.\d{1,2}$/.test(t)?t.replace(/\.\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/\./g,""):t.replace(/[,.]/g,"");const l=Number(i);return""!==i&&isFinite(l)?l:null},I=(e,t)=>{if("string"==typeof t)return e[t];for(const n of t)if(void 0!==e[n])return e[n]},$=new Set,A=a({img:{maxWidth:"40px",maxHeight:"40px",objectFit:"cover",borderRadius:"3px",display:"block"},fileIcon:{width:"24px",height:"24px",verticalAlign:"middle"}}),O=({fileId:t})=>{const[n,r]=l((()=>!$.has(t))),i=A();return e("a",{href:C.getFileUrl(t),target:"_blank",rel:"noopener noreferrer",children:n?e("img",{src:C.getImageUrl(t,40),alt:"",className:i.img,onError:()=>{$.add(t),r(!1)}}):e(v,{className:i.fileIcon})})},L=({value:t,options:n,optionsLoader:a,minChars:c=2,maxResults:s=50,columnKey:d,item:p,actualIndex:u,onEnumChange:h,label:m,t:f})=>{const[y,b]=l(t),[w,v]=l([]),[C,k]=l(!1),S=r.useRef(null);o((()=>{b(t)}),[t]),o((()=>{if(a){if(!(y.length<c))return S.current&&clearTimeout(S.current),S.current=setTimeout((async()=>{k(!0);try{const e=await a(y);v(e.slice(0,s))}finally{k(!1)}}),250),()=>{S.current&&clearTimeout(S.current)};v([])}}),[y,a,c,s]);const N=i((()=>(n??[]).filter((e=>e.toLowerCase().includes(y.toLowerCase()))).slice(0,s)),[n,y,s]),W=a?w:N;return e(g,{value:y,freeform:!0,"aria-label":m,placeholder:C?f("Loading..."):a&&y.length<c?f(`Type ${c}+ characters to search...`):void 0,onChange:e=>b(e.target.value),onOptionSelect:(e,t)=>{t.optionValue&&(b(t.optionValue),h&&h(p,d,t.optionValue,u))},onBlur:()=>{h&&h(p,d,y,u)},style:{width:"100%"},children:W.map((t=>e(x,{value:t,children:t},t)))})},M=({data:a,columns:g,canEdit:x,onEdit:v,onDelete:$,onToggleCheckbox:A,onEnumChange:M,onFilteredDataChange:T})=>{const j=S(),{visibleColumns:F,defaultSortIndex:R,defaultSortDirection:D}=i((()=>{const e=a&&a.length>0?Array.from(new Set(a.flatMap((e=>Object.keys(e))))):[],t=(g||e.map((e=>({key:e})))).filter((e=>!e.hidden)),n=t.findIndex((e=>e.defaultSort));return{visibleColumns:t,defaultSortIndex:n,defaultSortDirection:n>=0&&t[n].defaultSort||null}}),[a,g]),[B,E]=l(R>=0?R:null),[z,H]=l(D),[_,P]=l(!1),[Y,U]=l({title:"",text:""}),[V,K]=l({}),[q,J]=l(0),X=r.useRef(null),{t:G}=k();r.useEffect((()=>()=>{null!==X.current&&cancelAnimationFrame(X.current)}),[]);const Q=e=>e.title?G(e.title):Array.isArray(e.key)?e.key[0]:e.key,Z=e=>{const t=[];return e.hideOnMobile&&t.push(j.hideOnMobile),t.join(" ")},ee=(e,t)=>{K((n=>{const r={...n};return""===t.trim()?delete r[e]:r[e]=t,r}))},te=e=>null==e||"string"==typeof e&&e.startsWith("[")&&e.endsWith("]")?"":"object"==typeof e?JSON.stringify(e):String(e),ne=i((()=>{const e=[...a];if(null!==B&&z){const t=F[B];e.sort(((e,n)=>{const r=I(e,t.key),i=I(n,t.key);if(null==r)return 1;if(null==i)return-1;let l=0;if("string"==typeof r&&"string"==typeof i){const e=N(r),t=N(i);if(null!==e&&null!==t)l=e-t;else{const e=W(r),t=W(i);l=null!==e&&null!==t?e-t:r.localeCompare(i)}}else if("number"==typeof r&&"number"==typeof i)l=r-i;else{const e=W(String(r)),t=W(String(i));l=null!==e&&null!==t?e-t:String(r).localeCompare(String(i))}return"asc"===z?l:-l}))}return e}),[a,B,z,F]),re=i((()=>ne.filter((e=>{for(const[t,n]of Object.entries(V)){const r=parseInt(t),i=F[r],l=I(e,i.key),o=te(l).toLowerCase(),a=n.toLowerCase();if(!("enum"===i.type&&i.enumOptions?o===a:o.includes(a)))return!1}return!0}))),[ne,V,F]);o((()=>{T&&T(re)}),[re,T]);const ie="undefined"!=typeof window?window.innerHeight-250:600,le=Math.max(0,Math.floor(q/57)-5),oe=Math.min(re.length,Math.ceil((q+ie)/57)+5),ae=re.slice(le,oe),ce=57*re.length,se=57*le,de=(e,t)=>{if(void 0!==e.id)return String(e.id);if(void 0!==e._id)return String(e._id);if(void 0!==e.originalMessageId)return String(e.originalMessageId);return`row-${t}-${(e=>{let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return Math.abs(t)})(F.slice(0,3).map((t=>String(I(e,t.key)??""))).join("-"))}`};return a&&0!==a.length?t(n,{children:[e("div",{className:j.container,onScroll:e=>{const t=e.currentTarget.scrollTop;null!==X.current&&cancelAnimationFrame(X.current),X.current=requestAnimationFrame((()=>{J(t),X.current=null}))},style:{maxHeight:"calc(100vh - 200px)",overflowY:"auto"},children:t("table",{className:j.table,children:[t("thead",{children:[t("tr",{children:[F.map(((n,r)=>{const i=n.maxWidth?{width:`${n.maxWidth}px`,maxWidth:`${n.maxWidth}px`}:{};return t("th",{className:`${j.th} ${Z(n)}`.trim(),style:i,onClick:()=>(e=>{B===e?"asc"===z?H("desc"):"desc"===z&&(E(null),H(null)):(E(e),H("asc"))})(r),children:[Q(n),B===r&&e("span",{className:j.sortIndicator,children:"asc"===z?"▲":"▼"})]},r)})),x&&e("th",{className:`${j.th} ${j.actionsColumn}`,style:{width:"100px"},children:G("Actions")})]}),t("tr",{children:[F.map(((r,i)=>{const l=r.maxWidth?{width:`${r.maxWidth}px`,maxWidth:`${r.maxWidth}px`}:{};return e("th",{className:Z(r),style:l,children:r.filterable&&e("div",{className:j.filterWrapper,children:"enum"===r.type&&r.enumOptions?t(c,{className:j.filterInput,value:V[i]||"",onChange:(e,t)=>ee(i,t.value),onClick:e=>e.stopPropagation(),children:[e("option",{value:"",children:G("All")}),r.enumOptions.filter((e=>""!==e)).map((t=>e("option",{value:t,children:G(t)},t)))]}):t(n,{children:[e("input",{type:"text",className:j.filterInput,placeholder:G("Filter")+"...",value:V[i]||"",onChange:e=>ee(i,e.target.value),onClick:e=>e.stopPropagation()}),(V[i]||"").length>0&&e(s,{appearance:"subtle",className:j.clearFilterButton,onClick:e=>{e.stopPropagation(),(e=>{K((t=>{const n={...t};return delete n[e],n}))})(i)},children:"×"})]})})},i)})),x&&e("th",{className:j.actionsColumn})]})]}),t("tbody",{children:[le>0&&e("tr",{style:{height:`${se}px`},children:e("td",{colSpan:F.length+(x?1:0),style:{padding:0,border:"none"}})}),ae.map(((n,r)=>{const i=n._index,l="number"==typeof i?i:le+r;return t("tr",{className:j.tr,children:[F.map(((r,i)=>{const o=I(n,r.key),a=r.format?r.format(o):te(o),p=r.maxWidth?`${j.td} ${j.tdTruncated} ${Z(r)}`.trim():`${j.td} ${Z(r)}`.trim(),u=()=>{window.matchMedia("(hover: hover)").matches||r.maxWidth&&a.length>0&&(U({title:Q(r),text:a}),P(!0))};if("thumbnail"===r.type){const t=Array.isArray(o)?o:[];return e("td",{className:p,children:e("div",{className:j.thumbnailRow,children:t.map((t=>e(O,{fileId:t},t)))})},i)}if("file"===r.type&&a)return e("td",{className:p,onClick:u,children:e("a",{href:C.getFileUrl(a),target:"_blank",rel:"noopener noreferrer",children:G("Download")})},i);if("checkbox"===r.type){return e("td",{className:p,children:e(d,{checked:!0===o||"true"===o||"yes"===o||"1"===o,onChange:(e,t)=>{A&&A(n,r.key,!0===t.checked,l)}})},i)}if("enum"===r.type&&r.enumOptions&&r.editable)return e("td",{className:p,children:t(c,{value:a,"aria-label":r.title?G(r.title):Array.isArray(r.key)?r.key[0]:r.key,onChange:(e,t)=>{M&&M(n,r.key,t.value,l)},style:{width:"100%"},children:[!r.enumOptions.includes(a)&&a&&e("option",{value:a,children:a}),r.enumOptions.map((t=>e("option",{value:t,children:G(t)},t)))]})},i);if("combobox"===r.type&&r.editable&&(r.enumOptions||r.enumOptionsLoader))return e("td",{className:p,children:e(L,{value:a,options:r.enumOptions,optionsLoader:r.enumOptionsLoader,minChars:r.enumOptionsLoaderMinChars,maxResults:r.enumOptionsLoaderMaxResults,columnKey:r.key,item:n,actualIndex:l,onEnumChange:M,label:r.title?G(r.title):Array.isArray(r.key)?r.key[0]:r.key,t:G})},i);const h=()=>r.maxWidth&&a.length>0?e(y,{content:{children:a,style:{maxWidth:"600px",whiteSpace:"normal"}},relationship:"description",children:e("span",{children:a})}):a,m=()=>{if(!r.action)return null;const t=r.action,i=r.action.icon,l=e(s,{appearance:"subtle",icon:e(i,{}),className:j.actionIcon,onClick:e=>{e.stopPropagation(),t.onClick(n)},size:"small"});return t.tooltip?e(y,{content:G(t.tooltip),relationship:"label",children:l}):l};return e("td",{className:p,onClick:u,children:r.action?t("div",{className:j.cellWithAction,children:[r.action.iconLeft&&m(),e("span",{className:j.cellText,children:h()}),!r.action.iconLeft&&m()]}):h()},i)})),x&&(v||$)&&e("td",{className:`${j.td} ${j.actionsColumn}`,children:t("div",{style:{display:"flex",gap:"4px",justifyContent:"center"},children:[v&&e(s,{appearance:"subtle",icon:e(b,{}),className:j.editButton,onClick:()=>v(n,l),title:G("Edit")}),$&&e(s,{appearance:"subtle",icon:e(w,{}),className:j.editButton,onClick:()=>$(n,l),title:G("Delete")})]})})]},de(n,l))})),oe<re.length&&e("tr",{style:{height:ce-se-57*ae.length+"px"},children:e("td",{colSpan:F.length+(x?1:0),style:{padding:0,border:"none"}})})]})]})}),e(p,{open:_,onOpenChange:(e,t)=>P(t.open),children:e(u,{children:t(h,{children:[e(m,{children:Y.title}),e(f,{className:j.dialogContent,children:Y.text})]})})})]}):e("div",{className:j.emptyState,children:G("No data to display")})};var T=r.memo(M);export{M as ListView,T as default};
1
+ import{jsx as e,jsxs as t,Fragment as n}from"react/jsx-runtime";import r,{useMemo as o,useState as i,useEffect as l}from"react";import{makeStyles as a,Select as c,Button as s,Checkbox as d,Dialog as p,DialogSurface as u,DialogBody as h,DialogTitle as m,DialogContent as f,Combobox as g,Option as x,Tooltip as y}from"@fluentui/react-components";import{Edit24Regular as b,Delete24Regular as w,Attach24Regular as C}from"@fluentui/react-icons";import{CodicentService as k}from"../services/codicent.js";import v from"../hooks/useLocalization.js";const S=a({container:{width:"100%",overflowX:"auto",userSelect:"text"},table:{width:"100%",borderCollapse:"collapse",backgroundColor:"#ffffff",fontSize:"14px",tableLayout:"fixed",userSelect:"text"},th:{textAlign:"left",padding:"12px 8px",borderBottom:"2px solid #e0e0e0",fontWeight:"600",backgroundColor:"#f5f5f5",position:"sticky",top:0,zIndex:1,cursor:"pointer",userSelect:"none","&:hover":{backgroundColor:"#e8e8e8"}},td:{padding:"12px 8px",borderBottom:"1px solid #e0e0e0",verticalAlign:"top",wordWrap:"break-word",overflow:"hidden",userSelect:"text"},tdTruncated:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap","@media (hover: none)":{cursor:"pointer"}},tr:{height:"57px","&:hover":{backgroundColor:"#f9f9f9"}},emptyState:{padding:"20px",textAlign:"center",color:"#666"},sortIndicator:{marginLeft:"4px",fontSize:"10px"},hideOnMobile:{"@media (max-width: 768px)":{display:"none"}},dialogContent:{wordWrap:"break-word",whiteSpace:"pre-wrap",maxHeight:"60vh",overflowY:"auto"},thumbnail:{maxWidth:"50px",maxHeight:"50px",objectFit:"cover"},tooltip:{maxWidth:"600px",whiteSpace:"normal",wordWrap:"break-word"},editButton:{minWidth:"auto",padding:"4px 8px"},actionsColumn:{width:"100px",textAlign:"center"},filterInput:{width:"100%",padding:"4px 8px",fontSize:"14px",border:"1px solid #e0e0e0",borderRadius:"4px",paddingRight:"28px"},filterWrapper:{position:"relative"},clearFilterButton:{position:"absolute",right:"6px",top:"50%",transform:"translateY(-50%)",minWidth:"auto",height:"20px",padding:"0 6px",lineHeight:"18px"},filterToolbar:{display:"flex",justifyContent:"flex-end",padding:"8px",gap:"8px"},cellWithAction:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"4px"},actionIcon:{minWidth:"auto",padding:"2px",marginLeft:"4px",flexShrink:0,cursor:"pointer",opacity:.7,"&:hover":{opacity:1}},thumbnailRow:{display:"flex",gap:"4px",flexWrap:"wrap"},cellText:{flex:1,overflow:"hidden",textOverflow:"ellipsis"},badge:{borderRadius:"12px",padding:"2px 8px",fontSize:"12px",fontWeight:"600",display:"inline-block",whiteSpace:"nowrap"},tdCompact:{paddingTop:"4px",paddingBottom:"4px"}}),N=e=>{if(/^\d{4}-\d{2}-\d{2}/.test(e)){const t=new Date(e);if(!isNaN(t.getTime()))return t.getTime()}const t=e.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})/);if(t){const e=parseInt(t[1],10),n=parseInt(t[2],10)-1,r=parseInt(t[3],10),o=new Date(r,n,e);if(o.getFullYear()===r&&o.getMonth()===n&&o.getDate()===e)return o.getTime()}return null},W=e=>{const t=e.trim().replace(/[\s\u00a0]/g,"");if(""===t||"-"===t)return null;const n=(t.match(/,/g)||[]).length,r=(t.match(/\./g)||[]).length;let o;o=1===n&&0===r?/,\d{1,2}$/.test(t)?t.replace(/,\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/,/g,""):1===r&&0===n?/\.\d{1,2}$/.test(t)?t.replace(/\.\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/\./g,""):t.replace(/[,.]/g,"");const i=Number(o);return""!==o&&isFinite(i)?i:null},$=(e,t)=>{if("string"==typeof t)return e[t];for(const n of t)if(void 0!==e[n])return e[n]},I=new Set,A=a({img:{maxWidth:"40px",maxHeight:"40px",objectFit:"cover",borderRadius:"3px",display:"block"},fileIcon:{width:"24px",height:"24px",verticalAlign:"middle"}}),O=({fileId:t})=>{const[n,r]=i((()=>!I.has(t))),o=A();return e("a",{href:k.getFileUrl(t),target:"_blank",rel:"noopener noreferrer",children:n?e("img",{src:k.getImageUrl(t,40),alt:"",className:o.img,onError:()=>{I.add(t),r(!1)}}):e(C,{className:o.fileIcon})})},M=({value:t,options:n,optionsLoader:a,minChars:c=2,maxResults:s=50,columnKey:d,item:p,actualIndex:u,onEnumChange:h,label:m,t:f})=>{const[y,b]=i(t),[w,C]=i([]),[k,v]=i(!1),S=r.useRef(null);l((()=>{b(t)}),[t]),l((()=>{if(a){if(!(y.length<c))return S.current&&clearTimeout(S.current),S.current=setTimeout((async()=>{v(!0);try{const e=await a(y);C(e.slice(0,s))}finally{v(!1)}}),250),()=>{S.current&&clearTimeout(S.current)};C([])}}),[y,a,c,s]);const N=o((()=>(n??[]).filter((e=>e.toLowerCase().includes(y.toLowerCase()))).slice(0,s)),[n,y,s]),W=a?w:N;return e(g,{value:y,freeform:!0,"aria-label":m,placeholder:k?f("Loading..."):a&&y.length<c?f(`Type ${c}+ characters to search...`):void 0,onChange:e=>b(e.target.value),onOptionSelect:(e,t)=>{t.optionValue&&(b(t.optionValue),h&&h(p,d,t.optionValue,u))},onBlur:()=>{h&&h(p,d,y,u)},style:{width:"100%"},children:W.map((t=>e(x,{value:t,children:t},t)))})},L=({data:a,columns:g,canEdit:x,onEdit:C,onDelete:I,onToggleCheckbox:A,onEnumChange:L,onFilteredDataChange:T,rowColor:F,compact:j})=>{const R=S(),{visibleColumns:B,defaultSortIndex:D,defaultSortDirection:E}=o((()=>{const e=a&&a.length>0?Array.from(new Set(a.flatMap((e=>Object.keys(e))))):[],t=(g||e.map((e=>({key:e})))).filter((e=>!e.hidden)),n=t.findIndex((e=>e.defaultSort));return{visibleColumns:t,defaultSortIndex:n,defaultSortDirection:n>=0&&t[n].defaultSort||null}}),[a,g]),[z,H]=i(D>=0?D:null),[_,P]=i(E),[Y,U]=i(!1),[V,K]=i({title:"",text:""}),[q,J]=i({}),[X,G]=i(0),Q=r.useRef(null),{t:Z}=v(),ee=j?36:57;r.useEffect((()=>()=>{null!==Q.current&&cancelAnimationFrame(Q.current)}),[]);const te=e=>e.title?Z(e.title):Array.isArray(e.key)?e.key[0]:e.key,ne=e=>{const t=[];return e.hideOnMobile&&t.push(R.hideOnMobile),t.join(" ")},re=(e,t)=>{J((n=>{const r={...n};return""===t.trim()?delete r[e]:r[e]=t,r}))},oe=e=>null==e||"string"==typeof e&&e.startsWith("[")&&e.endsWith("]")?"":"object"==typeof e?JSON.stringify(e):String(e),ie=o((()=>{const e=[...a];if(null!==z&&_){const t=B[z];e.sort(((e,n)=>{const r=$(e,t.key),o=$(n,t.key);if(null==r)return 1;if(null==o)return-1;let i=0;if("string"==typeof r&&"string"==typeof o){const e=N(r),t=N(o);if(null!==e&&null!==t)i=e-t;else{const e=W(r),t=W(o);i=null!==e&&null!==t?e-t:r.localeCompare(o)}}else if("number"==typeof r&&"number"==typeof o)i=r-o;else{const e=W(String(r)),t=W(String(o));i=null!==e&&null!==t?e-t:String(r).localeCompare(String(o))}return"asc"===_?i:-i}))}return e}),[a,z,_,B]),le=o((()=>ie.filter((e=>{for(const[t,n]of Object.entries(q)){const r=parseInt(t),o=B[r],i=$(e,o.key),l=oe(i).toLowerCase(),a=n.toLowerCase();if(!("enum"===o.type&&o.enumOptions?l===a:l.includes(a)))return!1}return!0}))),[ie,q,B]);l((()=>{T&&T(le)}),[le,T]);const ae="undefined"!=typeof window?window.innerHeight-250:600,ce=Math.max(0,Math.floor(X/ee)-5),se=Math.min(le.length,Math.ceil((X+ae)/ee)+5),de=le.slice(ce,se),pe=le.length*ee,ue=ce*ee,he=(e,t)=>{if(void 0!==e.id)return String(e.id);if(void 0!==e._id)return String(e._id);if(void 0!==e.originalMessageId)return String(e.originalMessageId);return`row-${t}-${(e=>{let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return Math.abs(t)})(B.slice(0,3).map((t=>String($(e,t.key)??""))).join("-"))}`};return a&&0!==a.length?t(n,{children:[e("div",{className:R.container,onScroll:e=>{const t=e.currentTarget.scrollTop;null!==Q.current&&cancelAnimationFrame(Q.current),Q.current=requestAnimationFrame((()=>{G(t),Q.current=null}))},style:{maxHeight:"calc(100vh - 200px)",overflowY:"auto"},children:t("table",{className:R.table,children:[t("thead",{children:[t("tr",{children:[B.map(((n,r)=>{const o=n.maxWidth?{width:`${n.maxWidth}px`,maxWidth:`${n.maxWidth}px`}:{};return t("th",{className:`${R.th} ${ne(n)}`.trim(),style:o,onClick:()=>(e=>{z===e?"asc"===_?P("desc"):"desc"===_&&(H(null),P(null)):(H(e),P("asc"))})(r),children:[te(n),z===r&&e("span",{className:R.sortIndicator,children:"asc"===_?"▲":"▼"})]},r)})),x&&e("th",{className:`${R.th} ${R.actionsColumn}`,style:{width:"100px"},children:Z("Actions")})]}),t("tr",{children:[B.map(((r,o)=>{const i=r.maxWidth?{width:`${r.maxWidth}px`,maxWidth:`${r.maxWidth}px`}:{};return e("th",{className:ne(r),style:i,children:r.filterable&&e("div",{className:R.filterWrapper,children:"enum"===r.type&&r.enumOptions?t(c,{className:R.filterInput,value:q[o]||"",onChange:(e,t)=>re(o,t.value),onClick:e=>e.stopPropagation(),children:[e("option",{value:"",children:Z("All")}),r.enumOptions.filter((e=>""!==e)).map((t=>e("option",{value:t,children:Z(t)},t)))]}):t(n,{children:[e("input",{type:"text",className:R.filterInput,placeholder:Z("Filter")+"...",value:q[o]||"",onChange:e=>re(o,e.target.value),onClick:e=>e.stopPropagation()}),(q[o]||"").length>0&&e(s,{appearance:"subtle",className:R.clearFilterButton,onClick:e=>{e.stopPropagation(),(e=>{J((t=>{const n={...t};return delete n[e],n}))})(o)},children:"×"})]})})},o)})),x&&e("th",{className:R.actionsColumn})]})]}),t("tbody",{children:[ce>0&&e("tr",{style:{height:`${ue}px`},children:e("td",{colSpan:B.length+(x?1:0),style:{padding:0,border:"none"}})}),de.map(((n,r)=>{const o=n._index,i="number"==typeof o?o:ce+r;let l;if(F&&(l=F(n)),!l)for(const e of B)if("row"===e.colorScope&&e.colorMap){const t=e.format?e.format($(n,e.key)):oe($(n,e.key));if(l=e.colorMap[t],l)break}return t("tr",{className:R.tr,style:{height:`${ee}px`,...l?{backgroundColor:l}:{}},children:[B.map(((r,o)=>{const l=$(n,r.key),a=r.format?r.format(l):oe(l),p=r.maxWidth?`${R.td} ${R.tdTruncated} ${j?R.tdCompact:""} ${ne(r)}`.trim():`${R.td} ${j?R.tdCompact:""} ${ne(r)}`.trim(),u=r.colorFn?r.colorFn(l,n):r.colorMap&&"row"!==r.colorScope?r.colorMap[a]:void 0,h=()=>{window.matchMedia("(hover: hover)").matches||r.maxWidth&&a.length>0&&(K({title:te(r),text:a}),U(!0))};if("thumbnail"===r.type){const t=Array.isArray(l)?l:[];return e("td",{className:p,children:e("div",{className:R.thumbnailRow,children:t.map((t=>e(O,{fileId:t},t)))})},o)}if("file"===r.type&&a)return e("td",{className:p,onClick:h,children:e("a",{href:k.getFileUrl(a),target:"_blank",rel:"noopener noreferrer",children:Z("Download")})},o);if("checkbox"===r.type){return e("td",{className:p,children:e(d,{checked:!0===l||"true"===l||"yes"===l||"1"===l,onChange:(e,t)=>{A&&A(n,r.key,!0===t.checked,i)}})},o)}if("enum"===r.type&&r.enumOptions&&r.editable)return e("td",{className:p,children:t(c,{value:a,"aria-label":r.title?Z(r.title):Array.isArray(r.key)?r.key[0]:r.key,onChange:(e,t)=>{L&&L(n,r.key,t.value,i)},style:{width:"100%"},children:[!r.enumOptions.includes(a)&&a&&e("option",{value:a,children:a}),r.enumOptions.map((t=>e("option",{value:t,children:Z(t)},t)))]})},o);if("combobox"===r.type&&r.editable&&(r.enumOptions||r.enumOptionsLoader))return e("td",{className:p,children:e(M,{value:a,options:r.enumOptions,optionsLoader:r.enumOptionsLoader,minChars:r.enumOptionsLoaderMinChars,maxResults:r.enumOptionsLoaderMaxResults,columnKey:r.key,item:n,actualIndex:i,onEnumChange:L,label:r.title?Z(r.title):Array.isArray(r.key)?r.key[0]:r.key,t:Z})},o);const m=()=>{if(r.badge&&r.colorMap){const t=r.colorMap[a];return e("span",{className:R.badge,style:t?{backgroundColor:t}:{backgroundColor:"#e0e0e0"},children:a})}return r.maxWidth&&a.length>0?e(y,{content:{children:a,style:{maxWidth:"600px",whiteSpace:"normal"}},relationship:"description",children:e("span",{children:a})}):a},f=()=>{if(!r.action)return null;const t=r.action,o=r.action.icon,i=e(s,{appearance:"subtle",icon:e(o,{}),className:R.actionIcon,onClick:e=>{e.stopPropagation(),t.onClick(n)},size:"small"});return t.tooltip?e(y,{content:Z(t.tooltip),relationship:"label",children:i}):i};return e("td",{className:p,style:u?{backgroundColor:u}:void 0,onClick:h,children:r.action?t("div",{className:R.cellWithAction,children:[r.action.iconLeft&&f(),e("span",{className:R.cellText,children:m()}),!r.action.iconLeft&&f()]}):m()},o)})),x&&(C||I)&&e("td",{className:`${R.td} ${R.actionsColumn}`,children:t("div",{style:{display:"flex",gap:"4px",justifyContent:"center"},children:[C&&e(s,{appearance:"subtle",icon:e(b,{}),className:R.editButton,onClick:()=>C(n,i),title:Z("Edit")}),I&&e(s,{appearance:"subtle",icon:e(w,{}),className:R.editButton,onClick:()=>I(n,i),title:Z("Delete")})]})})]},he(n,i))})),se<le.length&&e("tr",{style:{height:pe-ue-de.length*ee+"px"},children:e("td",{colSpan:B.length+(x?1:0),style:{padding:0,border:"none"}})})]})]})}),e(p,{open:Y,onOpenChange:(e,t)=>U(t.open),children:e(u,{children:t(h,{children:[e(m,{children:V.title}),e(f,{className:R.dialogContent,children:V.text})]})})})]}):e("div",{className:R.emptyState,children:Z("No data to display")})};var T=r.memo(L);export{L as ListView,T as default};
@@ -1 +1 @@
1
- {"version":3,"file":"ListPage.d.ts","sourceRoot":"","sources":["../../../src/pages/ListPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAuB3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAuE3D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IACxB,+FAA+F;IAC/F,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;IACpD;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;IACxD,sGAAsG;IACtG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;CAClE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,eAAO,MAAM,QAAQ,wDAAyD,aAAa,4CAsnB1F,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"ListPage.d.ts","sourceRoot":"","sources":["../../../src/pages/ListPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAuB3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAuE3D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IACxB,+FAA+F;IAC/F,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;IACpD;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;IACxD,sGAAsG;IACtG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;CAClE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,eAAO,MAAM,QAAQ,wDAAyD,aAAa,4CAwnB1F,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -1 +1 @@
1
- import{jsx as t,jsxs as e}from"react/jsx-runtime";import{useState as o,useRef as n,useMemo as r,useEffect as i,useCallback as a}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{makeStyles as s,Button as c,Dialog as l,DialogSurface as d,DialogBody as p,DialogTitle as m,DialogContent as u,DialogActions as g}from"@fluentui/react-components";import"../components/Spinner.js";import f from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{ArrowLeft24Regular as h,ArrowClockwise24Regular as j,ArrowDownload24Regular as x,Add24Regular as y}from"@fluentui/react-icons";import"../services/codicent.js";import{dataCache as w}from"../services/dataCache.js";import S from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{exportToExcel as A}from"../utils/excelExport.js";import"./AppFrame.js";import"./Canvas.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import{useSearchParams as C,useNavigate as k}from"react-router-dom";import"./Purchase.js";import"../components/Content.js";import{Page as v}from"../components/Page.js";import"./QrScan.js";import b from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import{useUserRoles as D}from"../hooks/useUserRoles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import I from"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import M from"../components/ListView.js";import{RecordModal as $}from"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";import{l as _}from"../node_modules/lodash/lodash.js";const P=s({container:{width:"100%",flex:1,maxWidth:"100%",height:"100%",minHeight:0,backgroundColor:"#ffffff",display:"flex",flexDirection:"column",margin:"0 auto",overflow:"hidden","@media (max-width: 768px)":{maxWidth:"100%",borderRadius:"0"},touchAction:"pan-y",paddingLeft:"16px",paddingRight:"16px"},listContainer:{position:"relative",overflow:"hidden",flex:1,minHeight:0,marginTop:"10px"},loadingIndicator:{padding:"8px 0",color:"#666"},headerRow:{display:"flex",justifyContent:"space-between",alignItems:"center",gap:"10px",flexWrap:"wrap"},buttonGroup:{display:"flex",gap:"8px",flexWrap:"wrap"},addButton:{minWidth:"auto",whiteSpace:"nowrap"},recordsCount:{fontSize:"14px",color:"#666",marginTop:"8px"},backButton:{marginBottom:"10px"},searchBox:{marginTop:"8px"},loadMoreContainer:{display:"flex",justifyContent:"center",padding:"16px 0",borderTop:"1px solid #e0e0e0",marginTop:"4px"}}),T=500,B=({state:s,getColumnDefs:B,getListConfig:E,filterData:N})=>{const[R,L]=C(),F=R.get("tag")||"logbook",U=R.get("title")||"",H=R.get("contentTitle"),O="true"===R.get("loadAll"),W="true"===R.get("canAdd"),q="true"===R.get("canEdit"),z="false"!==R.get("canExport"),V=R.get("addUrl")||"",G=R.get("q")||"",J=H?`${F}-${G}-${H}`:`${F}-${G||"all"}`,Q=w.get(J),[K,X]=o(G),[Y,Z]=o(G),{service:tt}=s,[et,ot]=o((()=>Q??[])),[nt,rt]=o((()=>!Q)),[it,at]=o((()=>!!Q&&!O&&!H&&Q.length>=T)),[st,ct]=o(!1),lt=n(null),dt=n(G),pt=n(""),mt=n(0),ut=n(tt);ut.current=tt;const gt=!!tt,[ft,ht]=o(0),[jt,xt]=o(null),yt=P(),{t:wt}=b(),St=k(),{getCurrentUserName:At}=D(tt,s.context.nickname,s.context.selectedApp),Ct=r((()=>(H?[{key:H,title:H,maxWidth:250}]:E?E(F)?.columns??[]:B?B(F):[]).map((t=>({...t,title:t.title?wt(t.title):void 0})))),[H,F,wt,B,E]),[kt,vt]=o(!1),[bt,Dt]=o(null),[It,Mt]=o(!1),[$t,_t]=o(null),Pt=r((()=>`listpage_searches_${F}`),[F]),Tt=t=>{try{const e=localStorage.getItem(t);return e?JSON.parse(e):[]}catch{return[]}},[Bt,Et]=o((()=>Tt(Pt)));i((()=>{Et(Tt(Pt))}),[Pt]);const Nt=a((t=>{const e=t.trim();e&&Et((t=>{const o=[e,...t.filter((t=>t!==e))].slice(0,20);try{localStorage.setItem(Pt,JSON.stringify(o))}catch{}return o}))}),[Pt]),Rt=a((t=>{Et((e=>{const o=e.filter((e=>e!==t));try{localStorage.setItem(Pt,JSON.stringify(o))}catch{}return o}))}),[Pt]),Lt=r((()=>_.debounce((t=>Z(t)),500)),[Z]);i((()=>()=>{Lt.cancel()}),[Lt]);const Ft=a((t=>{X(t),Lt(t)}),[Lt]),Ut=a((t=>{Nt(t)}),[Nt]);i((()=>{if(!R.get("q")){const t=R.get(`filter_${F}`);if(t){let e=t;if("%USERNAME%"===e){const t=At();if(!t)return;e=t}X(e),Z(e),dt.current=e}}}),[F,R,At]),i((()=>{const t=R.get("q")||"";t!==dt.current&&t!==Y&&(X(t),Z(t),dt.current=t,pt.current="")}),[R]),i((()=>(lt.current&&clearTimeout(lt.current),lt.current=setTimeout((()=>{if(dt.current!==K){const t=new URLSearchParams(R);K?t.set("q",K):t.delete("q"),L(t,{replace:!0}),dt.current=K}}),500),()=>{lt.current&&clearTimeout(lt.current)})),[K,R,L]),i((()=>{if(!ut.current)return;const t=`${F}-${H}-${O}-${ft}-${Y}`;if(t===pt.current)return;pt.current=t;const e=++mt.current,o=()=>e===mt.current,n=H?`${F}-${Y}-${H}`:`${F}-${Y||"all"}`,r=w.get(n);if(!r){if(at(!1),rt(!0),H)ut.current.getMessagesFast([F],Y).then((t=>{if(!o())return;const e=t.map((t=>{const e=new Date(t.createdAt).toLocaleString();return{id:t.id,data:{[H]:new S(t.content).content,createdAt:e},fileId:null,fileIds:[],tags:[F],mentions:[ut.current.codicent],createdAt:e}}));w.set(n,e),ot(e)})).catch(console.warn).finally((()=>{o()&&rt(!1)}));else{const t=Y||"",e=O||t?void 0:T;ut.current.readDataMessages(F,t,void 0,0,e).then((e=>{o()&&(w.set(n,e),ot(e),at(!O&&!t&&e.length===T))})).catch(console.warn).finally((()=>{o()&&rt(!1)}))}return()=>{pt.current=""}}if(ot(r),rt(!1),at(!O&&!H&&r.length>=T),!H&&!Y&&r.length>0){const t=r.reduce(((t,e)=>e.createdAt>t?e.createdAt:t),r[0].createdAt);ut.current.readDataMessages(F,"",void 0,void 0,void 0,t).then((t=>{o()&&ot((e=>{const o=new Set(e.map((t=>t.id))),r=t.filter((t=>!o.has(t.id)));if(0===r.length)return e;const i=[...r,...e];return w.set(n,i),i}))})).catch(console.warn)}}),[F,H,O,Y,ft,gt]);const Ht=r((()=>{const t={};R.forEach(((e,o)=>{o.startsWith("filter_")&&(t[o.replace("filter_","")]=e)}));let e=et.map(((t,e)=>({item:t,index:e})));for(const[o,n]of Object.entries(t)){const t=n.replace("%USERNAME%",At()),r=s.context.nickname||"";e=e.filter((({item:e})=>{const n=e.data[o];return null!=n&&(String(n).includes(t)||String(n).includes(r))}))}if(N){const t=N(e.map((({item:t})=>t)),F),o=new Set(t.map((t=>t.id)));e=e.filter((({item:t})=>o.has(t.id)))}const o=e.map((({item:t,index:e})=>({...t.data,createdAt:t.createdAt,_id:t.id,originalMessageId:t.originalMessageId||t.id,_fileIds:t.fileIds??[],_index:e}))),n=E?.(F)?.deduplicateBy;if(n){const t=Array.isArray(n)?n:[n],e=e=>{for(const o of t){const t=e[o];if(null!=t&&""!==String(t).trim())return String(t)}},r=new Set;return o.filter((t=>{const o=e(t);return void 0===o||!r.has(o)&&(r.add(o),!0)}))}return o}),[et,R,s.context.nickname,At,N,F,E]),Ot=r((()=>{const t=(K||"").trim().toLowerCase();if(!t)return Ht;const e=Ct.filter((t=>!t.hidden)).map((t=>t.key));return Ht.filter((o=>{for(const n of e)if(Array.isArray(n))for(const e of n){const n=o[e];if(null!=n&&String(n).toLowerCase().includes(t))return!0}else{const e=o[n];if(null!=e&&String(e).toLowerCase().includes(t))return!0}return!1}))}),[Ht,K,Ct]),Wt=a((()=>{w.clearPattern(F),pt.current="",ht((t=>t+1))}),[F]),qt=a((async()=>{ct(!0);try{const t=await ut.current.readDataMessages(F,"",void 0,et.length,T),e=[...et,...t];ot(e),w.set(`${F}-all`,e),at(t.length===T)}catch(t){console.warn(t)}finally{ct(!1)}}),[et,F]),zt=a((t=>{xt(t)}),[]),Vt=()=>{Mt(!1),_t(null)},Gt=a((async()=>{const t=`${F}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const e=null!==jt?jt:Ot;await A(e,Ct,t,wt)||console.warn("No data to export")}),[jt,Ot,Ct,F,wt]),Jt=r((()=>null!==jt?jt.length:Ot.length),[jt,Ot]);return t(v,{hideHeader:!0,children:e("div",{className:yt.container,children:[t("div",{className:yt.backButton,children:t(c,{appearance:"subtle",icon:t(h,{}),onClick:()=>St(-1),children:wt("Tillbaka")})}),e("div",{className:yt.headerRow,children:[t(f,{title:wt(U||"Loggbok")}),e("div",{className:yt.buttonGroup,children:[t(c,{appearance:"subtle",icon:t(j,{}),onClick:Wt,title:wt("Refresh"),children:wt("Refresh")}),z&&t(c,{appearance:"subtle",icon:t(x,{}),onClick:Gt,title:wt("Export to Excel"),children:wt("Export to Excel")}),(W||V)&&t(c,{appearance:"primary",icon:t(y,{}),onClick:W?()=>{Dt(null),vt(!0)}:()=>window.open(V,"_blank"),className:yt.addButton,children:wt("Add Record")})]})]}),t("div",{className:yt.searchBox,children:t(I,{placeholder:wt("Sök")+"...",value:K,onChange:Ft,recentSearches:Bt,onCommitSearch:Ut,onRemoveRecentSearch:Rt})}),!nt&&e("div",{className:yt.recordsCount,children:[wt("Total"),": ",Jt," ",wt("records"),Jt!==et.length&&` (${wt("filtered from")} ${et.length})`]}),e("div",{className:yt.listContainer,children:[nt&&et.length>0&&t("div",{className:yt.loadingIndicator,children:wt("Söker")+"..."}),nt&&0===et.length?t("p",{children:wt("Söker")+"..."}):t(M,{data:Ot,columns:Ct,canEdit:q,onEdit:(t,e)=>{const o=et[e];o&&(Dt({data:{...o.data,_fileIds:o.fileIds??[]},index:e}),vt(!0))},onDelete:(t,e)=>{const o=et[e];o&&(_t({index:e,id:o.id}),Mt(!0))},onToggleCheckbox:async(t,e,o,n)=>{const r=et[n];if(r){const t=Array.isArray(e)?e[0]:e,i={...r.data,[t]:String(o)},a=await tt.updateDataMessage(r.id,i);ot((t=>{const e=[...t];return e[n]={...r,id:a,data:i},e})),w.clearPattern(F)}},onEnumChange:async(t,e,o,n)=>{const r=et[n];if(r){const t=Array.isArray(e)?e[0]:e,i={...r.data,[t]:o},a=await tt.updateDataMessage(r.id,i);ot((t=>{const e=[...t];return e[n]={...r,id:a,data:i},e})),w.clearPattern(F)}},onFilteredDataChange:zt})]}),it&&!K.trim()&&t("div",{className:yt.loadMoreContainer,children:t(c,{appearance:"primary",size:"medium",onClick:qt,disabled:st,children:st?wt("Laddar..."):wt("Visa fler")+` (${et.length} ${wt("laddade")})`})}),t($,{open:kt,onClose:()=>vt(!1),onSave:async t=>{const e=new Set(Ct.filter((t=>"thumbnail"===t.type)).map((t=>Array.isArray(t.key)?t.key[0]:t.key)));if(bt){const o=et[bt.index];if(o){const n={};for(const o in t){if(e.has(o))continue;const r=t[o];n[o]=null==r?"":String(r)}const r=await tt.updateDataMessage(o.id,n);ot((t=>{const e=[...t];return e[bt.index]={...o,id:r,data:n},e})),w.clearPattern(F)}}else{const o={};for(const n in t){if(e.has(n))continue;const r=t[n];o[n]=null==r?"":String(r)}const n={id:await tt.createDataMessage(F,o),data:o,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[F],mentions:[tt.codicent]};ot((t=>[n,...t])),w.clearPattern(F)}},columns:Ct,initialData:bt?.data}),t(l,{open:It,onOpenChange:(t,e)=>!e.open&&Vt(),children:t(d,{children:e(p,{children:[t(m,{children:wt("Confirm Delete")}),t(u,{children:wt("Are you sure you want to delete this record? This action cannot be undone.")}),e(g,{children:[t(c,{appearance:"secondary",onClick:Vt,children:wt("Cancel")}),t(c,{appearance:"primary",onClick:async()=>{if($t)try{await tt.deleteDataMessage($t.id),ot((t=>t.filter(((t,e)=>e!==$t.index)))),w.clearPattern(F)}catch(t){console.error("Failed to delete record:",t)}finally{Mt(!1),_t(null)}},children:wt("Delete")})]})]})})})]})})};export{B as ListPage,B as default};
1
+ import{jsx as t,jsxs as e}from"react/jsx-runtime";import{useState as o,useRef as n,useMemo as r,useEffect as i,useCallback as a}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{makeStyles as s,Button as c,Dialog as l,DialogSurface as d,DialogBody as p,DialogTitle as m,DialogContent as u,DialogActions as g}from"@fluentui/react-components";import"../components/Spinner.js";import f from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{ArrowLeft24Regular as h,ArrowClockwise24Regular as j,ArrowDownload24Regular as x,Add24Regular as y}from"@fluentui/react-icons";import"../services/codicent.js";import{dataCache as w}from"../services/dataCache.js";import S from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{exportToExcel as A}from"../utils/excelExport.js";import"./AppFrame.js";import"./Canvas.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import{useSearchParams as C,useNavigate as k}from"react-router-dom";import"./Purchase.js";import"../components/Content.js";import{Page as v}from"../components/Page.js";import"./QrScan.js";import b from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import{useUserRoles as D}from"../hooks/useUserRoles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import I from"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import M from"../components/ListView.js";import{RecordModal as $}from"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";import{l as _}from"../node_modules/lodash/lodash.js";const P=s({container:{width:"100%",flex:1,maxWidth:"100%",height:"100%",minHeight:0,backgroundColor:"#ffffff",display:"flex",flexDirection:"column",margin:"0 auto",overflow:"hidden","@media (max-width: 768px)":{maxWidth:"100%",borderRadius:"0"},touchAction:"pan-y",paddingLeft:"16px",paddingRight:"16px"},listContainer:{position:"relative",overflow:"hidden",flex:1,minHeight:0,marginTop:"10px"},loadingIndicator:{padding:"8px 0",color:"#666"},headerRow:{display:"flex",justifyContent:"space-between",alignItems:"center",gap:"10px",flexWrap:"wrap"},buttonGroup:{display:"flex",gap:"8px",flexWrap:"wrap"},addButton:{minWidth:"auto",whiteSpace:"nowrap"},recordsCount:{fontSize:"14px",color:"#666",marginTop:"8px"},backButton:{marginBottom:"10px"},searchBox:{marginTop:"8px"},loadMoreContainer:{display:"flex",justifyContent:"center",padding:"16px 0",borderTop:"1px solid #e0e0e0",marginTop:"4px"}}),T=500,B=({state:s,getColumnDefs:B,getListConfig:E,filterData:N})=>{const[R,L]=C(),F=R.get("tag")||"logbook",U=R.get("title")||"",H=R.get("contentTitle"),O="true"===R.get("loadAll"),W="true"===R.get("canAdd"),q="true"===R.get("canEdit"),z="false"!==R.get("canExport"),V=R.has("compact"),G=R.get("addUrl")||"",J=R.get("q")||"",Q=H?`${F}-${J}-${H}`:`${F}-${J||"all"}`,K=w.get(Q),[X,Y]=o(J),[Z,tt]=o(J),{service:et}=s,[ot,nt]=o((()=>K??[])),[rt,it]=o((()=>!K)),[at,st]=o((()=>!!K&&!O&&!H&&K.length>=T)),[ct,lt]=o(!1),dt=n(null),pt=n(J),mt=n(""),ut=n(0),gt=n(et);gt.current=et;const ft=!!et,[ht,jt]=o(0),[xt,yt]=o(null),wt=P(),{t:St}=b(),At=k(),{getCurrentUserName:Ct}=D(et,s.context.nickname,s.context.selectedApp),kt=r((()=>(H?[{key:H,title:H,maxWidth:250}]:E?E(F)?.columns??[]:B?B(F):[]).map((t=>({...t,title:t.title?St(t.title):void 0})))),[H,F,St,B,E]),[vt,bt]=o(!1),[Dt,It]=o(null),[Mt,$t]=o(!1),[_t,Pt]=o(null),Tt=r((()=>`listpage_searches_${F}`),[F]),Bt=t=>{try{const e=localStorage.getItem(t);return e?JSON.parse(e):[]}catch{return[]}},[Et,Nt]=o((()=>Bt(Tt)));i((()=>{Nt(Bt(Tt))}),[Tt]);const Rt=a((t=>{const e=t.trim();e&&Nt((t=>{const o=[e,...t.filter((t=>t!==e))].slice(0,20);try{localStorage.setItem(Tt,JSON.stringify(o))}catch{}return o}))}),[Tt]),Lt=a((t=>{Nt((e=>{const o=e.filter((e=>e!==t));try{localStorage.setItem(Tt,JSON.stringify(o))}catch{}return o}))}),[Tt]),Ft=r((()=>_.debounce((t=>tt(t)),500)),[tt]);i((()=>()=>{Ft.cancel()}),[Ft]);const Ut=a((t=>{Y(t),Ft(t)}),[Ft]),Ht=a((t=>{Rt(t)}),[Rt]);i((()=>{if(!R.get("q")){const t=R.get(`filter_${F}`);if(t){let e=t;if("%USERNAME%"===e){const t=Ct();if(!t)return;e=t}Y(e),tt(e),pt.current=e}}}),[F,R,Ct]),i((()=>{const t=R.get("q")||"";t!==pt.current&&t!==Z&&(Y(t),tt(t),pt.current=t,mt.current="")}),[R]),i((()=>(dt.current&&clearTimeout(dt.current),dt.current=setTimeout((()=>{if(pt.current!==X){const t=new URLSearchParams(R);X?t.set("q",X):t.delete("q"),L(t,{replace:!0}),pt.current=X}}),500),()=>{dt.current&&clearTimeout(dt.current)})),[X,R,L]),i((()=>{if(!gt.current)return;const t=`${F}-${H}-${O}-${ht}-${Z}`;if(t===mt.current)return;mt.current=t;const e=++ut.current,o=()=>e===ut.current,n=H?`${F}-${Z}-${H}`:`${F}-${Z||"all"}`,r=w.get(n);if(!r){if(st(!1),it(!0),H)gt.current.getMessagesFast([F],Z).then((t=>{if(!o())return;const e=t.map((t=>{const e=new Date(t.createdAt).toLocaleString();return{id:t.id,data:{[H]:new S(t.content).content,createdAt:e},fileId:null,fileIds:[],tags:[F],mentions:[gt.current.codicent],createdAt:e}}));w.set(n,e),nt(e)})).catch(console.warn).finally((()=>{o()&&it(!1)}));else{const t=Z||"",e=O||t?void 0:T;gt.current.readDataMessages(F,t,void 0,0,e).then((e=>{o()&&(w.set(n,e),nt(e),st(!O&&!t&&e.length===T))})).catch(console.warn).finally((()=>{o()&&it(!1)}))}return()=>{mt.current=""}}if(nt(r),it(!1),st(!O&&!H&&r.length>=T),!H&&!Z&&r.length>0){const t=r.reduce(((t,e)=>e.createdAt>t?e.createdAt:t),r[0].createdAt);gt.current.readDataMessages(F,"",void 0,void 0,void 0,t).then((t=>{o()&&nt((e=>{const o=new Set(e.map((t=>t.id))),r=t.filter((t=>!o.has(t.id)));if(0===r.length)return e;const i=[...r,...e];return w.set(n,i),i}))})).catch(console.warn)}}),[F,H,O,Z,ht,ft]);const Ot=r((()=>{const t={};R.forEach(((e,o)=>{o.startsWith("filter_")&&(t[o.replace("filter_","")]=e)}));let e=ot.map(((t,e)=>({item:t,index:e})));for(const[o,n]of Object.entries(t)){const t=n.replace("%USERNAME%",Ct()),r=s.context.nickname||"";e=e.filter((({item:e})=>{const n=e.data[o];return null!=n&&(String(n).includes(t)||String(n).includes(r))}))}if(N){const t=N(e.map((({item:t})=>t)),F),o=new Set(t.map((t=>t.id)));e=e.filter((({item:t})=>o.has(t.id)))}const o=e.map((({item:t,index:e})=>({...t.data,createdAt:t.createdAt,_id:t.id,originalMessageId:t.originalMessageId||t.id,_fileIds:t.fileIds??[],_index:e}))),n=E?.(F)?.deduplicateBy;if(n){const t=Array.isArray(n)?n:[n],e=e=>{for(const o of t){const t=e[o];if(null!=t&&""!==String(t).trim())return String(t)}},r=new Set;return o.filter((t=>{const o=e(t);return void 0===o||!r.has(o)&&(r.add(o),!0)}))}return o}),[ot,R,s.context.nickname,Ct,N,F,E]),Wt=r((()=>{const t=(X||"").trim().toLowerCase();if(!t)return Ot;const e=kt.filter((t=>!t.hidden)).map((t=>t.key));return Ot.filter((o=>{for(const n of e)if(Array.isArray(n))for(const e of n){const n=o[e];if(null!=n&&String(n).toLowerCase().includes(t))return!0}else{const e=o[n];if(null!=e&&String(e).toLowerCase().includes(t))return!0}return!1}))}),[Ot,X,kt]),qt=a((()=>{w.clearPattern(F),mt.current="",jt((t=>t+1))}),[F]),zt=a((async()=>{lt(!0);try{const t=await gt.current.readDataMessages(F,"",void 0,ot.length,T),e=[...ot,...t];nt(e),w.set(`${F}-all`,e),st(t.length===T)}catch(t){console.warn(t)}finally{lt(!1)}}),[ot,F]),Vt=a((t=>{yt(t)}),[]),Gt=()=>{$t(!1),Pt(null)},Jt=a((async()=>{const t=`${F}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const e=null!==xt?xt:Wt;await A(e,kt,t,St)||console.warn("No data to export")}),[xt,Wt,kt,F,St]),Qt=r((()=>null!==xt?xt.length:Wt.length),[xt,Wt]);return t(v,{hideHeader:!0,children:e("div",{className:wt.container,children:[t("div",{className:wt.backButton,children:t(c,{appearance:"subtle",icon:t(h,{}),onClick:()=>At(-1),children:St("Tillbaka")})}),e("div",{className:wt.headerRow,children:[t(f,{title:St(U||"Loggbok")}),e("div",{className:wt.buttonGroup,children:[t(c,{appearance:"subtle",icon:t(j,{}),onClick:qt,title:St("Refresh"),children:St("Refresh")}),z&&t(c,{appearance:"subtle",icon:t(x,{}),onClick:Jt,title:St("Export to Excel"),children:St("Export to Excel")}),(W||G)&&t(c,{appearance:"primary",icon:t(y,{}),onClick:W?()=>{It(null),bt(!0)}:()=>window.open(G,"_blank"),className:wt.addButton,children:St("Add Record")})]})]}),t("div",{className:wt.searchBox,children:t(I,{placeholder:St("Sök")+"...",value:X,onChange:Ut,recentSearches:Et,onCommitSearch:Ht,onRemoveRecentSearch:Lt})}),!rt&&e("div",{className:wt.recordsCount,children:[St("Total"),": ",Qt," ",St("records"),Qt!==ot.length&&` (${St("filtered from")} ${ot.length})`]}),e("div",{className:wt.listContainer,children:[rt&&ot.length>0&&t("div",{className:wt.loadingIndicator,children:St("Söker")+"..."}),rt&&0===ot.length?t("p",{children:St("Söker")+"..."}):t(M,{data:Wt,columns:kt,canEdit:q,onEdit:(t,e)=>{const o=ot[e];o&&(It({data:{...o.data,_fileIds:o.fileIds??[]},index:e}),bt(!0))},onDelete:(t,e)=>{const o=ot[e];o&&(Pt({index:e,id:o.id}),$t(!0))},onToggleCheckbox:async(t,e,o,n)=>{const r=ot[n];if(r){const t=Array.isArray(e)?e[0]:e,i={...r.data,[t]:String(o)},a=await et.updateDataMessage(r.id,i);nt((t=>{const e=[...t];return e[n]={...r,id:a,data:i},e})),w.clearPattern(F)}},onEnumChange:async(t,e,o,n)=>{const r=ot[n];if(r){const t=Array.isArray(e)?e[0]:e,i={...r.data,[t]:o},a=await et.updateDataMessage(r.id,i);nt((t=>{const e=[...t];return e[n]={...r,id:a,data:i},e})),w.clearPattern(F)}},onFilteredDataChange:Vt,compact:V})]}),at&&!X.trim()&&t("div",{className:wt.loadMoreContainer,children:t(c,{appearance:"primary",size:"medium",onClick:zt,disabled:ct,children:ct?St("Laddar..."):St("Visa fler")+` (${ot.length} ${St("laddade")})`})}),t($,{open:vt,onClose:()=>bt(!1),onSave:async t=>{const e=new Set(kt.filter((t=>"thumbnail"===t.type)).map((t=>Array.isArray(t.key)?t.key[0]:t.key)));if(Dt){const o=ot[Dt.index];if(o){const n={};for(const o in t){if(e.has(o))continue;const r=t[o];n[o]=null==r?"":String(r)}const r=await et.updateDataMessage(o.id,n);nt((t=>{const e=[...t];return e[Dt.index]={...o,id:r,data:n},e})),w.clearPattern(F)}}else{const o={};for(const n in t){if(e.has(n))continue;const r=t[n];o[n]=null==r?"":String(r)}const n={id:await et.createDataMessage(F,o),data:o,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[F],mentions:[et.codicent]};nt((t=>[n,...t])),w.clearPattern(F)}},columns:kt,initialData:Dt?.data}),t(l,{open:Mt,onOpenChange:(t,e)=>!e.open&&Gt(),children:t(d,{children:e(p,{children:[t(m,{children:St("Confirm Delete")}),t(u,{children:St("Are you sure you want to delete this record? This action cannot be undone.")}),e(g,{children:[t(c,{appearance:"secondary",onClick:Gt,children:St("Cancel")}),t(c,{appearance:"primary",onClick:async()=>{if(_t)try{await et.deleteDataMessage(_t.id),nt((t=>t.filter(((t,e)=>e!==_t.index)))),w.clearPattern(F)}catch(t){console.error("Failed to delete record:",t)}finally{$t(!1),Pt(null)}},children:St("Delete")})]})]})})})]})})};export{B as ListPage,B as default};
package/dist/index.d.ts CHANGED
@@ -1712,6 +1712,14 @@ interface ColumnDefinition {
1712
1712
  action?: ColumnAction;
1713
1713
  /** Optional formatter function to transform the cell value for display. Receives the raw value and returns the formatted string. */
1714
1714
  format?: (value: unknown) => string;
1715
+ /** Maps a display value to a CSS background color (e.g. { "Active": "#c6efce" }). */
1716
+ colorMap?: Record<string, string>;
1717
+ /** When "row", the colorMap colors the entire row based on this column's value. Default is "cell". */
1718
+ colorScope?: "row" | "cell";
1719
+ /** When true, renders the value as a colored badge/pill using colorMap. */
1720
+ badge?: boolean;
1721
+ /** Dynamic color function — receives the raw value and full row data. Takes precedence over colorMap. */
1722
+ colorFn?: (value: unknown, row: Record<string, unknown>) => string | undefined;
1715
1723
  }
1716
1724
  interface ListViewProps$1 {
1717
1725
  data: Record<string, unknown>[];
@@ -1722,6 +1730,10 @@ interface ListViewProps$1 {
1722
1730
  onToggleCheckbox?: (item: Record<string, unknown>, key: string | string[], newValue: boolean, index: number) => void;
1723
1731
  onEnumChange?: (item: Record<string, unknown>, key: string | string[], newValue: string, index: number) => void;
1724
1732
  onFilteredDataChange?: (filteredData: Record<string, unknown>[]) => void;
1733
+ /** Callback to compute a CSS background color for an entire row. Takes precedence over column colorScope:"row". */
1734
+ rowColor?: (row: Record<string, unknown>) => string | undefined;
1735
+ /** Reduces row height to 36px and cell padding for a denser, Excel-like view. Activated via ?compact in the URL. */
1736
+ compact?: boolean;
1725
1737
  }
1726
1738
  declare const _default: React__default.NamedExoticComponent<ListViewProps$1>;
1727
1739
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codicent-app-sdk",
3
- "version": "0.7.8",
3
+ "version": "0.7.10",
4
4
  "description": "SDK for building AI-powered applications with Codicent",
5
5
  "type": "module",
6
6
  "main": "dist/cjs/index.js",
@@ -58,6 +58,12 @@
58
58
  "react-json-editor-ajrm": "^2.5.14",
59
59
  "remark-gfm": "^4.0.0"
60
60
  },
61
+ "overrides": {
62
+ "@babel/plugin-transform-modules-systemjs": "^7.29.4",
63
+ "@tootallnate/once": "^3.0.1",
64
+ "serialize-javascript": "^7.0.5",
65
+ "uuid": "^11.1.1"
66
+ },
61
67
  "devDependencies": {
62
68
  "@auth0/auth0-react": "^2.2.4",
63
69
  "@babel/core": "^7.21.0",