codicent-app-sdk 0.6.0 → 0.6.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"LanguageSelector.d.ts","sourceRoot":"","sources":["../../../src/components/LanguageSelector.tsx"],"names":[],"mappings":"AAuCA,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,qBAAqB;IAC7B,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAaD,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA0D5D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"LanguageSelector.d.ts","sourceRoot":"","sources":["../../../src/components/LanguageSelector.tsx"],"names":[],"mappings":"AAuCA,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,qBAAqB;IAC7B,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAaD,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA+D5D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),a=require("@fluentui/react-components"),t=require("../hooks/useLocalization.js"),n=require("react");const o=a.makeStyles({container:{marginTop:"16px",marginBottom:"16px"},label:{fontSize:"14px",fontWeight:"600",marginBottom:"8px"}}),r=[{key:"en",name:"English"},{key:"sv",name:"Svenska"},{key:"de",name:"Deutsch"},{key:"dk",name:"Dansk"},{key:"fr",name:"Français"},{key:"no",name:"Norsk"},{key:"zh",name:"中文"},{key:"pl",name:"Polski"}],s=e=>{if("undefined"!=typeof navigator&&navigator.language){const a=navigator.language.toLowerCase().split("-")[0];if(e.some((e=>e.key===a)))return a}return"en"},u=({languages:u=r,defaultLanguage:l="en"})=>{const i=o(),{t:g,currentLanguage:c,setCurrentLanguage:m}=t.default(),[d,k]=n.useState((()=>localStorage.getItem("user_language")||"auto"));n.useEffect((()=>{const e=localStorage.getItem("user_language");k(e&&"auto"!==e?e:"auto")}),[c]);const p=s(u),f=u.find((e=>e.key===p))?.name||"English";return e.jsxs("div",{className:i.container,children:[e.jsx("div",{className:i.label,children:g("Language")}),e.jsxs(a.Dropdown,{value:"auto"===d?`${g("Auto")} (${f})`:u.find((e=>e.key===d))?.name||g("Select language"),selectedOptions:[d],onOptionSelect:(e,a)=>{const t=a.value;if(k(t),"auto"===t){const e=s(u);localStorage.setItem("user_language","auto"),m(e)}else localStorage.setItem("user_language",t),m(t)},children:[e.jsxs(a.Option,{value:"auto",text:`${g("Auto")} (${f})`,children:[g("Auto")," (",f,")"]}),u.map((t=>e.jsx(a.Option,{value:t.key,text:t.name,children:t.name},t.key)))]})]})};exports.LanguageSelector=u,exports.default=u;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),a=require("@fluentui/react-components"),t=require("../hooks/useLocalization.js"),n=require("react");const o=a.makeStyles({container:{marginTop:"16px",marginBottom:"16px"},label:{fontSize:"14px",fontWeight:"600",marginBottom:"8px"}}),r=[{key:"en",name:"English"},{key:"sv",name:"Svenska"},{key:"de",name:"Deutsch"},{key:"dk",name:"Dansk"},{key:"fr",name:"Français"},{key:"no",name:"Norsk"},{key:"zh",name:"中文"},{key:"pl",name:"Polski"}],s=e=>{if("undefined"!=typeof navigator&&navigator.language){const a=navigator.language.toLowerCase().split("-")[0];if(e.some((e=>e.key===a)))return a}return"en"},u=({languages:u=r,defaultLanguage:l="en"})=>{const i=o(),{t:g,currentLanguage:c,setCurrentLanguage:m}=t.default(),[d,k]=n.useState((()=>localStorage.getItem("user_language")||"auto"));n.useEffect((()=>{const e=localStorage.getItem("user_language");k(e&&"auto"!==e?e:"auto")}),[c]);const p=s(u),f=u.find((e=>e.key===p))?.name||"English";return e.jsxs("div",{className:i.container,children:[e.jsx("div",{className:i.label,children:g("Language")}),e.jsxs(a.Dropdown,{value:"auto"===d?`${g("Auto")} (${f})`:u.find((e=>e.key===d))?.name||g("Select language"),selectedOptions:[d],onOptionSelect:(e,a)=>{const t=a.optionValue??a.value;if(t)if(k(t),"auto"===t){const e=s(u);localStorage.setItem("user_language","auto"),m(e)}else localStorage.setItem("user_language",t),m(t)},children:[e.jsxs(a.Option,{value:"auto",text:`${g("Auto")} (${f})`,children:[g("Auto")," (",f,")"]}),u.map((t=>e.jsx(a.Option,{value:t.key,text:t.name,children:t.name},t.key)))]})]})};exports.LanguageSelector=u,exports.default=u;
@@ -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;AAqLD,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,SAAS,CAAC;IAC1E,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;AA2GD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA0gB5C,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;AAqLD,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,SAAS,CAAC;IAC1E,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;AA2GD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAmiB5C,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"),o=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:{"&: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}},cellText:{flex:1,overflow:"hidden",textOverflow:"ellipsis"}}),l=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,t)=>{if("string"==typeof t)return e[t];for(const n of t)if(void 0!==e[n])return e[n]},c=({value:i,options:r,optionsLoader:o,minChars:a=2,maxResults:l=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(o){if(!(x.length<a))return b.current&&clearTimeout(b.current),b.current=setTimeout((async()=>{j(!0);try{const e=await o(x);g(e.slice(0,l))}finally{j(!1)}}),250),()=>{b.current&&clearTimeout(b.current)};g([])}}),[x,o,a,l]);const C=t.useMemo((()=>(r??[]).filter((e=>e.toLowerCase().includes(x.toLowerCase()))).slice(0,l)),[r,x,l]),w=o?f:C;return e.jsx(n.Combobox,{value:x,freeform:!0,"aria-label":p,placeholder:y?h("Loading..."):o&&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:w.map((t=>e.jsx(n.Option,{value:t,children:t},t)))})},d=({data:d,columns:u,canEdit:p,onEdit:h,onDelete:x,onToggleCheckbox:m,onEnumChange:f,onFilteredDataChange:g})=>{const y=a(),{visibleColumns:j,defaultSortIndex:b,defaultSortDirection:C}=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]),[w,k]=t.useState(b>=0?b:null),[v,S]=t.useState(C),[N,W]=t.useState(!1),[O,$]=t.useState({title:"",text:""}),[L,M]=t.useState({}),[T,I]=t.useState(0),{t:A}=o.default(),D=e=>e.title?A(e.title):Array.isArray(e.key)?e.key[0]:e.key,B=e=>{const t=[];return e.hideOnMobile&&t.push(y.hideOnMobile),t.join(" ")},E=e=>null==e||"string"==typeof e&&e.startsWith("[")&&e.endsWith("]")?"":"object"==typeof e?JSON.stringify(e):String(e),F=t.useMemo((()=>{const e=[...d];if(null!==w&&v){const t=j[w];e.sort(((e,n)=>{const i=s(e,t.key),r=s(n,t.key);if(null==i)return 1;if(null==r)return-1;let o=0;if("string"==typeof i&&"string"==typeof r){const e=l(i),t=l(r);if(null!==e&&null!==t)o=e-t;else{const e=i.trim().replace(/[\s\u00a0]/g,"").replace(/,/g,""),t=r.trim().replace(/[\s\u00a0]/g,"").replace(/,/g,""),n=Number(e),a=Number(t);o=""!==e&&""!==t&&isFinite(n)&&isFinite(a)?n-a:i.localeCompare(r)}}else o="number"==typeof i&&"number"==typeof r?i-r:String(i).localeCompare(String(r));return"asc"===v?o:-o}))}return e}),[d,w,v,j]),R=t.useMemo((()=>F.filter((e=>{for(const[t,n]of Object.entries(L)){const i=parseInt(t),r=j[i],o=s(e,r.key),a=E(o).toLowerCase(),l=n.toLowerCase();if(!a.includes(l))return!1}return!0}))),[F,L,j]);t.useEffect((()=>{g&&g(R)}),[R,g]);const q="undefined"!=typeof window?window.innerHeight-250:600,z=Math.max(0,Math.floor(T/49)-5),H=Math.min(R.length,Math.ceil((T+q)/49)+5),P=R.slice(z,H),V=49*R.length,Y=49*z,_=(e,t)=>{if(void 0!==e.id)return String(e.id);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)})(j.slice(0,3).map((t=>String(s(e,t.key)??""))).join("-"))}`};return d&&0!==d.length?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:y.container,onScroll:e=>{I(e.currentTarget.scrollTop)},style:{maxHeight:"calc(100vh - 200px)",overflowY:"auto"},children:e.jsxs("table",{className:y.table,children:[e.jsxs("thead",{children:[e.jsxs("tr",{children:[j.map(((t,n)=>{const i=t.maxWidth?{width:`${t.maxWidth}px`,maxWidth:`${t.maxWidth}px`}:{};return e.jsxs("th",{className:`${y.th} ${B(t)}`.trim(),style:i,onClick:()=>(e=>{w===e?"asc"===v?S("desc"):"desc"===v&&(k(null),S(null)):(k(e),S("asc"))})(n),children:[D(t),w===n&&e.jsx("span",{className:y.sortIndicator,children:"asc"===v?"▲":"▼"})]},n)})),p&&e.jsx("th",{className:`${y.th} ${y.actionsColumn}`,style:{width:"100px"},children:A("Actions")})]}),e.jsxs("tr",{children:[j.map(((t,i)=>{const r=t.maxWidth?{width:`${t.maxWidth}px`,maxWidth:`${t.maxWidth}px`}:{};return e.jsx("th",{className:B(t),style:r,children:t.filterable&&e.jsxs("div",{className:y.filterWrapper,children:[e.jsx("input",{type:"text",className:y.filterInput,placeholder:A("Filter")+"...",value:L[i]||"",onChange:e=>((e,t)=>{M((n=>{const i={...n};return""===t.trim()?delete i[e]:i[e]=t,i}))})(i,e.target.value),onClick:e=>e.stopPropagation()}),(L[i]||"").length>0&&e.jsx(n.Button,{appearance:"subtle",className:y.clearFilterButton,onClick:e=>{e.stopPropagation(),(e=>{M((t=>{const n={...t};return delete n[e],n}))})(i)},children:"×"})]})},i)})),p&&e.jsx("th",{className:y.actionsColumn})]})]}),e.jsxs("tbody",{children:[z>0&&e.jsx("tr",{style:{height:`${Y}px`},children:e.jsx("td",{colSpan:j.length+(p?1:0),style:{padding:0,border:"none"}})}),P.map(((t,o)=>{const a=t._index,l="number"==typeof a?a:z+o;return e.jsxs("tr",{className:y.tr,children:[j.map(((i,o)=>{const a=s(t,i.key),d=i.format?i.format(a):E(a),u=i.maxWidth?`${y.td} ${y.tdTruncated} ${B(i)}`.trim():`${y.td} ${B(i)}`.trim(),p=()=>{window.matchMedia("(hover: hover)").matches||i.maxWidth&&d.length>0&&($({title:D(i),text:d}),W(!0))};if("file"===i.type&&d)return e.jsx("td",{className:u,onClick:p,children:e.jsx("a",{href:r.CodicentService.getFileUrl(d),target:"_blank",rel:"noopener noreferrer",children:A("Download")})},o);if("checkbox"===i.type){const r=!0===a||"true"===a||"yes"===a||"1"===a;return e.jsx("td",{className:u,children:e.jsx(n.Checkbox,{checked:r,onChange:(e,n)=>{m&&m(t,i.key,!0===n.checked,l)}})},o)}if("enum"===i.type&&i.enumOptions&&i.editable)return e.jsx("td",{className:u,children:e.jsxs(n.Select,{value:d,"aria-label":i.title?A(i.title):Array.isArray(i.key)?i.key[0]:i.key,onChange:(e,n)=>{f&&f(t,i.key,n.value,l)},style:{width:"100%"},children:[!i.enumOptions.includes(d)&&d&&e.jsx("option",{value:d,children:d}),i.enumOptions.map((t=>e.jsx("option",{value:t,children:A(t)},t)))]})},o);if("combobox"===i.type&&i.editable&&(i.enumOptions||i.enumOptionsLoader))return e.jsx("td",{className:u,children:e.jsx(c,{value:d,options:i.enumOptions,optionsLoader:i.enumOptionsLoader,minChars:i.enumOptionsLoaderMinChars,maxResults:i.enumOptionsLoaderMaxResults,columnKey:i.key,item:t,actualIndex:l,onEnumChange:f,label:i.title?A(i.title):Array.isArray(i.key)?i.key[0]:i.key,t:A})},o);const h=()=>i.maxWidth&&d.length>0?e.jsx(n.Tooltip,{content:{children:d,style:{maxWidth:"600px",whiteSpace:"normal"}},relationship:"description",children:e.jsx("span",{children:d})}):d,x=()=>{if(!i.action)return null;const r=i.action,o=i.action.icon,a=e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(o,{}),className:y.actionIcon,onClick:e=>{e.stopPropagation(),r.onClick(t)},size:"small"});return r.tooltip?e.jsx(n.Tooltip,{content:A(r.tooltip),relationship:"label",children:a}):a};return e.jsx("td",{className:u,onClick:p,children:i.action?e.jsxs("div",{className:y.cellWithAction,children:[i.action.iconLeft&&x(),e.jsx("span",{className:y.cellText,children:h()}),!i.action.iconLeft&&x()]}):h()},o)})),p&&(h||x)&&e.jsx("td",{className:`${y.td} ${y.actionsColumn}`,children:e.jsxs("div",{style:{display:"flex",gap:"4px",justifyContent:"center"},children:[h&&e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(i.Edit24Regular,{}),className:y.editButton,onClick:()=>h(t,l),title:A("Edit")}),x&&e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(i.Delete24Regular,{}),className:y.editButton,onClick:()=>x(t,l),title:A("Delete")})]})})]},_(t,l))})),H<R.length&&e.jsx("tr",{style:{height:V-Y-49*P.length+"px"},children:e.jsx("td",{colSpan:j.length+(p?1:0),style:{padding:0,border:"none"}})})]})]})}),e.jsx(n.Dialog,{open:N,onOpenChange:(e,t)=>W(t.open),children:e.jsx(n.DialogSurface,{children:e.jsxs(n.DialogBody,{children:[e.jsx(n.DialogTitle,{children:O.title}),e.jsx(n.DialogContent,{className:y.dialogContent,children:O.text})]})})})]}):e.jsx("div",{className:y.emptyState,children:A("No data to display")})};var u=t.memo(d);exports.ListView=d,exports.default=u;
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"),o=require("../services/codicent.js"),r=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:{"&: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}},cellText:{flex:1,overflow:"hidden",textOverflow:"ellipsis"}}),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,i=parseInt(t[3],10),o=new Date(i,n,e);if(o.getFullYear()===i&&o.getMonth()===n&&o.getDate()===e)return o.getTime()}return null},s=(e,t)=>{if("string"==typeof t)return e[t];for(const n of t)if(void 0!==e[n])return e[n]},c=({value:i,options:o,optionsLoader:r,minChars:l=2,maxResults:a=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(r){if(!(x.length<l))return b.current&&clearTimeout(b.current),b.current=setTimeout((async()=>{j(!0);try{const e=await r(x);g(e.slice(0,a))}finally{j(!1)}}),250),()=>{b.current&&clearTimeout(b.current)};g([])}}),[x,r,l,a]);const C=t.useMemo((()=>(o??[]).filter((e=>e.toLowerCase().includes(x.toLowerCase()))).slice(0,a)),[o,x,a]),v=r?f:C;return e.jsx(n.Combobox,{value:x,freeform:!0,"aria-label":p,placeholder:y?h("Loading..."):r&&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),u&&u(c,s,t.optionValue,d))},onBlur:()=>{u&&u(c,s,x,d)},style:{width:"100%"},children:v.map((t=>e.jsx(n.Option,{value:t,children:t},t)))})},d=({data:d,columns:u,canEdit:p,onEdit:h,onDelete:x,onToggleCheckbox:m,onEnumChange:f,onFilteredDataChange:g})=>{const y=l(),{visibleColumns:j,defaultSortIndex:b,defaultSortDirection:C}=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]),[v,w]=t.useState(b>=0?b:null),[k,S]=t.useState(C),[N,W]=t.useState(!1),[O,$]=t.useState({title:"",text:""}),[I,L]=t.useState({}),[M,T]=t.useState(0),{t:A}=r.default(),D=e=>e.title?A(e.title):Array.isArray(e.key)?e.key[0]:e.key,B=e=>{const t=[];return e.hideOnMobile&&t.push(y.hideOnMobile),t.join(" ")},F=(e,t)=>{L((n=>{const i={...n};return""===t.trim()?delete i[e]:i[e]=t,i}))},E=e=>null==e||"string"==typeof e&&e.startsWith("[")&&e.endsWith("]")?"":"object"==typeof e?JSON.stringify(e):String(e),R=t.useMemo((()=>{const e=[...d];if(null!==v&&k){const t=j[v];e.sort(((e,n)=>{const i=s(e,t.key),o=s(n,t.key);if(null==i)return 1;if(null==o)return-1;let r=0;if("string"==typeof i&&"string"==typeof o){const e=a(i),t=a(o);if(null!==e&&null!==t)r=e-t;else{const e=i.trim().replace(/[\s\u00a0]/g,"").replace(/,/g,""),t=o.trim().replace(/[\s\u00a0]/g,"").replace(/,/g,""),n=Number(e),l=Number(t);r=""!==e&&""!==t&&isFinite(n)&&isFinite(l)?n-l:i.localeCompare(o)}}else r="number"==typeof i&&"number"==typeof o?i-o:String(i).localeCompare(String(o));return"asc"===k?r:-r}))}return e}),[d,v,k,j]),q=t.useMemo((()=>R.filter((e=>{for(const[t,n]of Object.entries(I)){const i=parseInt(t),o=j[i],r=s(e,o.key),l=E(r).toLowerCase(),a=n.toLowerCase();if(!("enum"===o.type&&o.enumOptions?l===a:l.includes(a)))return!1}return!0}))),[R,I,j]);t.useEffect((()=>{g&&g(q)}),[q,g]);const z="undefined"!=typeof window?window.innerHeight-250:600,H=Math.max(0,Math.floor(M/49)-5),P=Math.min(q.length,Math.ceil((M+z)/49)+5),V=q.slice(H,P),Y=49*q.length,_=49*H,K=(e,t)=>{if(void 0!==e.id)return String(e.id);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)})(j.slice(0,3).map((t=>String(s(e,t.key)??""))).join("-"))}`};return d&&0!==d.length?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:y.container,onScroll:e=>{T(e.currentTarget.scrollTop)},style:{maxHeight:"calc(100vh - 200px)",overflowY:"auto"},children:e.jsxs("table",{className:y.table,children:[e.jsxs("thead",{children:[e.jsxs("tr",{children:[j.map(((t,n)=>{const i=t.maxWidth?{width:`${t.maxWidth}px`,maxWidth:`${t.maxWidth}px`}:{};return e.jsxs("th",{className:`${y.th} ${B(t)}`.trim(),style:i,onClick:()=>(e=>{v===e?"asc"===k?S("desc"):"desc"===k&&(w(null),S(null)):(w(e),S("asc"))})(n),children:[D(t),v===n&&e.jsx("span",{className:y.sortIndicator,children:"asc"===k?"▲":"▼"})]},n)})),p&&e.jsx("th",{className:`${y.th} ${y.actionsColumn}`,style:{width:"100px"},children:A("Actions")})]}),e.jsxs("tr",{children:[j.map(((t,i)=>{const o=t.maxWidth?{width:`${t.maxWidth}px`,maxWidth:`${t.maxWidth}px`}:{};return e.jsx("th",{className:B(t),style:o,children:t.filterable&&e.jsx("div",{className:y.filterWrapper,children:"enum"===t.type&&t.enumOptions?e.jsxs(n.Select,{className:y.filterInput,value:I[i]||"",onChange:(e,t)=>F(i,t.value),onClick:e=>e.stopPropagation(),children:[e.jsx("option",{value:"",children:A("All")}),t.enumOptions.filter((e=>""!==e)).map((t=>e.jsx("option",{value:t,children:A(t)},t)))]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",className:y.filterInput,placeholder:A("Filter")+"...",value:I[i]||"",onChange:e=>F(i,e.target.value),onClick:e=>e.stopPropagation()}),(I[i]||"").length>0&&e.jsx(n.Button,{appearance:"subtle",className:y.clearFilterButton,onClick:e=>{e.stopPropagation(),(e=>{L((t=>{const n={...t};return delete n[e],n}))})(i)},children:"×"})]})})},i)})),p&&e.jsx("th",{className:y.actionsColumn})]})]}),e.jsxs("tbody",{children:[H>0&&e.jsx("tr",{style:{height:`${_}px`},children:e.jsx("td",{colSpan:j.length+(p?1:0),style:{padding:0,border:"none"}})}),V.map(((t,r)=>{const l=t._index,a="number"==typeof l?l:H+r;return e.jsxs("tr",{className:y.tr,children:[j.map(((i,r)=>{const l=s(t,i.key),d=i.format?i.format(l):E(l),u=i.maxWidth?`${y.td} ${y.tdTruncated} ${B(i)}`.trim():`${y.td} ${B(i)}`.trim(),p=()=>{window.matchMedia("(hover: hover)").matches||i.maxWidth&&d.length>0&&($({title:D(i),text:d}),W(!0))};if("file"===i.type&&d)return e.jsx("td",{className:u,onClick:p,children:e.jsx("a",{href:o.CodicentService.getFileUrl(d),target:"_blank",rel:"noopener noreferrer",children:A("Download")})},r);if("checkbox"===i.type){const o=!0===l||"true"===l||"yes"===l||"1"===l;return e.jsx("td",{className:u,children:e.jsx(n.Checkbox,{checked:o,onChange:(e,n)=>{m&&m(t,i.key,!0===n.checked,a)}})},r)}if("enum"===i.type&&i.enumOptions&&i.editable)return e.jsx("td",{className:u,children:e.jsxs(n.Select,{value:d,"aria-label":i.title?A(i.title):Array.isArray(i.key)?i.key[0]:i.key,onChange:(e,n)=>{f&&f(t,i.key,n.value,a)},style:{width:"100%"},children:[!i.enumOptions.includes(d)&&d&&e.jsx("option",{value:d,children:d}),i.enumOptions.map((t=>e.jsx("option",{value:t,children:A(t)},t)))]})},r);if("combobox"===i.type&&i.editable&&(i.enumOptions||i.enumOptionsLoader))return e.jsx("td",{className:u,children:e.jsx(c,{value:d,options:i.enumOptions,optionsLoader:i.enumOptionsLoader,minChars:i.enumOptionsLoaderMinChars,maxResults:i.enumOptionsLoaderMaxResults,columnKey:i.key,item:t,actualIndex:a,onEnumChange:f,label:i.title?A(i.title):Array.isArray(i.key)?i.key[0]:i.key,t:A})},r);const h=()=>i.maxWidth&&d.length>0?e.jsx(n.Tooltip,{content:{children:d,style:{maxWidth:"600px",whiteSpace:"normal"}},relationship:"description",children:e.jsx("span",{children:d})}):d,x=()=>{if(!i.action)return null;const o=i.action,r=i.action.icon,l=e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(r,{}),className:y.actionIcon,onClick:e=>{e.stopPropagation(),o.onClick(t)},size:"small"});return o.tooltip?e.jsx(n.Tooltip,{content:A(o.tooltip),relationship:"label",children:l}):l};return e.jsx("td",{className:u,onClick:p,children:i.action?e.jsxs("div",{className:y.cellWithAction,children:[i.action.iconLeft&&x(),e.jsx("span",{className:y.cellText,children:h()}),!i.action.iconLeft&&x()]}):h()},r)})),p&&(h||x)&&e.jsx("td",{className:`${y.td} ${y.actionsColumn}`,children:e.jsxs("div",{style:{display:"flex",gap:"4px",justifyContent:"center"},children:[h&&e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(i.Edit24Regular,{}),className:y.editButton,onClick:()=>h(t,a),title:A("Edit")}),x&&e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(i.Delete24Regular,{}),className:y.editButton,onClick:()=>x(t,a),title:A("Delete")})]})})]},K(t,a))})),P<q.length&&e.jsx("tr",{style:{height:Y-_-49*V.length+"px"},children:e.jsx("td",{colSpan:j.length+(p?1:0),style:{padding:0,border:"none"}})})]})]})}),e.jsx(n.Dialog,{open:N,onOpenChange:(e,t)=>W(t.open),children:e.jsx(n.DialogSurface,{children:e.jsxs(n.DialogBody,{children:[e.jsx(n.DialogTitle,{children:O.title}),e.jsx(n.DialogContent,{className:y.dialogContent,children:O.text})]})})})]}):e.jsx("div",{className:y.emptyState,children:A("No data to display")})};var u=t.memo(d);exports.ListView=d,exports.default=u;
@@ -1 +1 @@
1
- {"version":3,"file":"useLocalization.d.ts","sourceRoot":"","sources":["../../../src/hooks/useLocalization.ts"],"names":[],"mappings":"AAOA,UAAU,cAAc;IACtB,MAAM,EAAE,cAAc,GAAG,WAAW,GAAG,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAAC;IACjF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAwGD,eAAO,MAAM,gBAAgB,YAAiB,CAAC;AAU/C,QAAA,MAAM,eAAe;aAsCX,MAAM;kBAyEA,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;;+BA3FC,MAAM;;;CAkK9C,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"useLocalization.d.ts","sourceRoot":"","sources":["../../../src/hooks/useLocalization.ts"],"names":[],"mappings":"AAOA,UAAU,cAAc;IACtB,MAAM,EAAE,cAAc,GAAG,WAAW,GAAG,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAAC;IACjF,QAAQ,EAAE,MAAM,CAAC;CAClB;AA6GD,eAAO,MAAM,gBAAgB,YAAiB,CAAC;AAa/C,QAAA,MAAM,eAAe;aA2CX,MAAM;kBAkFA,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;;+BApGC,MAAM;;;CA2K9C,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../node_modules/i18next/dist/esm/i18next.js"),a=require("../services/codicent.js"),n=require("../config/index.js"),r=require("../node_modules/react-i18next/dist/es/initReactI18next.js"),s=require("../node_modules/react-i18next/dist/es/useTranslation.js");const i=()=>{const e=n.getConfigValue("FORCE_LANGUAGE");if(e)return{source:"force_config",language:e};if("undefined"!=typeof window){const e=new URLSearchParams(window.location.search),t=e.get("lang")||e.get("language");if(t)return{source:"url_param",language:t}}if("undefined"!=typeof window&&"undefined"!=typeof localStorage){const e=localStorage.getItem("user_language");if(e&&"auto"!==e)return{source:"user_preference",language:e}}if("undefined"!=typeof navigator&&navigator.language){return{source:"browser",language:navigator.language.split("-")[0]}}return{source:"default",language:n.getConfigValue("DEFAULT_LANGUAGE")||"sv"}};let o=null;const l=()=>{if(null===o){const{language:e}=i();o=e}return o},c=()=>{const e=n.getConfigValue("TRANSLATIONS");if(e){const t={};for(const[a,n]of Object.entries(e))t[a]={translation:n};return t}return{en:{translation:{Hello:"Hello"}},sv:{translation:{Hello:"Hej"}}}},u=()=>{if(t.default.isInitialized){const e=c();Object.keys(e).forEach((a=>{t.default.addResourceBundle(a,"translation",e[a].translation,!0,!0)}))}else t.default.use(r.initReactI18next).init({resources:c(),lng:l(),fallbackLng:n.getConfigValue("DEFAULT_LANGUAGE")||"sv",interpolation:{escapeValue:!1}})};u();const g=new Set;let d=JSON.parse(localStorage.getItem("app-translations")||"{}");exports.default=()=>{const{t:t,i18n:r}=s.useTranslation(),[o,c]=e.useState((()=>l())),[f,m]=e.useState(d);e.useEffect((()=>{globalThis.__CODICENT_REINIT_I18N__&&(u(),globalThis.__CODICENT_REINIT_I18N__=!1)}),[]),e.useEffect((()=>{r.changeLanguage(o)}),[o,r]);const _=e.useCallback((e=>{const{source:t}=i();"force_config"!==t?"url_param"!==t?c(e):console.warn("Language setting ignored due to URL parameter"):console.warn("Language setting ignored due to FORCE_LANGUAGE configuration")}),[]),p=e.useCallback((()=>i()),[]);return{t:e.useCallback((e=>(r.exists(e)||(async(e,t)=>{const r=`${t} - ${e}`;let s=d[t]?.[e]||void 0;if(n.getConfigValue("AUTO_TRANSLATE")&&!s&&!g.has(r)){g.add(r),localStorage.setItem("app-translations",JSON.stringify(d));try{s=(await a.CodicentService.getTranslations(e,t)).translation}catch(e){console.error("Error fetching translation:",e),s=void 0}finally{g.delete(r)}s&&s.includes("Error code:")&&(s=void 0),s&&(!e.trim().startsWith('"')&&s.trim().startsWith('"')&&s.trim().endsWith('"')&&(s=s.trim().slice(1,-1)),!e.trim().startsWith("'")&&s.trim().startsWith("'")&&s.trim().endsWith("'")&&(s=s.trim().slice(1,-1)),d[t]={...d[t],[e]:s},localStorage.setItem("app-translations",JSON.stringify(d)),m({...d}))}return s||e})(e,o).then((t=>{r.addResource(o,"translation",e,t)})),t(e))),[r,t,o]),tAsync:e.useCallback((async e=>{const t=await(async(e,t)=>{const r=`${t} - ${e}`;let s=d[t]?.[e]||void 0;if(n.getConfigValue("AUTO_TRANSLATE")&&!s&&!g.has(r)){g.add(r),localStorage.setItem("app-translations",JSON.stringify(d));try{s=(await a.CodicentService.getTranslations(e,t)).translation}catch(e){console.error("Error fetching translation:",e),s=void 0}finally{g.delete(r)}s&&s.includes("Error code:")&&(s=void 0),s&&(!e.trim().startsWith('"')&&s.trim().startsWith('"')&&s.trim().endsWith('"')&&(s=s.trim().slice(1,-1)),!e.trim().startsWith("'")&&s.trim().startsWith("'")&&s.trim().endsWith("'")&&(s=s.trim().slice(1,-1)),d[t]={...d[t],[e]:s},localStorage.setItem("app-translations",JSON.stringify(d)),m({...d}))}return s||e})(e,o);return r.exists(e)||r.addResource(o,"translation",e,t),t}),[r,o]),currentLanguage:o,setCurrentLanguage:_,getLanguageInfo:p,isForced:["force_config","url_param"].includes(i().source)}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../node_modules/i18next/dist/esm/i18next.js"),a=require("../services/codicent.js"),n=require("../config/index.js"),r=require("../node_modules/react-i18next/dist/es/initReactI18next.js"),i=require("../node_modules/react-i18next/dist/es/useTranslation.js");const s=()=>{const e=n.getConfigValue("FORCE_LANGUAGE");if(e)return{source:"force_config",language:e};if("undefined"!=typeof window){const e=new URLSearchParams(window.location.search),t=e.get("lang")||e.get("language");if(t)return{source:"url_param",language:t}}if("undefined"!=typeof window&&"undefined"!=typeof localStorage){const e=localStorage.getItem("user_language");if(e&&"auto"!==e)return{source:"user_preference",language:e};if("auto"===e&&"undefined"!=typeof navigator&&navigator.language){return{source:"browser",language:navigator.language.split("-")[0]}}}const t=n.getConfigValue("DEFAULT_LANGUAGE");if(t)return{source:"default",language:t};if("undefined"!=typeof navigator&&navigator.language){return{source:"browser",language:navigator.language.split("-")[0]}}return{source:"default",language:"sv"}},o=()=>s().language,l=()=>{const e=n.getConfigValue("TRANSLATIONS");if(e){const t={};for(const[a,n]of Object.entries(e))t[a]={translation:n};return t}return{en:{translation:{Hello:"Hello"}},sv:{translation:{Hello:"Hej"}}}},u=()=>{if(t.default.isInitialized){const e=l();Object.keys(e).forEach((a=>{t.default.addResourceBundle(a,"translation",e[a].translation,!0,!0)}))}else t.default.use(r.initReactI18next).init({resources:l(),lng:o(),fallbackLng:n.getConfigValue("DEFAULT_LANGUAGE")||"sv",interpolation:{escapeValue:!1}})};u();const c=new Set;let g=JSON.parse(localStorage.getItem("app-translations")||"{}");const d=new Set;exports.default=()=>{const{t:t,i18n:r}=i.useTranslation(),[l,f]=e.useState((()=>o())),[_,m]=e.useState(g);e.useEffect((()=>{if(globalThis.__CODICENT_REINIT_I18N__){u(),globalThis.__CODICENT_REINIT_I18N__=!1;const e=o();f(e)}}),[]),e.useEffect((()=>{r.changeLanguage(l)}),[l,r]);const p=e.useCallback((e=>{const{source:t}=s();"force_config"!==t?"url_param"!==t?f(e):console.warn("Language setting ignored due to URL parameter"):console.warn("Language setting ignored due to FORCE_LANGUAGE configuration")}),[]),h=e.useCallback((()=>s()),[]);return{t:e.useCallback((e=>{if(!r.exists(e)){if(!n.getConfigValue("AUTO_TRANSLATE")&&"sv"!==l){const t=`${l}:${e}`;d.has(t)||(d.add(t),console.warn(`[i18n] Missing translation for key "${e}" in language "${l}"`))}(async(e,t)=>{const r=`${t} - ${e}`;let i=g[t]?.[e]||void 0;if(n.getConfigValue("AUTO_TRANSLATE")&&!i&&!c.has(r)){c.add(r),localStorage.setItem("app-translations",JSON.stringify(g));try{i=(await a.CodicentService.getTranslations(e,t)).translation}catch(e){console.error("Error fetching translation:",e),i=void 0}finally{c.delete(r)}i&&i.includes("Error code:")&&(i=void 0),i&&(!e.trim().startsWith('"')&&i.trim().startsWith('"')&&i.trim().endsWith('"')&&(i=i.trim().slice(1,-1)),!e.trim().startsWith("'")&&i.trim().startsWith("'")&&i.trim().endsWith("'")&&(i=i.trim().slice(1,-1)),g[t]={...g[t],[e]:i},localStorage.setItem("app-translations",JSON.stringify(g)),m({...g}))}return i||e})(e,l).then((t=>{r.addResource(l,"translation",e,t)}))}return t(e)}),[r,t,l]),tAsync:e.useCallback((async e=>{const t=await(async(e,t)=>{const r=`${t} - ${e}`;let i=g[t]?.[e]||void 0;if(n.getConfigValue("AUTO_TRANSLATE")&&!i&&!c.has(r)){c.add(r),localStorage.setItem("app-translations",JSON.stringify(g));try{i=(await a.CodicentService.getTranslations(e,t)).translation}catch(e){console.error("Error fetching translation:",e),i=void 0}finally{c.delete(r)}i&&i.includes("Error code:")&&(i=void 0),i&&(!e.trim().startsWith('"')&&i.trim().startsWith('"')&&i.trim().endsWith('"')&&(i=i.trim().slice(1,-1)),!e.trim().startsWith("'")&&i.trim().startsWith("'")&&i.trim().endsWith("'")&&(i=i.trim().slice(1,-1)),g[t]={...g[t],[e]:i},localStorage.setItem("app-translations",JSON.stringify(g)),m({...g}))}return i||e})(e,l);return r.exists(e)||r.addResource(l,"translation",e,t),t}),[r,l]),currentLanguage:l,setCurrentLanguage:p,getLanguageInfo:h,isForced:["force_config","url_param"].includes(s().source)}};
@@ -1 +1 @@
1
- {"version":3,"file":"useUserRoles.d.ts","sourceRoot":"","sources":["../../../src/hooks/useUserRoles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,YAAa,eAAe,oBAAoB,MAAM,oBAAoB,MAAM;;;;oCAiC1F,MAAM,KAAG,MAAM;gCAgBO,MAAM,KAAG,MAAM;8BAUjB,MAAM,QAAQ,QAAQ,KAAG,OAAO;+BAe/B,MAAM,KAAG,QAAQ,GAAG,SAAS;mCAKzB,MAAM,KAAG,MAAM,EAAE;8BASxB,QAAQ,GAAG,SAAS;8BAKR,MAAM;CAiBlD,CAAC"}
1
+ {"version":3,"file":"useUserRoles.d.ts","sourceRoot":"","sources":["../../../src/hooks/useUserRoles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,YAAa,eAAe,oBAAoB,MAAM,oBAAoB,MAAM;;;;oCAmC1F,MAAM,KAAG,MAAM;gCAgBO,MAAM,KAAG,MAAM;8BAUjB,MAAM,QAAQ,QAAQ,KAAG,OAAO;+BAe/B,MAAM,KAAG,QAAQ,GAAG,SAAS;mCAKzB,MAAM,KAAG,MAAM,EAAE;8BASxB,QAAQ,GAAG,SAAS;8BAKR,MAAM;CAiBlD,CAAC"}
@@ -1 +1 @@
1
- "use strict";var e=require("react"),r=require("../utils/MessageContent.js");exports.useUserRoles=(t,s,n)=>{const[a,o]=e.useState([]),[i,u]=e.useState(!0),[l,c]=e.useState(null);e.useEffect((()=>{if(!s)return;if(!n)return;(async()=>{try{u(!0),c(null);const e=(await t.getMessagesFast(["user_role"],void 0,100)).map((e=>{const t=new r.default(e.content).data;return t&&"object"==typeof t?t:null})).filter((e=>null!==e));o(e)}catch(e){console.error("Failed to fetch user roles:",e),c(e instanceof Error?e.message:"Failed to fetch user roles")}finally{u(!1)}})()}),[t,s,n]);const m=e.useCallback((e=>{if(!e)return"";const r=e.toLowerCase(),t=a.find((e=>{if(!e.nicknames)return!1;return e.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===r))}));return t?.name||e}),[a]),f=(e,r)=>{if(!e||!r)return!1;const t=e.toLowerCase();if(r.nicknames){if(r.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===t)))return!0}return r.name?.toLowerCase()===t||r.email?.toLowerCase()===t},C=e=>{if(e)return a.find((r=>f(e,r)))},p=e.useCallback((()=>s?m(s):""),[s,m]);return{userRoles:a,loading:i,error:l,getNameFromNickname:m,getNicknameFromName:e=>{if(!e)return"";const r=a.find((r=>r.name?.toLowerCase()===e.toLowerCase()));if(r?.nicknames){return r.nicknames.split(",").map((e=>e.trim()))[0]||e}return e},isUserMatch:f,findUserRole:C,getClaimsForUser:e=>{const r=C(e);return r?.claims?r.claims.split(",").map((e=>e.trim())).filter(Boolean):[]},getCurrentUserRole:()=>{if(s)return C(s)},getCurrentUserName:p}};
1
+ "use strict";var e=require("react"),r=require("../utils/MessageContent.js");exports.useUserRoles=(t,s,n)=>{const[a,o]=e.useState([]),[i,l]=e.useState(!0),[u,c]=e.useState(null);e.useEffect((()=>{if(!s||!n)return void l(!1);(async()=>{try{l(!0),c(null);const e=(await t.getMessagesFast(["user_role"],void 0,100)).map((e=>{const t=new r.default(e.content).data;return t&&"object"==typeof t?t:null})).filter((e=>null!==e));o(e)}catch(e){console.error("Failed to fetch user roles:",e),c(e instanceof Error?e.message:"Failed to fetch user roles")}finally{l(!1)}})()}),[t,s,n]);const m=e.useCallback((e=>{if(!e)return"";const r=e.toLowerCase(),t=a.find((e=>{if(!e.nicknames)return!1;return e.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===r))}));return t?.name||e}),[a]),f=(e,r)=>{if(!e||!r)return!1;const t=e.toLowerCase();if(r.nicknames){if(r.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===t)))return!0}return r.name?.toLowerCase()===t||r.email?.toLowerCase()===t},C=e=>{if(e)return a.find((r=>f(e,r)))},d=e.useCallback((()=>s?m(s):""),[s,m]);return{userRoles:a,loading:i,error:u,getNameFromNickname:m,getNicknameFromName:e=>{if(!e)return"";const r=a.find((r=>r.name?.toLowerCase()===e.toLowerCase()));if(r?.nicknames){return r.nicknames.split(",").map((e=>e.trim()))[0]||e}return e},isUserMatch:f,findUserRole:C,getClaimsForUser:e=>{const r=C(e);return r?.claims?r.claims.split(",").map((e=>e.trim())).filter(Boolean):[]},getCurrentUserRole:()=>{if(s)return C(s)},getCurrentUserName:d}};
@@ -1,12 +1,18 @@
1
1
  import type { ColumnDefinition } from "../components/ListView";
2
+ import type { ListConfig } from "../types";
2
3
  import { CodicentAppState } from "../hooks/useCodicentApp";
3
4
  export interface ListPageProps {
4
5
  state: CodicentAppState;
5
6
  /** Returns column definitions for a given tag. Falls back to all data keys if not provided. */
6
7
  getColumnDefs?: (tag: string) => ColumnDefinition[];
8
+ /**
9
+ * Returns full list configuration (columns + optional deduplicateBy) for a given tag.
10
+ * When provided, takes precedence over getColumnDefs for deriving column definitions.
11
+ */
12
+ getListConfig?: (tag: string) => ListConfig | undefined;
7
13
  /** Optional data filter applied after fetch. Useful for app-specific filtering (e.g. empty notes). */
8
14
  filterData?: (data: DataMessage[], tag: string) => DataMessage[];
9
15
  }
10
- export declare const ListPage: ({ state, getColumnDefs, filterData }: ListPageProps) => import("react/jsx-runtime").JSX.Element;
16
+ export declare const ListPage: ({ state, getColumnDefs, getListConfig, filterData }: ListPageProps) => import("react/jsx-runtime").JSX.Element;
11
17
  export default ListPage;
12
18
  //# sourceMappingURL=ListPage.d.ts.map
@@ -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;AAuB/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAkE3D,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,sGAAsG;IACtG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;CAClE;AAED,eAAO,MAAM,QAAQ,yCAA0C,aAAa,4CA+jB3E,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;AAkE3D,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,eAAO,MAAM,QAAQ,wDAAyD,aAAa,4CAylB1F,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 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"),o=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 i=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 j=require("../node_modules/lodash/lodash.js");const h=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:"0",paddingRight:"0"},listContainer:{overflow:"hidden",flex:1,minHeight:0,marginTop:"10px"},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"}}),f=500,q=({state:q,getColumnDefs:x,filterData:C})=>{const[S,w]=c.useSearchParams(),A=S.get("tag")||"logbook",v=S.get("title")||"",y=S.get("contentTitle"),k="true"===S.get("loadAll"),b="true"===S.get("canAdd"),D="true"===S.get("canEdit"),M="false"!==S.get("canExport"),E=S.get("addUrl")||"",R=S.get("q")||"",[B,P]=t.useState(R),[I,T]=t.useState(R),{service:_}=q,[$,N]=t.useState([]),[L,F]=t.useState(!1),[U,O]=t.useState(!1),[H,W]=t.useState(!1),z=t.useRef(null),V=t.useRef(R),G=t.useRef(""),J=t.useRef(!0),[Q,K]=t.useState(0),[X,Y]=t.useState(null),Z=h(),{t:ee}=u.default(),te=c.useNavigate(),{getCurrentUserName:re}=d.useUserRoles(_,q.context.nickname,q.context.selectedApp),ae=t.useMemo((()=>(y?[{key:y,title:y,maxWidth:250}]:x?x(A):[]).map((e=>({...e,title:e.title?ee(e.title):void 0})))),[y,A,ee,x]),[ne,se]=t.useState(!1),[oe,ie]=t.useState(null),[ce,le]=t.useState(!1),[ue,de]=t.useState(null),pe=t.useMemo((()=>`listpage_searches_${A}`),[A]),me=e=>{try{const t=localStorage.getItem(e);return t?JSON.parse(t):[]}catch{return[]}},[ge,je]=t.useState((()=>me(pe)));t.useEffect((()=>{je(me(pe))}),[pe]);const he=t.useCallback((e=>{const t=e.trim();t&&je((e=>{const r=[t,...e.filter((e=>e!==t))].slice(0,20);try{localStorage.setItem(pe,JSON.stringify(r))}catch{}return r}))}),[pe]),fe=t.useCallback((e=>{je((t=>{const r=t.filter((t=>t!==e));try{localStorage.setItem(pe,JSON.stringify(r))}catch{}return r}))}),[pe]),qe=t.useMemo((()=>j.lodashExports.debounce((e=>T(e)),500)),[T]);t.useEffect((()=>()=>{qe.cancel()}),[qe]);const xe=t.useCallback((e=>{P(e),qe(e)}),[qe]),Ce=t.useCallback((e=>{he(e)}),[he]);t.useEffect((()=>{if(!S.get("q")){const e=S.get(`filter_${A}`);if(e){let t=e;if("%USERNAME%"===t){const e=re();if(!e)return;t=e}P(t),T(t),V.current=t}}}),[A,S,re]),t.useEffect((()=>{const e=S.get("q")||"";e!==V.current&&(P(e),T(e),V.current=e,G.current="")}),[S]),t.useEffect((()=>(z.current&&clearTimeout(z.current),z.current=setTimeout((()=>{if(V.current!==B){const e={title:v,tag:A};y&&(e.contentTitle=y),B&&(e.q=B),k&&(e.loadAll="true"),w(e,{replace:!0}),V.current=B}}),500),()=>{z.current&&clearTimeout(z.current)})),[B,A,v,y,k,w]),t.useEffect((()=>{J.current=!0;const e=`${A}-${y}-${k}-${Q}-${I}`;if(e===G.current)return;G.current=e;const t=y?`${A}-${I}-${y}`:`${A}-${I||"all"}`,r=s.dataCache.get(t);if(!r){if(O(!1),F(!0),y)_.getMessagesFast([A],I).then((e=>{if(!J.current)return void F(!1);const r=e.map((e=>{const t=new Date(e.createdAt).toLocaleString();return{id:e.id,data:{[y]:new o.default(e.content).content,createdAt:t},fileId:null,fileIds:[],tags:[A],mentions:[_.codicent],createdAt:t}}));s.dataCache.set(t,r),J.current&&N(r)})).catch(console.warn).finally((()=>F(!1)));else{const e=I||"",r=k||e?void 0:f;_.readDataMessages(A,e,void 0,0,r).then((r=>{s.dataCache.set(t,r),J.current?(N(r),O(!k&&!e&&r.length===f)):F(!1)})).catch(console.warn).finally((()=>F(!1)))}return()=>{J.current=!1}}if(N(r),O(!k&&!y&&r.length>=f),!y&&!I&&r.length>0){const e=r.reduce(((e,t)=>t.createdAt>e?t.createdAt:e),r[0].createdAt);_.readDataMessages(A,"",void 0,void 0,void 0,e).then((e=>{J.current&&N((r=>{const a=new Set(r.map((e=>e.id))),n=e.filter((e=>!a.has(e.id)));if(0===n.length)return r;const o=[...n,...r];return s.dataCache.set(t,o),o}))})).catch(console.warn)}}),[_,A,y,k,I,Q]);const Se=t.useMemo((()=>{const e={};S.forEach(((t,r)=>{r.startsWith("filter_")&&(e[r.replace("filter_","")]=t)}));let t=$.map(((e,t)=>({item:e,index:t})));for(const[r,a]of Object.entries(e)){const e=a.replace("%USERNAME%",re()),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(C){const e=C(t.map((({item:e})=>e)),A),r=new Set(e.map((e=>e.id)));t=t.filter((({item:e})=>r.has(e.id)))}return t.map((({item:e,index:t})=>({...e.data,createdAt:e.createdAt,_id:e.id,originalMessageId:e.originalMessageId||e.id,_index:t})))}),[$,S,q.context.nickname,re,C,A]),we=t.useMemo((()=>{const e=(B||"").trim().toLowerCase();if(!e)return Se;const t=ae.filter((e=>!e.hidden)).map((e=>e.key));return Se.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}))}),[Se,B,ae]),Ae=t.useCallback((()=>{s.dataCache.clearPattern(A),G.current="",K((e=>e+1))}),[A]),ve=t.useCallback((async()=>{W(!0);try{const e=await _.readDataMessages(A,"",void 0,$.length,f),t=[...$,...e];N(t),s.dataCache.set(`${A}-all`,t),O(e.length===f)}catch(e){console.warn(e)}finally{W(!1)}}),[$,_,A]),ye=t.useCallback((e=>{Y(e)}),[]),ke=()=>{le(!1),de(null)},be=t.useCallback((async()=>{const e=`${A}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const t=null!==X?X:we;await i.exportToExcel(t,ae,e,ee)||console.warn("No data to export")}),[X,we,ae,A,ee]),De=t.useMemo((()=>null!==X?X.length:we.length),[X,we]);return e.jsx(l.Page,{hideHeader:!0,children:e.jsxs("div",{className:Z.container,children:[e.jsx("div",{className:Z.backButton,children:e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowLeft24Regular,{}),onClick:()=>te(-1),children:ee("Tillbaka")})}),e.jsxs("div",{className:Z.headerRow,children:[e.jsx(a.default,{title:ee(v||"Loggbok")}),e.jsxs("div",{className:Z.buttonGroup,children:[e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowClockwise24Regular,{}),onClick:Ae,title:ee("Refresh"),children:ee("Refresh")}),M&&e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowDownload24Regular,{}),onClick:be,title:ee("Export to Excel"),children:ee("Export to Excel")}),(b||E)&&e.jsx(r.Button,{appearance:"primary",icon:e.jsx(n.Add24Regular,{}),onClick:b?()=>{ie(null),se(!0)}:()=>window.open(E,"_blank"),className:Z.addButton,children:ee("Add Record")})]})]}),e.jsx("div",{className:Z.searchBox,children:e.jsx(p.default,{placeholder:ee("Sök")+"...",value:B,onChange:xe,recentSearches:ge,onCommitSearch:Ce,onRemoveRecentSearch:fe})}),!L&&e.jsxs("div",{className:Z.recordsCount,children:[ee("Total"),": ",De," ",ee("records"),De!==$.length&&` (${ee("filtered from")} ${$.length})`]}),e.jsxs("div",{className:Z.listContainer,children:[L&&e.jsx("p",{children:ee("Söker")+"..."}),!L&&e.jsx(m.default,{data:we,columns:ae,canEdit:D,onEdit:(e,t)=>{const r=$[t];r&&(ie({data:{...r.data},index:t}),se(!0))},onDelete:(e,t)=>{const r=$[t];r&&(de({index:t,id:r.id}),le(!0))},onToggleCheckbox:async(e,t,r,a)=>{const n=$[a];if(n){const e=Array.isArray(t)?t[0]:t,o={...n.data,[e]:String(r)},i=await _.updateDataMessage(n.id,o);N((e=>{const t=[...e];return t[a]={...n,id:i,data:o},t})),s.dataCache.clearPattern(A)}},onEnumChange:async(e,t,r,a)=>{const n=$[a];if(n){const e=Array.isArray(t)?t[0]:t,o={...n.data,[e]:r},i=await _.updateDataMessage(n.id,o);N((e=>{const t=[...e];return t[a]={...n,id:i,data:o},t})),s.dataCache.clearPattern(A)}},onFilteredDataChange:ye})]}),U&&!B.trim()&&e.jsx("div",{className:Z.loadMoreContainer,children:e.jsx(r.Button,{appearance:"primary",size:"medium",onClick:ve,disabled:H,children:H?ee("Laddar..."):ee("Visa fler")+` (${$.length} ${ee("laddade")})`})}),e.jsx(g.RecordModal,{open:ne,onClose:()=>se(!1),onSave:async e=>{if(oe){const t=$[oe.index];if(t){const r={};for(const t in e){const a=e[t];r[t]=null==a?"":String(a)}const a=await _.updateDataMessage(t.id,r);N((e=>{const n=[...e];return n[oe.index]={...t,id:a,data:r},n})),s.dataCache.clearPattern(A)}}else{const t={};for(const r in e){const a=e[r];t[r]=null==a?"":String(a)}const r={id:await _.createDataMessage(A,t),data:t,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[A],mentions:[_.codicent]};N((e=>[r,...e])),s.dataCache.clearPattern(A)}},columns:ae,initialData:oe?.data}),e.jsx(r.Dialog,{open:ce,onOpenChange:(e,t)=>!t.open&&ke(),children:e.jsx(r.DialogSurface,{children:e.jsxs(r.DialogBody,{children:[e.jsx(r.DialogTitle,{children:ee("Confirm Delete")}),e.jsx(r.DialogContent,{children:ee("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:ke,children:ee("Cancel")}),e.jsx(r.Button,{appearance:"primary",onClick:async()=>{if(ue)try{await _.deleteDataMessage(ue.id),N((e=>e.filter(((e,t)=>t!==ue.index)))),s.dataCache.clearPattern(A)}catch(e){console.error("Failed to delete record:",e)}finally{le(!1),de(null)}},children:ee("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"),o=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 i=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 j=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:"0",paddingRight:"0"},listContainer:{overflow:"hidden",flex:1,minHeight:0,marginTop:"10px"},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"}}),f=500,q=({state:q,getColumnDefs:x,getListConfig:C,filterData:S})=>{const[w,y]=c.useSearchParams(),A=w.get("tag")||"logbook",v=w.get("title")||"",k=w.get("contentTitle"),b="true"===w.get("loadAll"),D="true"===w.get("canAdd"),M="true"===w.get("canEdit"),B="false"!==w.get("canExport"),E=w.get("addUrl")||"",R=w.get("q")||"",[P,I]=t.useState(R),[T,_]=t.useState(R),{service:$}=q,[N,L]=t.useState([]),[F,U]=t.useState(!1),[O,H]=t.useState(!1),[W,z]=t.useState(!1),V=t.useRef(null),G=t.useRef(R),J=t.useRef(""),Q=t.useRef(!0),[K,X]=t.useState(0),[Y,Z]=t.useState(null),ee=j(),{t:te}=u.default(),re=c.useNavigate(),{getCurrentUserName:ae}=d.useUserRoles($,q.context.nickname,q.context.selectedApp),ne=t.useMemo((()=>(k?[{key:k,title:k,maxWidth:250}]:C?C(A)?.columns??[]:x?x(A):[]).map((e=>({...e,title:e.title?te(e.title):void 0})))),[k,A,te,x,C]),[se,oe]=t.useState(!1),[ie,ce]=t.useState(null),[le,ue]=t.useState(!1),[de,pe]=t.useState(null),me=t.useMemo((()=>`listpage_searches_${A}`),[A]),ge=e=>{try{const t=localStorage.getItem(e);return t?JSON.parse(t):[]}catch{return[]}},[he,je]=t.useState((()=>ge(me)));t.useEffect((()=>{je(ge(me))}),[me]);const fe=t.useCallback((e=>{const t=e.trim();t&&je((e=>{const r=[t,...e.filter((e=>e!==t))].slice(0,20);try{localStorage.setItem(me,JSON.stringify(r))}catch{}return r}))}),[me]),qe=t.useCallback((e=>{je((t=>{const r=t.filter((t=>t!==e));try{localStorage.setItem(me,JSON.stringify(r))}catch{}return r}))}),[me]),xe=t.useMemo((()=>h.lodashExports.debounce((e=>_(e)),500)),[_]);t.useEffect((()=>()=>{xe.cancel()}),[xe]);const Ce=t.useCallback((e=>{I(e),xe(e)}),[xe]),Se=t.useCallback((e=>{fe(e)}),[fe]);t.useEffect((()=>{if(!w.get("q")){const e=w.get(`filter_${A}`);if(e){let t=e;if("%USERNAME%"===t){const e=ae();if(!e)return;t=e}I(t),_(t),G.current=t}}}),[A,w,ae]),t.useEffect((()=>{const e=w.get("q")||"";e!==G.current&&(I(e),_(e),G.current=e,J.current="")}),[w]),t.useEffect((()=>(V.current&&clearTimeout(V.current),V.current=setTimeout((()=>{if(G.current!==P){const e={title:v,tag:A};k&&(e.contentTitle=k),P&&(e.q=P),b&&(e.loadAll="true"),y(e,{replace:!0}),G.current=P}}),500),()=>{V.current&&clearTimeout(V.current)})),[P,A,v,k,b,y]),t.useEffect((()=>{Q.current=!0;const e=`${A}-${k}-${b}-${K}-${T}`;if(e===J.current)return;J.current=e;const t=k?`${A}-${T}-${k}`:`${A}-${T||"all"}`,r=s.dataCache.get(t);if(!r){if(H(!1),U(!0),k)$.getMessagesFast([A],T).then((e=>{if(!Q.current)return void U(!1);const r=e.map((e=>{const t=new Date(e.createdAt).toLocaleString();return{id:e.id,data:{[k]:new o.default(e.content).content,createdAt:t},fileId:null,fileIds:[],tags:[A],mentions:[$.codicent],createdAt:t}}));s.dataCache.set(t,r),Q.current&&L(r)})).catch(console.warn).finally((()=>U(!1)));else{const e=T||"",r=b||e?void 0:f;$.readDataMessages(A,e,void 0,0,r).then((r=>{s.dataCache.set(t,r),Q.current?(L(r),H(!b&&!e&&r.length===f)):U(!1)})).catch(console.warn).finally((()=>U(!1)))}return()=>{Q.current=!1}}if(L(r),H(!b&&!k&&r.length>=f),!k&&!T&&r.length>0){const e=r.reduce(((e,t)=>t.createdAt>e?t.createdAt:e),r[0].createdAt);$.readDataMessages(A,"",void 0,void 0,void 0,e).then((e=>{Q.current&&L((r=>{const a=new Set(r.map((e=>e.id))),n=e.filter((e=>!a.has(e.id)));if(0===n.length)return r;const o=[...n,...r];return s.dataCache.set(t,o),o}))})).catch(console.warn)}}),[$,A,k,b,T,K]);const we=t.useMemo((()=>{const e={};w.forEach(((t,r)=>{r.startsWith("filter_")&&(e[r.replace("filter_","")]=t)}));let t=N.map(((e,t)=>({item:e,index:t})));for(const[r,a]of Object.entries(e)){const e=a.replace("%USERNAME%",ae()),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,_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}),[N,w,q.context.nickname,ae,S,A,C]),ye=t.useMemo((()=>{const e=(P||"").trim().toLowerCase();if(!e)return we;const t=ne.filter((e=>!e.hidden)).map((e=>e.key));return we.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}))}),[we,P,ne]),Ae=t.useCallback((()=>{s.dataCache.clearPattern(A),J.current="",X((e=>e+1))}),[A]),ve=t.useCallback((async()=>{z(!0);try{const e=await $.readDataMessages(A,"",void 0,N.length,f),t=[...N,...e];L(t),s.dataCache.set(`${A}-all`,t),H(e.length===f)}catch(e){console.warn(e)}finally{z(!1)}}),[N,$,A]),ke=t.useCallback((e=>{Z(e)}),[]),be=()=>{ue(!1),pe(null)},De=t.useCallback((async()=>{const e=`${A}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const t=null!==Y?Y:ye;await i.exportToExcel(t,ne,e,te)||console.warn("No data to export")}),[Y,ye,ne,A,te]),Me=t.useMemo((()=>null!==Y?Y.length:ye.length),[Y,ye]);return e.jsx(l.Page,{hideHeader:!0,children:e.jsxs("div",{className:ee.container,children:[e.jsx("div",{className:ee.backButton,children:e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowLeft24Regular,{}),onClick:()=>re(-1),children:te("Tillbaka")})}),e.jsxs("div",{className:ee.headerRow,children:[e.jsx(a.default,{title:te(v||"Loggbok")}),e.jsxs("div",{className:ee.buttonGroup,children:[e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowClockwise24Regular,{}),onClick:Ae,title:te("Refresh"),children:te("Refresh")}),B&&e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowDownload24Regular,{}),onClick:De,title:te("Export to Excel"),children:te("Export to Excel")}),(D||E)&&e.jsx(r.Button,{appearance:"primary",icon:e.jsx(n.Add24Regular,{}),onClick:D?()=>{ce(null),oe(!0)}:()=>window.open(E,"_blank"),className:ee.addButton,children:te("Add Record")})]})]}),e.jsx("div",{className:ee.searchBox,children:e.jsx(p.default,{placeholder:te("Sök")+"...",value:P,onChange:Ce,recentSearches:he,onCommitSearch:Se,onRemoveRecentSearch:qe})}),!F&&e.jsxs("div",{className:ee.recordsCount,children:[te("Total"),": ",Me," ",te("records"),Me!==N.length&&` (${te("filtered from")} ${N.length})`]}),e.jsxs("div",{className:ee.listContainer,children:[F&&e.jsx("p",{children:te("Söker")+"..."}),!F&&e.jsx(m.default,{data:ye,columns:ne,canEdit:M,onEdit:(e,t)=>{const r=N[t];r&&(ce({data:{...r.data},index:t}),oe(!0))},onDelete:(e,t)=>{const r=N[t];r&&(pe({index:t,id:r.id}),ue(!0))},onToggleCheckbox:async(e,t,r,a)=>{const n=N[a];if(n){const e=Array.isArray(t)?t[0]:t,o={...n.data,[e]:String(r)},i=await $.updateDataMessage(n.id,o);L((e=>{const t=[...e];return t[a]={...n,id:i,data:o},t})),s.dataCache.clearPattern(A)}},onEnumChange:async(e,t,r,a)=>{const n=N[a];if(n){const e=Array.isArray(t)?t[0]:t,o={...n.data,[e]:r},i=await $.updateDataMessage(n.id,o);L((e=>{const t=[...e];return t[a]={...n,id:i,data:o},t})),s.dataCache.clearPattern(A)}},onFilteredDataChange:ke})]}),O&&!P.trim()&&e.jsx("div",{className:ee.loadMoreContainer,children:e.jsx(r.Button,{appearance:"primary",size:"medium",onClick:ve,disabled:W,children:W?te("Laddar..."):te("Visa fler")+` (${N.length} ${te("laddade")})`})}),e.jsx(g.RecordModal,{open:se,onClose:()=>oe(!1),onSave:async e=>{if(ie){const t=N[ie.index];if(t){const r={};for(const t in e){const a=e[t];r[t]=null==a?"":String(a)}const a=await $.updateDataMessage(t.id,r);L((e=>{const n=[...e];return n[ie.index]={...t,id:a,data:r},n})),s.dataCache.clearPattern(A)}}else{const t={};for(const r in e){const a=e[r];t[r]=null==a?"":String(a)}const r={id:await $.createDataMessage(A,t),data:t,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[A],mentions:[$.codicent]};L((e=>[r,...e])),s.dataCache.clearPattern(A)}},columns:ne,initialData:ie?.data}),e.jsx(r.Dialog,{open:le,onOpenChange:(e,t)=>!t.open&&be(),children:e.jsx(r.DialogSurface,{children:e.jsxs(r.DialogBody,{children:[e.jsx(r.DialogTitle,{children:te("Confirm Delete")}),e.jsx(r.DialogContent,{children:te("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:te("Cancel")}),e.jsx(r.Button,{appearance:"primary",onClick:async()=>{if(de)try{await $.deleteDataMessage(de.id),L((e=>e.filter(((e,t)=>t!==de.index)))),s.dataCache.clearPattern(A)}catch(e){console.error("Failed to delete record:",e)}finally{ue(!1),pe(null)}},children:te("Delete")})]})]})})})]})})};exports.ListPage=q,exports.default=q;
@@ -29,11 +29,27 @@ export * from "./audit";
29
29
  import type { ColumnAction, ColumnDefinition } from "../components/ListView";
30
30
  export type { ColumnAction, ColumnDefinition };
31
31
  /**
32
- * List definitions keyed by tag name (e.g., "customer2", "offertjson")
32
+ * Configuration for a single list view, supporting column definitions and optional deduplication.
33
+ * @public
34
+ */
35
+ export interface ListConfig {
36
+ /** Column definitions for this list */
37
+ columns: ColumnDefinition[];
38
+ /**
39
+ * When set, only the most recent message per unique value of this key is shown.
40
+ * When an array is provided, keys are tried in order and the first truthy value is used.
41
+ * Useful for cases where multiple independent messages represent the same entity
42
+ * (e.g. same customer number or offer number) and only the latest should be displayed.
43
+ */
44
+ deduplicateBy?: string | string[];
45
+ }
46
+ /**
47
+ * List definitions keyed by tag name (e.g., "customer2", "offertjson").
48
+ * Each entry can be a plain column-definition array (backward-compatible) or a full ListConfig.
33
49
  * @public
34
50
  */
35
51
  export interface ListDefinitions {
36
- [tagName: string]: ColumnDefinition[];
52
+ [tagName: string]: ColumnDefinition[] | ListConfig;
37
53
  }
38
54
  /**
39
55
  * AI chat instructions configuration
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LanguageSelector.d.ts","sourceRoot":"","sources":["../../../src/components/LanguageSelector.tsx"],"names":[],"mappings":"AAuCA,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,qBAAqB;IAC7B,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAaD,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA0D5D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"LanguageSelector.d.ts","sourceRoot":"","sources":["../../../src/components/LanguageSelector.tsx"],"names":[],"mappings":"AAuCA,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,qBAAqB;IAC7B,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAaD,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA+D5D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- import{jsxs as e,jsx as a}from"react/jsx-runtime";import{makeStyles as t,Dropdown as n,Option as o}from"@fluentui/react-components";import r from"../hooks/useLocalization.js";import{useState as l,useEffect as u}from"react";const s=t({container:{marginTop:"16px",marginBottom:"16px"},label:{fontSize:"14px",fontWeight:"600",marginBottom:"8px"}}),g=[{key:"en",name:"English"},{key:"sv",name:"Svenska"},{key:"de",name:"Deutsch"},{key:"dk",name:"Dansk"},{key:"fr",name:"Français"},{key:"no",name:"Norsk"},{key:"zh",name:"中文"},{key:"pl",name:"Polski"}],i=e=>{if("undefined"!=typeof navigator&&navigator.language){const a=navigator.language.toLowerCase().split("-")[0];if(e.some((e=>e.key===a)))return a}return"en"},m=({languages:t=g,defaultLanguage:m="en"})=>{const c=s(),{t:k,currentLanguage:f,setCurrentLanguage:p}=r(),[d,y]=l((()=>localStorage.getItem("user_language")||"auto"));u((()=>{const e=localStorage.getItem("user_language");y(e&&"auto"!==e?e:"auto")}),[f]);const h=i(t),v=t.find((e=>e.key===h))?.name||"English";return e("div",{className:c.container,children:[a("div",{className:c.label,children:k("Language")}),e(n,{value:"auto"===d?`${k("Auto")} (${v})`:t.find((e=>e.key===d))?.name||k("Select language"),selectedOptions:[d],onOptionSelect:(e,a)=>{const n=a.value;if(y(n),"auto"===n){const e=i(t);localStorage.setItem("user_language","auto"),p(e)}else localStorage.setItem("user_language",n),p(n)},children:[e(o,{value:"auto",text:`${k("Auto")} (${v})`,children:[k("Auto")," (",v,")"]}),t.map((e=>a(o,{value:e.key,text:e.name,children:e.name},e.key)))]})]})};export{m as LanguageSelector,m as default};
1
+ import{jsxs as e,jsx as a}from"react/jsx-runtime";import{makeStyles as t,Dropdown as n,Option as o}from"@fluentui/react-components";import r from"../hooks/useLocalization.js";import{useState as l,useEffect as u}from"react";const i=t({container:{marginTop:"16px",marginBottom:"16px"},label:{fontSize:"14px",fontWeight:"600",marginBottom:"8px"}}),s=[{key:"en",name:"English"},{key:"sv",name:"Svenska"},{key:"de",name:"Deutsch"},{key:"dk",name:"Dansk"},{key:"fr",name:"Français"},{key:"no",name:"Norsk"},{key:"zh",name:"中文"},{key:"pl",name:"Polski"}],g=e=>{if("undefined"!=typeof navigator&&navigator.language){const a=navigator.language.toLowerCase().split("-")[0];if(e.some((e=>e.key===a)))return a}return"en"},m=({languages:t=s,defaultLanguage:m="en"})=>{const c=i(),{t:k,currentLanguage:f,setCurrentLanguage:p}=r(),[d,y]=l((()=>localStorage.getItem("user_language")||"auto"));u((()=>{const e=localStorage.getItem("user_language");y(e&&"auto"!==e?e:"auto")}),[f]);const h=g(t),v=t.find((e=>e.key===h))?.name||"English";return e("div",{className:c.container,children:[a("div",{className:c.label,children:k("Language")}),e(n,{value:"auto"===d?`${k("Auto")} (${v})`:t.find((e=>e.key===d))?.name||k("Select language"),selectedOptions:[d],onOptionSelect:(e,a)=>{const n=a.optionValue??a.value;if(n)if(y(n),"auto"===n){const e=g(t);localStorage.setItem("user_language","auto"),p(e)}else localStorage.setItem("user_language",n),p(n)},children:[e(o,{value:"auto",text:`${k("Auto")} (${v})`,children:[k("Auto")," (",v,")"]}),t.map((e=>a(o,{value:e.key,text:e.name,children:e.name},e.key)))]})]})};export{m as LanguageSelector,m as default};
@@ -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;AAqLD,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,SAAS,CAAC;IAC1E,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;AA2GD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA0gB5C,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;AAqLD,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,SAAS,CAAC;IAC1E,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;AA2GD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAmiB5C,CAAC;;AAGF,wBAAoC"}
@@ -1 +1 @@
1
- import{jsx as e,jsxs as t,Fragment as n}from"react/jsx-runtime";import i,{useMemo as r,useState as o,useEffect as l}from"react";import{makeStyles as a,Button as c,Checkbox as s,Select as d,Dialog as p,DialogSurface as h,DialogBody as u,DialogTitle as m,DialogContent as f,Combobox as x,Option as g,Tooltip as y}from"@fluentui/react-components";import{Edit24Regular as b,Delete24Regular as w}from"@fluentui/react-icons";import{CodicentService as C}from"../services/codicent.js";import k from"../hooks/useLocalization.js";const v=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:{"&: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}},cellText:{flex:1,overflow:"hidden",textOverflow:"ellipsis"}}),S=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},N=(e,t)=>{if("string"==typeof t)return e[t];for(const n of t)if(void 0!==e[n])return e[n]},W=({value:t,options:n,optionsLoader:a,minChars:c=2,maxResults:s=50,columnKey:d,item:p,actualIndex:h,onEnumChange:u,label:m,t:f})=>{const[y,b]=o(t),[w,C]=o([]),[k,v]=o(!1),S=i.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=r((()=>(n??[]).filter((e=>e.toLowerCase().includes(y.toLowerCase()))).slice(0,s)),[n,y,s]),W=a?w:N;return e(x,{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),u&&u(p,d,t.optionValue,h))},onBlur:()=>{u&&u(p,d,y,h)},style:{width:"100%"},children:W.map((t=>e(g,{value:t,children:t},t)))})},O=({data:i,columns:a,canEdit:x,onEdit:g,onDelete:O,onToggleCheckbox:$,onEnumChange:I,onFilteredDataChange:L})=>{const A=v(),{visibleColumns:T,defaultSortIndex:M,defaultSortDirection:j}=r((()=>{const e=i&&i.length>0?Array.from(new Set(i.flatMap((e=>Object.keys(e))))):[],t=(a||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}}),[i,a]),[D,F]=o(M>=0?M:null),[B,z]=o(j),[E,R]=o(!1),[H,Y]=o({title:"",text:""}),[P,V]=o({}),[K,_]=o(0),{t:J}=k(),U=e=>e.title?J(e.title):Array.isArray(e.key)?e.key[0]:e.key,X=e=>{const t=[];return e.hideOnMobile&&t.push(A.hideOnMobile),t.join(" ")},q=e=>null==e||"string"==typeof e&&e.startsWith("[")&&e.endsWith("]")?"":"object"==typeof e?JSON.stringify(e):String(e),G=r((()=>{const e=[...i];if(null!==D&&B){const t=T[D];e.sort(((e,n)=>{const i=N(e,t.key),r=N(n,t.key);if(null==i)return 1;if(null==r)return-1;let o=0;if("string"==typeof i&&"string"==typeof r){const e=S(i),t=S(r);if(null!==e&&null!==t)o=e-t;else{const e=i.trim().replace(/[\s\u00a0]/g,"").replace(/,/g,""),t=r.trim().replace(/[\s\u00a0]/g,"").replace(/,/g,""),n=Number(e),l=Number(t);o=""!==e&&""!==t&&isFinite(n)&&isFinite(l)?n-l:i.localeCompare(r)}}else o="number"==typeof i&&"number"==typeof r?i-r:String(i).localeCompare(String(r));return"asc"===B?o:-o}))}return e}),[i,D,B,T]),Q=r((()=>G.filter((e=>{for(const[t,n]of Object.entries(P)){const i=parseInt(t),r=T[i],o=N(e,r.key),l=q(o).toLowerCase(),a=n.toLowerCase();if(!l.includes(a))return!1}return!0}))),[G,P,T]);l((()=>{L&&L(Q)}),[Q,L]);const Z="undefined"!=typeof window?window.innerHeight-250:600,ee=Math.max(0,Math.floor(K/49)-5),te=Math.min(Q.length,Math.ceil((K+Z)/49)+5),ne=Q.slice(ee,te),ie=49*Q.length,re=49*ee,oe=(e,t)=>{if(void 0!==e.id)return String(e.id);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)})(T.slice(0,3).map((t=>String(N(e,t.key)??""))).join("-"))}`};return i&&0!==i.length?t(n,{children:[e("div",{className:A.container,onScroll:e=>{_(e.currentTarget.scrollTop)},style:{maxHeight:"calc(100vh - 200px)",overflowY:"auto"},children:t("table",{className:A.table,children:[t("thead",{children:[t("tr",{children:[T.map(((n,i)=>{const r=n.maxWidth?{width:`${n.maxWidth}px`,maxWidth:`${n.maxWidth}px`}:{};return t("th",{className:`${A.th} ${X(n)}`.trim(),style:r,onClick:()=>(e=>{D===e?"asc"===B?z("desc"):"desc"===B&&(F(null),z(null)):(F(e),z("asc"))})(i),children:[U(n),D===i&&e("span",{className:A.sortIndicator,children:"asc"===B?"▲":"▼"})]},i)})),x&&e("th",{className:`${A.th} ${A.actionsColumn}`,style:{width:"100px"},children:J("Actions")})]}),t("tr",{children:[T.map(((n,i)=>{const r=n.maxWidth?{width:`${n.maxWidth}px`,maxWidth:`${n.maxWidth}px`}:{};return e("th",{className:X(n),style:r,children:n.filterable&&t("div",{className:A.filterWrapper,children:[e("input",{type:"text",className:A.filterInput,placeholder:J("Filter")+"...",value:P[i]||"",onChange:e=>((e,t)=>{V((n=>{const i={...n};return""===t.trim()?delete i[e]:i[e]=t,i}))})(i,e.target.value),onClick:e=>e.stopPropagation()}),(P[i]||"").length>0&&e(c,{appearance:"subtle",className:A.clearFilterButton,onClick:e=>{e.stopPropagation(),(e=>{V((t=>{const n={...t};return delete n[e],n}))})(i)},children:"×"})]})},i)})),x&&e("th",{className:A.actionsColumn})]})]}),t("tbody",{children:[ee>0&&e("tr",{style:{height:`${re}px`},children:e("td",{colSpan:T.length+(x?1:0),style:{padding:0,border:"none"}})}),ne.map(((n,i)=>{const r=n._index,o="number"==typeof r?r:ee+i;return t("tr",{className:A.tr,children:[T.map(((i,r)=>{const l=N(n,i.key),a=i.format?i.format(l):q(l),p=i.maxWidth?`${A.td} ${A.tdTruncated} ${X(i)}`.trim():`${A.td} ${X(i)}`.trim(),h=()=>{window.matchMedia("(hover: hover)").matches||i.maxWidth&&a.length>0&&(Y({title:U(i),text:a}),R(!0))};if("file"===i.type&&a)return e("td",{className:p,onClick:h,children:e("a",{href:C.getFileUrl(a),target:"_blank",rel:"noopener noreferrer",children:J("Download")})},r);if("checkbox"===i.type){return e("td",{className:p,children:e(s,{checked:!0===l||"true"===l||"yes"===l||"1"===l,onChange:(e,t)=>{$&&$(n,i.key,!0===t.checked,o)}})},r)}if("enum"===i.type&&i.enumOptions&&i.editable)return e("td",{className:p,children:t(d,{value:a,"aria-label":i.title?J(i.title):Array.isArray(i.key)?i.key[0]:i.key,onChange:(e,t)=>{I&&I(n,i.key,t.value,o)},style:{width:"100%"},children:[!i.enumOptions.includes(a)&&a&&e("option",{value:a,children:a}),i.enumOptions.map((t=>e("option",{value:t,children:J(t)},t)))]})},r);if("combobox"===i.type&&i.editable&&(i.enumOptions||i.enumOptionsLoader))return e("td",{className:p,children:e(W,{value:a,options:i.enumOptions,optionsLoader:i.enumOptionsLoader,minChars:i.enumOptionsLoaderMinChars,maxResults:i.enumOptionsLoaderMaxResults,columnKey:i.key,item:n,actualIndex:o,onEnumChange:I,label:i.title?J(i.title):Array.isArray(i.key)?i.key[0]:i.key,t:J})},r);const u=()=>i.maxWidth&&a.length>0?e(y,{content:{children:a,style:{maxWidth:"600px",whiteSpace:"normal"}},relationship:"description",children:e("span",{children:a})}):a,m=()=>{if(!i.action)return null;const t=i.action,r=i.action.icon,o=e(c,{appearance:"subtle",icon:e(r,{}),className:A.actionIcon,onClick:e=>{e.stopPropagation(),t.onClick(n)},size:"small"});return t.tooltip?e(y,{content:J(t.tooltip),relationship:"label",children:o}):o};return e("td",{className:p,onClick:h,children:i.action?t("div",{className:A.cellWithAction,children:[i.action.iconLeft&&m(),e("span",{className:A.cellText,children:u()}),!i.action.iconLeft&&m()]}):u()},r)})),x&&(g||O)&&e("td",{className:`${A.td} ${A.actionsColumn}`,children:t("div",{style:{display:"flex",gap:"4px",justifyContent:"center"},children:[g&&e(c,{appearance:"subtle",icon:e(b,{}),className:A.editButton,onClick:()=>g(n,o),title:J("Edit")}),O&&e(c,{appearance:"subtle",icon:e(w,{}),className:A.editButton,onClick:()=>O(n,o),title:J("Delete")})]})})]},oe(n,o))})),te<Q.length&&e("tr",{style:{height:ie-re-49*ne.length+"px"},children:e("td",{colSpan:T.length+(x?1:0),style:{padding:0,border:"none"}})})]})]})}),e(p,{open:E,onOpenChange:(e,t)=>R(t.open),children:e(h,{children:t(u,{children:[e(m,{children:H.title}),e(f,{className:A.dialogContent,children:H.text})]})})})]}):e("div",{className:A.emptyState,children:J("No data to display")})};var $=i.memo(O);export{O as ListView,$ as default};
1
+ import{jsx as e,jsxs as t,Fragment as n}from"react/jsx-runtime";import i,{useMemo as r,useState as o,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 x,Option as g,Tooltip as y}from"@fluentui/react-components";import{Edit24Regular as b,Delete24Regular as w}from"@fluentui/react-icons";import{CodicentService as C}from"../services/codicent.js";import v from"../hooks/useLocalization.js";const k=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:{"&: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}},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,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,t)=>{if("string"==typeof t)return e[t];for(const n of t)if(void 0!==e[n])return e[n]},W=({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]=o(t),[w,C]=o([]),[v,k]=o(!1),N=i.useRef(null);l((()=>{b(t)}),[t]),l((()=>{if(a){if(!(y.length<c))return N.current&&clearTimeout(N.current),N.current=setTimeout((async()=>{k(!0);try{const e=await a(y);C(e.slice(0,s))}finally{k(!1)}}),250),()=>{N.current&&clearTimeout(N.current)};C([])}}),[y,a,c,s]);const S=r((()=>(n??[]).filter((e=>e.toLowerCase().includes(y.toLowerCase()))).slice(0,s)),[n,y,s]),W=a?w:S;return e(x,{value:y,freeform:!0,"aria-label":m,placeholder:v?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(g,{value:t,children:t},t)))})},O=({data:i,columns:a,canEdit:x,onEdit:g,onDelete:O,onToggleCheckbox:$,onEnumChange:I,onFilteredDataChange:L})=>{const A=k(),{visibleColumns:T,defaultSortIndex:M,defaultSortDirection:j}=r((()=>{const e=i&&i.length>0?Array.from(new Set(i.flatMap((e=>Object.keys(e))))):[],t=(a||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}}),[i,a]),[D,F]=o(M>=0?M:null),[B,z]=o(j),[E,R]=o(!1),[H,P]=o({title:"",text:""}),[Y,V]=o({}),[K,_]=o(0),{t:J}=v(),U=e=>e.title?J(e.title):Array.isArray(e.key)?e.key[0]:e.key,X=e=>{const t=[];return e.hideOnMobile&&t.push(A.hideOnMobile),t.join(" ")},q=(e,t)=>{V((n=>{const i={...n};return""===t.trim()?delete i[e]:i[e]=t,i}))},G=e=>null==e||"string"==typeof e&&e.startsWith("[")&&e.endsWith("]")?"":"object"==typeof e?JSON.stringify(e):String(e),Q=r((()=>{const e=[...i];if(null!==D&&B){const t=T[D];e.sort(((e,n)=>{const i=S(e,t.key),r=S(n,t.key);if(null==i)return 1;if(null==r)return-1;let o=0;if("string"==typeof i&&"string"==typeof r){const e=N(i),t=N(r);if(null!==e&&null!==t)o=e-t;else{const e=i.trim().replace(/[\s\u00a0]/g,"").replace(/,/g,""),t=r.trim().replace(/[\s\u00a0]/g,"").replace(/,/g,""),n=Number(e),l=Number(t);o=""!==e&&""!==t&&isFinite(n)&&isFinite(l)?n-l:i.localeCompare(r)}}else o="number"==typeof i&&"number"==typeof r?i-r:String(i).localeCompare(String(r));return"asc"===B?o:-o}))}return e}),[i,D,B,T]),Z=r((()=>Q.filter((e=>{for(const[t,n]of Object.entries(Y)){const i=parseInt(t),r=T[i],o=S(e,r.key),l=G(o).toLowerCase(),a=n.toLowerCase();if(!("enum"===r.type&&r.enumOptions?l===a:l.includes(a)))return!1}return!0}))),[Q,Y,T]);l((()=>{L&&L(Z)}),[Z,L]);const ee="undefined"!=typeof window?window.innerHeight-250:600,te=Math.max(0,Math.floor(K/49)-5),ne=Math.min(Z.length,Math.ceil((K+ee)/49)+5),ie=Z.slice(te,ne),re=49*Z.length,oe=49*te,le=(e,t)=>{if(void 0!==e.id)return String(e.id);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)})(T.slice(0,3).map((t=>String(S(e,t.key)??""))).join("-"))}`};return i&&0!==i.length?t(n,{children:[e("div",{className:A.container,onScroll:e=>{_(e.currentTarget.scrollTop)},style:{maxHeight:"calc(100vh - 200px)",overflowY:"auto"},children:t("table",{className:A.table,children:[t("thead",{children:[t("tr",{children:[T.map(((n,i)=>{const r=n.maxWidth?{width:`${n.maxWidth}px`,maxWidth:`${n.maxWidth}px`}:{};return t("th",{className:`${A.th} ${X(n)}`.trim(),style:r,onClick:()=>(e=>{D===e?"asc"===B?z("desc"):"desc"===B&&(F(null),z(null)):(F(e),z("asc"))})(i),children:[U(n),D===i&&e("span",{className:A.sortIndicator,children:"asc"===B?"▲":"▼"})]},i)})),x&&e("th",{className:`${A.th} ${A.actionsColumn}`,style:{width:"100px"},children:J("Actions")})]}),t("tr",{children:[T.map(((i,r)=>{const o=i.maxWidth?{width:`${i.maxWidth}px`,maxWidth:`${i.maxWidth}px`}:{};return e("th",{className:X(i),style:o,children:i.filterable&&e("div",{className:A.filterWrapper,children:"enum"===i.type&&i.enumOptions?t(c,{className:A.filterInput,value:Y[r]||"",onChange:(e,t)=>q(r,t.value),onClick:e=>e.stopPropagation(),children:[e("option",{value:"",children:J("All")}),i.enumOptions.filter((e=>""!==e)).map((t=>e("option",{value:t,children:J(t)},t)))]}):t(n,{children:[e("input",{type:"text",className:A.filterInput,placeholder:J("Filter")+"...",value:Y[r]||"",onChange:e=>q(r,e.target.value),onClick:e=>e.stopPropagation()}),(Y[r]||"").length>0&&e(s,{appearance:"subtle",className:A.clearFilterButton,onClick:e=>{e.stopPropagation(),(e=>{V((t=>{const n={...t};return delete n[e],n}))})(r)},children:"×"})]})})},r)})),x&&e("th",{className:A.actionsColumn})]})]}),t("tbody",{children:[te>0&&e("tr",{style:{height:`${oe}px`},children:e("td",{colSpan:T.length+(x?1:0),style:{padding:0,border:"none"}})}),ie.map(((n,i)=>{const r=n._index,o="number"==typeof r?r:te+i;return t("tr",{className:A.tr,children:[T.map(((i,r)=>{const l=S(n,i.key),a=i.format?i.format(l):G(l),p=i.maxWidth?`${A.td} ${A.tdTruncated} ${X(i)}`.trim():`${A.td} ${X(i)}`.trim(),u=()=>{window.matchMedia("(hover: hover)").matches||i.maxWidth&&a.length>0&&(P({title:U(i),text:a}),R(!0))};if("file"===i.type&&a)return e("td",{className:p,onClick:u,children:e("a",{href:C.getFileUrl(a),target:"_blank",rel:"noopener noreferrer",children:J("Download")})},r);if("checkbox"===i.type){return e("td",{className:p,children:e(d,{checked:!0===l||"true"===l||"yes"===l||"1"===l,onChange:(e,t)=>{$&&$(n,i.key,!0===t.checked,o)}})},r)}if("enum"===i.type&&i.enumOptions&&i.editable)return e("td",{className:p,children:t(c,{value:a,"aria-label":i.title?J(i.title):Array.isArray(i.key)?i.key[0]:i.key,onChange:(e,t)=>{I&&I(n,i.key,t.value,o)},style:{width:"100%"},children:[!i.enumOptions.includes(a)&&a&&e("option",{value:a,children:a}),i.enumOptions.map((t=>e("option",{value:t,children:J(t)},t)))]})},r);if("combobox"===i.type&&i.editable&&(i.enumOptions||i.enumOptionsLoader))return e("td",{className:p,children:e(W,{value:a,options:i.enumOptions,optionsLoader:i.enumOptionsLoader,minChars:i.enumOptionsLoaderMinChars,maxResults:i.enumOptionsLoaderMaxResults,columnKey:i.key,item:n,actualIndex:o,onEnumChange:I,label:i.title?J(i.title):Array.isArray(i.key)?i.key[0]:i.key,t:J})},r);const h=()=>i.maxWidth&&a.length>0?e(y,{content:{children:a,style:{maxWidth:"600px",whiteSpace:"normal"}},relationship:"description",children:e("span",{children:a})}):a,m=()=>{if(!i.action)return null;const t=i.action,r=i.action.icon,o=e(s,{appearance:"subtle",icon:e(r,{}),className:A.actionIcon,onClick:e=>{e.stopPropagation(),t.onClick(n)},size:"small"});return t.tooltip?e(y,{content:J(t.tooltip),relationship:"label",children:o}):o};return e("td",{className:p,onClick:u,children:i.action?t("div",{className:A.cellWithAction,children:[i.action.iconLeft&&m(),e("span",{className:A.cellText,children:h()}),!i.action.iconLeft&&m()]}):h()},r)})),x&&(g||O)&&e("td",{className:`${A.td} ${A.actionsColumn}`,children:t("div",{style:{display:"flex",gap:"4px",justifyContent:"center"},children:[g&&e(s,{appearance:"subtle",icon:e(b,{}),className:A.editButton,onClick:()=>g(n,o),title:J("Edit")}),O&&e(s,{appearance:"subtle",icon:e(w,{}),className:A.editButton,onClick:()=>O(n,o),title:J("Delete")})]})})]},le(n,o))})),ne<Z.length&&e("tr",{style:{height:re-oe-49*ie.length+"px"},children:e("td",{colSpan:T.length+(x?1:0),style:{padding:0,border:"none"}})})]})]})}),e(p,{open:E,onOpenChange:(e,t)=>R(t.open),children:e(u,{children:t(h,{children:[e(m,{children:H.title}),e(f,{className:A.dialogContent,children:H.text})]})})})]}):e("div",{className:A.emptyState,children:J("No data to display")})};var $=i.memo(O);export{O as ListView,$ as default};
@@ -1 +1 @@
1
- {"version":3,"file":"useLocalization.d.ts","sourceRoot":"","sources":["../../../src/hooks/useLocalization.ts"],"names":[],"mappings":"AAOA,UAAU,cAAc;IACtB,MAAM,EAAE,cAAc,GAAG,WAAW,GAAG,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAAC;IACjF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAwGD,eAAO,MAAM,gBAAgB,YAAiB,CAAC;AAU/C,QAAA,MAAM,eAAe;aAsCX,MAAM;kBAyEA,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;;+BA3FC,MAAM;;;CAkK9C,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"useLocalization.d.ts","sourceRoot":"","sources":["../../../src/hooks/useLocalization.ts"],"names":[],"mappings":"AAOA,UAAU,cAAc;IACtB,MAAM,EAAE,cAAc,GAAG,WAAW,GAAG,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAAC;IACjF,QAAQ,EAAE,MAAM,CAAC;CAClB;AA6GD,eAAO,MAAM,gBAAgB,YAAiB,CAAC;AAa/C,QAAA,MAAM,eAAe;aA2CX,MAAM;kBAkFA,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;;+BApGC,MAAM;;;CA2K9C,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1 +1 @@
1
- import{useState as t,useEffect as e,useCallback as n}from"react";import r from"../node_modules/i18next/dist/esm/i18next.js";import{CodicentService as a}from"../services/codicent.js";import{getConfigValue as s}from"../config/index.js";import{initReactI18next as o}from"../node_modules/react-i18next/dist/es/initReactI18next.js";import{useTranslation as i}from"../node_modules/react-i18next/dist/es/useTranslation.js";const l=()=>{const t=s("FORCE_LANGUAGE");if(t)return{source:"force_config",language:t};if("undefined"!=typeof window){const t=new URLSearchParams(window.location.search),e=t.get("lang")||t.get("language");if(e)return{source:"url_param",language:e}}if("undefined"!=typeof window&&"undefined"!=typeof localStorage){const t=localStorage.getItem("user_language");if(t&&"auto"!==t)return{source:"user_preference",language:t}}if("undefined"!=typeof navigator&&navigator.language){return{source:"browser",language:navigator.language.split("-")[0]}}return{source:"default",language:s("DEFAULT_LANGUAGE")||"sv"}};let c=null;const g=()=>{if(null===c){const{language:t}=l();c=t}return c},u=()=>{const t=s("TRANSLATIONS");if(t){const e={};for(const[n,r]of Object.entries(t))e[n]={translation:r};return e}return{en:{translation:{Hello:"Hello"}},sv:{translation:{Hello:"Hej"}}}},d=()=>{if(r.isInitialized){const t=u();Object.keys(t).forEach((e=>{r.addResourceBundle(e,"translation",t[e].translation,!0,!0)}))}else r.use(o).init({resources:u(),lng:g(),fallbackLng:s("DEFAULT_LANGUAGE")||"sv",interpolation:{escapeValue:!1}})};d();const f=new Set;let m=JSON.parse(localStorage.getItem("app-translations")||"{}");const p=()=>{const{t:r,i18n:o}=i(),[c,u]=t((()=>g())),[p,_]=t(m);e((()=>{globalThis.__CODICENT_REINIT_I18N__&&(d(),globalThis.__CODICENT_REINIT_I18N__=!1)}),[]),e((()=>{o.changeLanguage(c)}),[c,o]);const h=n((t=>{const{source:e}=l();"force_config"!==e?"url_param"!==e?u(t):console.warn("Language setting ignored due to URL parameter"):console.warn("Language setting ignored due to FORCE_LANGUAGE configuration")}),[]),A=n((()=>l()),[]);return{t:n((t=>(o.exists(t)||(async(t,e)=>{const n=`${e} - ${t}`;let r=m[e]?.[t]||void 0;if(s("AUTO_TRANSLATE")&&!r&&!f.has(n)){f.add(n),localStorage.setItem("app-translations",JSON.stringify(m));try{r=(await a.getTranslations(t,e)).translation}catch(t){console.error("Error fetching translation:",t),r=void 0}finally{f.delete(n)}r&&r.includes("Error code:")&&(r=void 0),r&&(!t.trim().startsWith('"')&&r.trim().startsWith('"')&&r.trim().endsWith('"')&&(r=r.trim().slice(1,-1)),!t.trim().startsWith("'")&&r.trim().startsWith("'")&&r.trim().endsWith("'")&&(r=r.trim().slice(1,-1)),m[e]={...m[e],[t]:r},localStorage.setItem("app-translations",JSON.stringify(m)),_({...m}))}return r||t})(t,c).then((e=>{o.addResource(c,"translation",t,e)})),r(t))),[o,r,c]),tAsync:n((async t=>{const e=await(async(t,e)=>{const n=`${e} - ${t}`;let r=m[e]?.[t]||void 0;if(s("AUTO_TRANSLATE")&&!r&&!f.has(n)){f.add(n),localStorage.setItem("app-translations",JSON.stringify(m));try{r=(await a.getTranslations(t,e)).translation}catch(t){console.error("Error fetching translation:",t),r=void 0}finally{f.delete(n)}r&&r.includes("Error code:")&&(r=void 0),r&&(!t.trim().startsWith('"')&&r.trim().startsWith('"')&&r.trim().endsWith('"')&&(r=r.trim().slice(1,-1)),!t.trim().startsWith("'")&&r.trim().startsWith("'")&&r.trim().endsWith("'")&&(r=r.trim().slice(1,-1)),m[e]={...m[e],[t]:r},localStorage.setItem("app-translations",JSON.stringify(m)),_({...m}))}return r||t})(t,c);return o.exists(t)||o.addResource(c,"translation",t,e),e}),[o,c]),currentLanguage:c,setCurrentLanguage:h,getLanguageInfo:A,isForced:["force_config","url_param"].includes(l().source)}};export{p as default};
1
+ import{useState as t,useEffect as e,useCallback as n}from"react";import a from"../node_modules/i18next/dist/esm/i18next.js";import{CodicentService as r}from"../services/codicent.js";import{getConfigValue as o}from"../config/index.js";import{initReactI18next as s}from"../node_modules/react-i18next/dist/es/initReactI18next.js";import{useTranslation as i}from"../node_modules/react-i18next/dist/es/useTranslation.js";const l=()=>{const t=o("FORCE_LANGUAGE");if(t)return{source:"force_config",language:t};if("undefined"!=typeof window){const t=new URLSearchParams(window.location.search),e=t.get("lang")||t.get("language");if(e)return{source:"url_param",language:e}}if("undefined"!=typeof window&&"undefined"!=typeof localStorage){const t=localStorage.getItem("user_language");if(t&&"auto"!==t)return{source:"user_preference",language:t};if("auto"===t&&"undefined"!=typeof navigator&&navigator.language){return{source:"browser",language:navigator.language.split("-")[0]}}}const e=o("DEFAULT_LANGUAGE");if(e)return{source:"default",language:e};if("undefined"!=typeof navigator&&navigator.language){return{source:"browser",language:navigator.language.split("-")[0]}}return{source:"default",language:"sv"}},c=()=>l().language,g=()=>{const t=o("TRANSLATIONS");if(t){const e={};for(const[n,a]of Object.entries(t))e[n]={translation:a};return e}return{en:{translation:{Hello:"Hello"}},sv:{translation:{Hello:"Hej"}}}},u=()=>{if(a.isInitialized){const t=g();Object.keys(t).forEach((e=>{a.addResourceBundle(e,"translation",t[e].translation,!0,!0)}))}else a.use(s).init({resources:g(),lng:c(),fallbackLng:o("DEFAULT_LANGUAGE")||"sv",interpolation:{escapeValue:!1}})};u();const d=new Set;let f=JSON.parse(localStorage.getItem("app-translations")||"{}");const m=new Set,p=()=>{const{t:a,i18n:s}=i(),[g,p]=t((()=>c())),[_,h]=t(f);e((()=>{if(globalThis.__CODICENT_REINIT_I18N__){u(),globalThis.__CODICENT_REINIT_I18N__=!1;const t=c();p(t)}}),[]),e((()=>{s.changeLanguage(g)}),[g,s]);const A=n((t=>{const{source:e}=l();"force_config"!==e?"url_param"!==e?p(t):console.warn("Language setting ignored due to URL parameter"):console.warn("Language setting ignored due to FORCE_LANGUAGE configuration")}),[]),T=n((()=>l()),[]);return{t:n((t=>{if(!s.exists(t)){if(!o("AUTO_TRANSLATE")&&"sv"!==g){const e=`${g}:${t}`;m.has(e)||(m.add(e),console.warn(`[i18n] Missing translation for key "${t}" in language "${g}"`))}(async(t,e)=>{const n=`${e} - ${t}`;let a=f[e]?.[t]||void 0;if(o("AUTO_TRANSLATE")&&!a&&!d.has(n)){d.add(n),localStorage.setItem("app-translations",JSON.stringify(f));try{a=(await r.getTranslations(t,e)).translation}catch(t){console.error("Error fetching translation:",t),a=void 0}finally{d.delete(n)}a&&a.includes("Error code:")&&(a=void 0),a&&(!t.trim().startsWith('"')&&a.trim().startsWith('"')&&a.trim().endsWith('"')&&(a=a.trim().slice(1,-1)),!t.trim().startsWith("'")&&a.trim().startsWith("'")&&a.trim().endsWith("'")&&(a=a.trim().slice(1,-1)),f[e]={...f[e],[t]:a},localStorage.setItem("app-translations",JSON.stringify(f)),h({...f}))}return a||t})(t,g).then((e=>{s.addResource(g,"translation",t,e)}))}return a(t)}),[s,a,g]),tAsync:n((async t=>{const e=await(async(t,e)=>{const n=`${e} - ${t}`;let a=f[e]?.[t]||void 0;if(o("AUTO_TRANSLATE")&&!a&&!d.has(n)){d.add(n),localStorage.setItem("app-translations",JSON.stringify(f));try{a=(await r.getTranslations(t,e)).translation}catch(t){console.error("Error fetching translation:",t),a=void 0}finally{d.delete(n)}a&&a.includes("Error code:")&&(a=void 0),a&&(!t.trim().startsWith('"')&&a.trim().startsWith('"')&&a.trim().endsWith('"')&&(a=a.trim().slice(1,-1)),!t.trim().startsWith("'")&&a.trim().startsWith("'")&&a.trim().endsWith("'")&&(a=a.trim().slice(1,-1)),f[e]={...f[e],[t]:a},localStorage.setItem("app-translations",JSON.stringify(f)),h({...f}))}return a||t})(t,g);return s.exists(t)||s.addResource(g,"translation",t,e),e}),[s,g]),currentLanguage:g,setCurrentLanguage:A,getLanguageInfo:T,isForced:["force_config","url_param"].includes(l().source)}};export{p as default};
@@ -1 +1 @@
1
- {"version":3,"file":"useUserRoles.d.ts","sourceRoot":"","sources":["../../../src/hooks/useUserRoles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,YAAa,eAAe,oBAAoB,MAAM,oBAAoB,MAAM;;;;oCAiC1F,MAAM,KAAG,MAAM;gCAgBO,MAAM,KAAG,MAAM;8BAUjB,MAAM,QAAQ,QAAQ,KAAG,OAAO;+BAe/B,MAAM,KAAG,QAAQ,GAAG,SAAS;mCAKzB,MAAM,KAAG,MAAM,EAAE;8BASxB,QAAQ,GAAG,SAAS;8BAKR,MAAM;CAiBlD,CAAC"}
1
+ {"version":3,"file":"useUserRoles.d.ts","sourceRoot":"","sources":["../../../src/hooks/useUserRoles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,YAAa,eAAe,oBAAoB,MAAM,oBAAoB,MAAM;;;;oCAmC1F,MAAM,KAAG,MAAM;gCAgBO,MAAM,KAAG,MAAM;8BAUjB,MAAM,QAAQ,QAAQ,KAAG,OAAO;+BAe/B,MAAM,KAAG,QAAQ,GAAG,SAAS;mCAKzB,MAAM,KAAG,MAAM,EAAE;8BASxB,QAAQ,GAAG,SAAS;8BAKR,MAAM;CAiBlD,CAAC"}
@@ -1 +1 @@
1
- import{useState as e,useEffect as r,useCallback as t}from"react";import n from"../utils/MessageContent.js";const s=(s,o,a)=>{const[i,m]=e([]),[l,c]=e(!0),[u,f]=e(null);r((()=>{if(!o)return;if(!a)return;(async()=>{try{c(!0),f(null);const e=(await s.getMessagesFast(["user_role"],void 0,100)).map((e=>{const r=new n(e.content).data;return r&&"object"==typeof r?r:null})).filter((e=>null!==e));m(e)}catch(e){console.error("Failed to fetch user roles:",e),f(e instanceof Error?e.message:"Failed to fetch user roles")}finally{c(!1)}})()}),[s,o,a]);const p=t((e=>{if(!e)return"";const r=e.toLowerCase(),t=i.find((e=>{if(!e.nicknames)return!1;return e.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===r))}));return t?.name||e}),[i]),C=(e,r)=>{if(!e||!r)return!1;const t=e.toLowerCase();if(r.nicknames){if(r.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===t)))return!0}return r.name?.toLowerCase()===t||r.email?.toLowerCase()===t},g=e=>{if(e)return i.find((r=>C(e,r)))},w=t((()=>o?p(o):""),[o,p]);return{userRoles:i,loading:l,error:u,getNameFromNickname:p,getNicknameFromName:e=>{if(!e)return"";const r=i.find((r=>r.name?.toLowerCase()===e.toLowerCase()));if(r?.nicknames){return r.nicknames.split(",").map((e=>e.trim()))[0]||e}return e},isUserMatch:C,findUserRole:g,getClaimsForUser:e=>{const r=g(e);return r?.claims?r.claims.split(",").map((e=>e.trim())).filter(Boolean):[]},getCurrentUserRole:()=>{if(o)return g(o)},getCurrentUserName:w}};export{s as useUserRoles};
1
+ import{useState as e,useEffect as r,useCallback as t}from"react";import n from"../utils/MessageContent.js";const o=(o,s,a)=>{const[i,m]=e([]),[l,c]=e(!0),[u,f]=e(null);r((()=>{if(!s||!a)return void c(!1);(async()=>{try{c(!0),f(null);const e=(await o.getMessagesFast(["user_role"],void 0,100)).map((e=>{const r=new n(e.content).data;return r&&"object"==typeof r?r:null})).filter((e=>null!==e));m(e)}catch(e){console.error("Failed to fetch user roles:",e),f(e instanceof Error?e.message:"Failed to fetch user roles")}finally{c(!1)}})()}),[o,s,a]);const p=t((e=>{if(!e)return"";const r=e.toLowerCase(),t=i.find((e=>{if(!e.nicknames)return!1;return e.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===r))}));return t?.name||e}),[i]),C=(e,r)=>{if(!e||!r)return!1;const t=e.toLowerCase();if(r.nicknames){if(r.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===t)))return!0}return r.name?.toLowerCase()===t||r.email?.toLowerCase()===t},d=e=>{if(e)return i.find((r=>C(e,r)))},g=t((()=>s?p(s):""),[s,p]);return{userRoles:i,loading:l,error:u,getNameFromNickname:p,getNicknameFromName:e=>{if(!e)return"";const r=i.find((r=>r.name?.toLowerCase()===e.toLowerCase()));if(r?.nicknames){return r.nicknames.split(",").map((e=>e.trim()))[0]||e}return e},isUserMatch:C,findUserRole:d,getClaimsForUser:e=>{const r=d(e);return r?.claims?r.claims.split(",").map((e=>e.trim())).filter(Boolean):[]},getCurrentUserRole:()=>{if(s)return d(s)},getCurrentUserName:g}};export{o as useUserRoles};
@@ -1,12 +1,18 @@
1
1
  import type { ColumnDefinition } from "../components/ListView";
2
+ import type { ListConfig } from "../types";
2
3
  import { CodicentAppState } from "../hooks/useCodicentApp";
3
4
  export interface ListPageProps {
4
5
  state: CodicentAppState;
5
6
  /** Returns column definitions for a given tag. Falls back to all data keys if not provided. */
6
7
  getColumnDefs?: (tag: string) => ColumnDefinition[];
8
+ /**
9
+ * Returns full list configuration (columns + optional deduplicateBy) for a given tag.
10
+ * When provided, takes precedence over getColumnDefs for deriving column definitions.
11
+ */
12
+ getListConfig?: (tag: string) => ListConfig | undefined;
7
13
  /** Optional data filter applied after fetch. Useful for app-specific filtering (e.g. empty notes). */
8
14
  filterData?: (data: DataMessage[], tag: string) => DataMessage[];
9
15
  }
10
- export declare const ListPage: ({ state, getColumnDefs, filterData }: ListPageProps) => import("react/jsx-runtime").JSX.Element;
16
+ export declare const ListPage: ({ state, getColumnDefs, getListConfig, filterData }: ListPageProps) => import("react/jsx-runtime").JSX.Element;
11
17
  export default ListPage;
12
18
  //# sourceMappingURL=ListPage.d.ts.map
@@ -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;AAuB/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAkE3D,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,sGAAsG;IACtG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;CAClE;AAED,eAAO,MAAM,QAAQ,yCAA0C,aAAa,4CA+jB3E,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;AAkE3D,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,eAAO,MAAM,QAAQ,wDAAyD,aAAa,4CAylB1F,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 m,DialogBody as p,DialogTitle as d,DialogContent as u,DialogActions as g}from"@fluentui/react-components";import"../components/Spinner.js";import h 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 f,ArrowClockwise24Regular as j,ArrowDownload24Regular as x,Add24Regular as w}from"@fluentui/react-icons";import"../services/codicent.js";import{dataCache as C}from"../services/dataCache.js";import y 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 S,useNavigate as v}from"react-router-dom";import"./Purchase.js";import"../components/Content.js";import{Page as k}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 M 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 I from"../components/ListView.js";import{RecordModal as T}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 _=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:"0",paddingRight:"0"},listContainer:{overflow:"hidden",flex:1,minHeight:0,marginTop:"10px"},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"}}),P=500,E=({state:s,getColumnDefs:E,filterData:B})=>{const[N,R]=S(),F=N.get("tag")||"logbook",L=N.get("title")||"",U=N.get("contentTitle"),H="true"===N.get("loadAll"),O="true"===N.get("canAdd"),W="true"===N.get("canEdit"),q="false"!==N.get("canExport"),z=N.get("addUrl")||"",V=N.get("q")||"",[G,J]=o(V),[Q,K]=o(V),{service:X}=s,[Y,Z]=o([]),[tt,et]=o(!1),[ot,nt]=o(!1),[rt,it]=o(!1),at=n(null),st=n(V),ct=n(""),lt=n(!0),[mt,pt]=o(0),[dt,ut]=o(null),gt=_(),{t:ht}=b(),ft=v(),{getCurrentUserName:jt}=D(X,s.context.nickname,s.context.selectedApp),xt=r((()=>(U?[{key:U,title:U,maxWidth:250}]:E?E(F):[]).map((t=>({...t,title:t.title?ht(t.title):void 0})))),[U,F,ht,E]),[wt,Ct]=o(!1),[yt,At]=o(null),[St,vt]=o(!1),[kt,bt]=o(null),Dt=r((()=>`listpage_searches_${F}`),[F]),Mt=t=>{try{const e=localStorage.getItem(t);return e?JSON.parse(e):[]}catch{return[]}},[It,Tt]=o((()=>Mt(Dt)));i((()=>{Tt(Mt(Dt))}),[Dt]);const $t=a((t=>{const e=t.trim();e&&Tt((t=>{const o=[e,...t.filter((t=>t!==e))].slice(0,20);try{localStorage.setItem(Dt,JSON.stringify(o))}catch{}return o}))}),[Dt]),_t=a((t=>{Tt((e=>{const o=e.filter((e=>e!==t));try{localStorage.setItem(Dt,JSON.stringify(o))}catch{}return o}))}),[Dt]),Pt=r((()=>$.debounce((t=>K(t)),500)),[K]);i((()=>()=>{Pt.cancel()}),[Pt]);const Et=a((t=>{J(t),Pt(t)}),[Pt]),Bt=a((t=>{$t(t)}),[$t]);i((()=>{if(!N.get("q")){const t=N.get(`filter_${F}`);if(t){let e=t;if("%USERNAME%"===e){const t=jt();if(!t)return;e=t}J(e),K(e),st.current=e}}}),[F,N,jt]),i((()=>{const t=N.get("q")||"";t!==st.current&&(J(t),K(t),st.current=t,ct.current="")}),[N]),i((()=>(at.current&&clearTimeout(at.current),at.current=setTimeout((()=>{if(st.current!==G){const t={title:L,tag:F};U&&(t.contentTitle=U),G&&(t.q=G),H&&(t.loadAll="true"),R(t,{replace:!0}),st.current=G}}),500),()=>{at.current&&clearTimeout(at.current)})),[G,F,L,U,H,R]),i((()=>{lt.current=!0;const t=`${F}-${U}-${H}-${mt}-${Q}`;if(t===ct.current)return;ct.current=t;const e=U?`${F}-${Q}-${U}`:`${F}-${Q||"all"}`,o=C.get(e);if(!o){if(nt(!1),et(!0),U)X.getMessagesFast([F],Q).then((t=>{if(!lt.current)return void et(!1);const o=t.map((t=>{const e=new Date(t.createdAt).toLocaleString();return{id:t.id,data:{[U]:new y(t.content).content,createdAt:e},fileId:null,fileIds:[],tags:[F],mentions:[X.codicent],createdAt:e}}));C.set(e,o),lt.current&&Z(o)})).catch(console.warn).finally((()=>et(!1)));else{const t=Q||"",o=H||t?void 0:P;X.readDataMessages(F,t,void 0,0,o).then((o=>{C.set(e,o),lt.current?(Z(o),nt(!H&&!t&&o.length===P)):et(!1)})).catch(console.warn).finally((()=>et(!1)))}return()=>{lt.current=!1}}if(Z(o),nt(!H&&!U&&o.length>=P),!U&&!Q&&o.length>0){const t=o.reduce(((t,e)=>e.createdAt>t?e.createdAt:t),o[0].createdAt);X.readDataMessages(F,"",void 0,void 0,void 0,t).then((t=>{lt.current&&Z((o=>{const n=new Set(o.map((t=>t.id))),r=t.filter((t=>!n.has(t.id)));if(0===r.length)return o;const i=[...r,...o];return C.set(e,i),i}))})).catch(console.warn)}}),[X,F,U,H,Q,mt]);const Nt=r((()=>{const t={};N.forEach(((e,o)=>{o.startsWith("filter_")&&(t[o.replace("filter_","")]=e)}));let e=Y.map(((t,e)=>({item:t,index:e})));for(const[o,n]of Object.entries(t)){const t=n.replace("%USERNAME%",jt()),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(B){const t=B(e.map((({item:t})=>t)),F),o=new Set(t.map((t=>t.id)));e=e.filter((({item:t})=>o.has(t.id)))}return e.map((({item:t,index:e})=>({...t.data,createdAt:t.createdAt,_id:t.id,originalMessageId:t.originalMessageId||t.id,_index:e})))}),[Y,N,s.context.nickname,jt,B,F]),Rt=r((()=>{const t=(G||"").trim().toLowerCase();if(!t)return Nt;const e=xt.filter((t=>!t.hidden)).map((t=>t.key));return Nt.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}))}),[Nt,G,xt]),Ft=a((()=>{C.clearPattern(F),ct.current="",pt((t=>t+1))}),[F]),Lt=a((async()=>{it(!0);try{const t=await X.readDataMessages(F,"",void 0,Y.length,P),e=[...Y,...t];Z(e),C.set(`${F}-all`,e),nt(t.length===P)}catch(t){console.warn(t)}finally{it(!1)}}),[Y,X,F]),Ut=a((t=>{ut(t)}),[]),Ht=()=>{vt(!1),bt(null)},Ot=a((async()=>{const t=`${F}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const e=null!==dt?dt:Rt;await A(e,xt,t,ht)||console.warn("No data to export")}),[dt,Rt,xt,F,ht]),Wt=r((()=>null!==dt?dt.length:Rt.length),[dt,Rt]);return t(k,{hideHeader:!0,children:e("div",{className:gt.container,children:[t("div",{className:gt.backButton,children:t(c,{appearance:"subtle",icon:t(f,{}),onClick:()=>ft(-1),children:ht("Tillbaka")})}),e("div",{className:gt.headerRow,children:[t(h,{title:ht(L||"Loggbok")}),e("div",{className:gt.buttonGroup,children:[t(c,{appearance:"subtle",icon:t(j,{}),onClick:Ft,title:ht("Refresh"),children:ht("Refresh")}),q&&t(c,{appearance:"subtle",icon:t(x,{}),onClick:Ot,title:ht("Export to Excel"),children:ht("Export to Excel")}),(O||z)&&t(c,{appearance:"primary",icon:t(w,{}),onClick:O?()=>{At(null),Ct(!0)}:()=>window.open(z,"_blank"),className:gt.addButton,children:ht("Add Record")})]})]}),t("div",{className:gt.searchBox,children:t(M,{placeholder:ht("Sök")+"...",value:G,onChange:Et,recentSearches:It,onCommitSearch:Bt,onRemoveRecentSearch:_t})}),!tt&&e("div",{className:gt.recordsCount,children:[ht("Total"),": ",Wt," ",ht("records"),Wt!==Y.length&&` (${ht("filtered from")} ${Y.length})`]}),e("div",{className:gt.listContainer,children:[tt&&t("p",{children:ht("Söker")+"..."}),!tt&&t(I,{data:Rt,columns:xt,canEdit:W,onEdit:(t,e)=>{const o=Y[e];o&&(At({data:{...o.data},index:e}),Ct(!0))},onDelete:(t,e)=>{const o=Y[e];o&&(bt({index:e,id:o.id}),vt(!0))},onToggleCheckbox:async(t,e,o,n)=>{const r=Y[n];if(r){const t=Array.isArray(e)?e[0]:e,i={...r.data,[t]:String(o)},a=await X.updateDataMessage(r.id,i);Z((t=>{const e=[...t];return e[n]={...r,id:a,data:i},e})),C.clearPattern(F)}},onEnumChange:async(t,e,o,n)=>{const r=Y[n];if(r){const t=Array.isArray(e)?e[0]:e,i={...r.data,[t]:o},a=await X.updateDataMessage(r.id,i);Z((t=>{const e=[...t];return e[n]={...r,id:a,data:i},e})),C.clearPattern(F)}},onFilteredDataChange:Ut})]}),ot&&!G.trim()&&t("div",{className:gt.loadMoreContainer,children:t(c,{appearance:"primary",size:"medium",onClick:Lt,disabled:rt,children:rt?ht("Laddar..."):ht("Visa fler")+` (${Y.length} ${ht("laddade")})`})}),t(T,{open:wt,onClose:()=>Ct(!1),onSave:async t=>{if(yt){const e=Y[yt.index];if(e){const o={};for(const e in t){const n=t[e];o[e]=null==n?"":String(n)}const n=await X.updateDataMessage(e.id,o);Z((t=>{const r=[...t];return r[yt.index]={...e,id:n,data:o},r})),C.clearPattern(F)}}else{const e={};for(const o in t){const n=t[o];e[o]=null==n?"":String(n)}const o={id:await X.createDataMessage(F,e),data:e,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[F],mentions:[X.codicent]};Z((t=>[o,...t])),C.clearPattern(F)}},columns:xt,initialData:yt?.data}),t(l,{open:St,onOpenChange:(t,e)=>!e.open&&Ht(),children:t(m,{children:e(p,{children:[t(d,{children:ht("Confirm Delete")}),t(u,{children:ht("Are you sure you want to delete this record? This action cannot be undone.")}),e(g,{children:[t(c,{appearance:"secondary",onClick:Ht,children:ht("Cancel")}),t(c,{appearance:"primary",onClick:async()=>{if(kt)try{await X.deleteDataMessage(kt.id),Z((t=>t.filter(((t,e)=>e!==kt.index)))),C.clearPattern(F)}catch(t){console.error("Failed to delete record:",t)}finally{vt(!1),bt(null)}},children:ht("Delete")})]})]})})})]})})};export{E as ListPage,E 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 m,DialogTitle as p,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 w}from"@fluentui/react-icons";import"../services/codicent.js";import{dataCache as y}from"../services/dataCache.js";import C 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 S,useNavigate as v}from"react-router-dom";import"./Purchase.js";import"../components/Content.js";import{Page as k}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 M 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 I from"../components/ListView.js";import{RecordModal as T}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 _=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:"0",paddingRight:"0"},listContainer:{overflow:"hidden",flex:1,minHeight:0,marginTop:"10px"},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"}}),P=500,B=({state:s,getColumnDefs:B,getListConfig:E,filterData:N})=>{const[R,L]=S(),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,Q]=o(G),[K,X]=o(G),{service:Y}=s,[Z,tt]=o([]),[et,ot]=o(!1),[nt,rt]=o(!1),[it,at]=o(!1),st=n(null),ct=n(G),lt=n(""),dt=n(!0),[mt,pt]=o(0),[ut,gt]=o(null),ft=_(),{t:ht}=b(),jt=v(),{getCurrentUserName:xt}=D(Y,s.context.nickname,s.context.selectedApp),wt=r((()=>(H?[{key:H,title:H,maxWidth:250}]:E?E(F)?.columns??[]:B?B(F):[]).map((t=>({...t,title:t.title?ht(t.title):void 0})))),[H,F,ht,B,E]),[yt,Ct]=o(!1),[At,St]=o(null),[vt,kt]=o(!1),[bt,Dt]=o(null),Mt=r((()=>`listpage_searches_${F}`),[F]),It=t=>{try{const e=localStorage.getItem(t);return e?JSON.parse(e):[]}catch{return[]}},[Tt,$t]=o((()=>It(Mt)));i((()=>{$t(It(Mt))}),[Mt]);const _t=a((t=>{const e=t.trim();e&&$t((t=>{const o=[e,...t.filter((t=>t!==e))].slice(0,20);try{localStorage.setItem(Mt,JSON.stringify(o))}catch{}return o}))}),[Mt]),Pt=a((t=>{$t((e=>{const o=e.filter((e=>e!==t));try{localStorage.setItem(Mt,JSON.stringify(o))}catch{}return o}))}),[Mt]),Bt=r((()=>$.debounce((t=>X(t)),500)),[X]);i((()=>()=>{Bt.cancel()}),[Bt]);const Et=a((t=>{Q(t),Bt(t)}),[Bt]),Nt=a((t=>{_t(t)}),[_t]);i((()=>{if(!R.get("q")){const t=R.get(`filter_${F}`);if(t){let e=t;if("%USERNAME%"===e){const t=xt();if(!t)return;e=t}Q(e),X(e),ct.current=e}}}),[F,R,xt]),i((()=>{const t=R.get("q")||"";t!==ct.current&&(Q(t),X(t),ct.current=t,lt.current="")}),[R]),i((()=>(st.current&&clearTimeout(st.current),st.current=setTimeout((()=>{if(ct.current!==J){const t={title:U,tag:F};H&&(t.contentTitle=H),J&&(t.q=J),O&&(t.loadAll="true"),L(t,{replace:!0}),ct.current=J}}),500),()=>{st.current&&clearTimeout(st.current)})),[J,F,U,H,O,L]),i((()=>{dt.current=!0;const t=`${F}-${H}-${O}-${mt}-${K}`;if(t===lt.current)return;lt.current=t;const e=H?`${F}-${K}-${H}`:`${F}-${K||"all"}`,o=y.get(e);if(!o){if(rt(!1),ot(!0),H)Y.getMessagesFast([F],K).then((t=>{if(!dt.current)return void ot(!1);const o=t.map((t=>{const e=new Date(t.createdAt).toLocaleString();return{id:t.id,data:{[H]:new C(t.content).content,createdAt:e},fileId:null,fileIds:[],tags:[F],mentions:[Y.codicent],createdAt:e}}));y.set(e,o),dt.current&&tt(o)})).catch(console.warn).finally((()=>ot(!1)));else{const t=K||"",o=O||t?void 0:P;Y.readDataMessages(F,t,void 0,0,o).then((o=>{y.set(e,o),dt.current?(tt(o),rt(!O&&!t&&o.length===P)):ot(!1)})).catch(console.warn).finally((()=>ot(!1)))}return()=>{dt.current=!1}}if(tt(o),rt(!O&&!H&&o.length>=P),!H&&!K&&o.length>0){const t=o.reduce(((t,e)=>e.createdAt>t?e.createdAt:t),o[0].createdAt);Y.readDataMessages(F,"",void 0,void 0,void 0,t).then((t=>{dt.current&&tt((o=>{const n=new Set(o.map((t=>t.id))),r=t.filter((t=>!n.has(t.id)));if(0===r.length)return o;const i=[...r,...o];return y.set(e,i),i}))})).catch(console.warn)}}),[Y,F,H,O,K,mt]);const Rt=r((()=>{const t={};R.forEach(((e,o)=>{o.startsWith("filter_")&&(t[o.replace("filter_","")]=e)}));let e=Z.map(((t,e)=>({item:t,index:e})));for(const[o,n]of Object.entries(t)){const t=n.replace("%USERNAME%",xt()),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,_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}),[Z,R,s.context.nickname,xt,N,F,E]),Lt=r((()=>{const t=(J||"").trim().toLowerCase();if(!t)return Rt;const e=wt.filter((t=>!t.hidden)).map((t=>t.key));return Rt.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}))}),[Rt,J,wt]),Ft=a((()=>{y.clearPattern(F),lt.current="",pt((t=>t+1))}),[F]),Ut=a((async()=>{at(!0);try{const t=await Y.readDataMessages(F,"",void 0,Z.length,P),e=[...Z,...t];tt(e),y.set(`${F}-all`,e),rt(t.length===P)}catch(t){console.warn(t)}finally{at(!1)}}),[Z,Y,F]),Ht=a((t=>{gt(t)}),[]),Ot=()=>{kt(!1),Dt(null)},Wt=a((async()=>{const t=`${F}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const e=null!==ut?ut:Lt;await A(e,wt,t,ht)||console.warn("No data to export")}),[ut,Lt,wt,F,ht]),qt=r((()=>null!==ut?ut.length:Lt.length),[ut,Lt]);return t(k,{hideHeader:!0,children:e("div",{className:ft.container,children:[t("div",{className:ft.backButton,children:t(c,{appearance:"subtle",icon:t(h,{}),onClick:()=>jt(-1),children:ht("Tillbaka")})}),e("div",{className:ft.headerRow,children:[t(f,{title:ht(U||"Loggbok")}),e("div",{className:ft.buttonGroup,children:[t(c,{appearance:"subtle",icon:t(j,{}),onClick:Ft,title:ht("Refresh"),children:ht("Refresh")}),z&&t(c,{appearance:"subtle",icon:t(x,{}),onClick:Wt,title:ht("Export to Excel"),children:ht("Export to Excel")}),(W||V)&&t(c,{appearance:"primary",icon:t(w,{}),onClick:W?()=>{St(null),Ct(!0)}:()=>window.open(V,"_blank"),className:ft.addButton,children:ht("Add Record")})]})]}),t("div",{className:ft.searchBox,children:t(M,{placeholder:ht("Sök")+"...",value:J,onChange:Et,recentSearches:Tt,onCommitSearch:Nt,onRemoveRecentSearch:Pt})}),!et&&e("div",{className:ft.recordsCount,children:[ht("Total"),": ",qt," ",ht("records"),qt!==Z.length&&` (${ht("filtered from")} ${Z.length})`]}),e("div",{className:ft.listContainer,children:[et&&t("p",{children:ht("Söker")+"..."}),!et&&t(I,{data:Lt,columns:wt,canEdit:q,onEdit:(t,e)=>{const o=Z[e];o&&(St({data:{...o.data},index:e}),Ct(!0))},onDelete:(t,e)=>{const o=Z[e];o&&(Dt({index:e,id:o.id}),kt(!0))},onToggleCheckbox:async(t,e,o,n)=>{const r=Z[n];if(r){const t=Array.isArray(e)?e[0]:e,i={...r.data,[t]:String(o)},a=await Y.updateDataMessage(r.id,i);tt((t=>{const e=[...t];return e[n]={...r,id:a,data:i},e})),y.clearPattern(F)}},onEnumChange:async(t,e,o,n)=>{const r=Z[n];if(r){const t=Array.isArray(e)?e[0]:e,i={...r.data,[t]:o},a=await Y.updateDataMessage(r.id,i);tt((t=>{const e=[...t];return e[n]={...r,id:a,data:i},e})),y.clearPattern(F)}},onFilteredDataChange:Ht})]}),nt&&!J.trim()&&t("div",{className:ft.loadMoreContainer,children:t(c,{appearance:"primary",size:"medium",onClick:Ut,disabled:it,children:it?ht("Laddar..."):ht("Visa fler")+` (${Z.length} ${ht("laddade")})`})}),t(T,{open:yt,onClose:()=>Ct(!1),onSave:async t=>{if(At){const e=Z[At.index];if(e){const o={};for(const e in t){const n=t[e];o[e]=null==n?"":String(n)}const n=await Y.updateDataMessage(e.id,o);tt((t=>{const r=[...t];return r[At.index]={...e,id:n,data:o},r})),y.clearPattern(F)}}else{const e={};for(const o in t){const n=t[o];e[o]=null==n?"":String(n)}const o={id:await Y.createDataMessage(F,e),data:e,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[F],mentions:[Y.codicent]};tt((t=>[o,...t])),y.clearPattern(F)}},columns:wt,initialData:At?.data}),t(l,{open:vt,onOpenChange:(t,e)=>!e.open&&Ot(),children:t(d,{children:e(m,{children:[t(p,{children:ht("Confirm Delete")}),t(u,{children:ht("Are you sure you want to delete this record? This action cannot be undone.")}),e(g,{children:[t(c,{appearance:"secondary",onClick:Ot,children:ht("Cancel")}),t(c,{appearance:"primary",onClick:async()=>{if(bt)try{await Y.deleteDataMessage(bt.id),tt((t=>t.filter(((t,e)=>e!==bt.index)))),y.clearPattern(F)}catch(t){console.error("Failed to delete record:",t)}finally{kt(!1),Dt(null)}},children:ht("Delete")})]})]})})})]})})};export{B as ListPage,B as default};
@@ -29,11 +29,27 @@ export * from "./audit";
29
29
  import type { ColumnAction, ColumnDefinition } from "../components/ListView";
30
30
  export type { ColumnAction, ColumnDefinition };
31
31
  /**
32
- * List definitions keyed by tag name (e.g., "customer2", "offertjson")
32
+ * Configuration for a single list view, supporting column definitions and optional deduplication.
33
+ * @public
34
+ */
35
+ export interface ListConfig {
36
+ /** Column definitions for this list */
37
+ columns: ColumnDefinition[];
38
+ /**
39
+ * When set, only the most recent message per unique value of this key is shown.
40
+ * When an array is provided, keys are tried in order and the first truthy value is used.
41
+ * Useful for cases where multiple independent messages represent the same entity
42
+ * (e.g. same customer number or offer number) and only the latest should be displayed.
43
+ */
44
+ deduplicateBy?: string | string[];
45
+ }
46
+ /**
47
+ * List definitions keyed by tag name (e.g., "customer2", "offertjson").
48
+ * Each entry can be a plain column-definition array (backward-compatible) or a full ListConfig.
33
49
  * @public
34
50
  */
35
51
  export interface ListDefinitions {
36
- [tagName: string]: ColumnDefinition[];
52
+ [tagName: string]: ColumnDefinition[] | ListConfig;
37
53
  }
38
54
  /**
39
55
  * AI chat instructions configuration
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1870,11 +1870,27 @@ interface ButtonConfig {
1870
1870
  }
1871
1871
 
1872
1872
  /**
1873
- * List definitions keyed by tag name (e.g., "customer2", "offertjson")
1873
+ * Configuration for a single list view, supporting column definitions and optional deduplication.
1874
+ * @public
1875
+ */
1876
+ interface ListConfig {
1877
+ /** Column definitions for this list */
1878
+ columns: ColumnDefinition[];
1879
+ /**
1880
+ * When set, only the most recent message per unique value of this key is shown.
1881
+ * When an array is provided, keys are tried in order and the first truthy value is used.
1882
+ * Useful for cases where multiple independent messages represent the same entity
1883
+ * (e.g. same customer number or offer number) and only the latest should be displayed.
1884
+ */
1885
+ deduplicateBy?: string | string[];
1886
+ }
1887
+ /**
1888
+ * List definitions keyed by tag name (e.g., "customer2", "offertjson").
1889
+ * Each entry can be a plain column-definition array (backward-compatible) or a full ListConfig.
1874
1890
  * @public
1875
1891
  */
1876
1892
  interface ListDefinitions {
1877
- [tagName: string]: ColumnDefinition[];
1893
+ [tagName: string]: ColumnDefinition[] | ListConfig;
1878
1894
  }
1879
1895
  /**
1880
1896
  * AI chat instructions configuration
@@ -2532,10 +2548,15 @@ interface ListPageProps {
2532
2548
  state: CodicentAppState;
2533
2549
  /** Returns column definitions for a given tag. Falls back to all data keys if not provided. */
2534
2550
  getColumnDefs?: (tag: string) => ColumnDefinition[];
2551
+ /**
2552
+ * Returns full list configuration (columns + optional deduplicateBy) for a given tag.
2553
+ * When provided, takes precedence over getColumnDefs for deriving column definitions.
2554
+ */
2555
+ getListConfig?: (tag: string) => ListConfig | undefined;
2535
2556
  /** Optional data filter applied after fetch. Useful for app-specific filtering (e.g. empty notes). */
2536
2557
  filterData?: (data: DataMessage[], tag: string) => DataMessage[];
2537
2558
  }
2538
- declare const ListPage: ({ state, getColumnDefs, filterData }: ListPageProps) => react_jsx_runtime.JSX.Element;
2559
+ declare const ListPage: ({ state, getColumnDefs, getListConfig, filterData }: ListPageProps) => react_jsx_runtime.JSX.Element;
2539
2560
 
2540
2561
  declare const CrmPage: React__default.FC<{
2541
2562
  state: CodicentAppState;
@@ -2708,4 +2729,4 @@ interface CodicentApp {
2708
2729
  */
2709
2730
  declare function createCodicentApp(config: CreateAppConfig): CodicentApp;
2710
2731
 
2711
- export { AUDIT_CHECKBOX_OPTIONS, AiInput, AppButtonsConfig, AppConfig, AppConfigOptions, AppFrame, AppInfo, AppStateDefinition, AppStateMachine, AudioIcon, AudioRecorder, AudioRecorderState, AuditAnswer, AuditAnswerCell, AuditAnswerMode, AuditAnswerOption, AuditBulkExportDialog, AuditBulkUploadDialog, AuditCircularProgress, AuditConfig, AuditFilterBar, AuditFilterChips, AuditFilterState, AuditGroupsProgress, AuditHorizontalProgress, AuditManagerFilterState, AuditManagerStats, AuditPackage, AuditRequirement, AuditRequirementDialog, AuditRequirementDialogProps, AuditRequirementFieldMapping, AuditRequirementStatus, AuditRequirementsFilterState, AuditRole, AuditRoleCapabilities, AuditRoleIndicator, AuditRoleLabels, AuditSearchBar, AuditSortPreset, AuditSortPresets, AuditSummaryDashboard, AuditTagConfig, AuditTerminology, AuditTimeRemaining, AuditUnitExportDialog, AuditUnitFieldMapping, AuditUnitImportDialog, AuditUnitOption, AuditUnitStats, AuditUnitSwitcher, AuthStateOptions, BulkUploadDialog, Button, ButtonConfig, CacheEntry, CacheManager, CachedUserSession, Canvas, CanvasPageProps, Chat, ChatInput, ChatInstructions, ChatMessage, ChatProps, CodicentApp, CodicentAppState, CodicentMessage, CodicentService, CodicentServiceOptions, ColorPicker, ColumnAction, ColumnDefinition, CombinedPlaceholderDialog, Compose, CompoundButton, Content, CookieBanner, CookieBannerProps, CreateAppConfig, CrmPage, CrmPagePersistent, DEFAULT_AUDIT_VALIDITY_PERIOD_MONTHS, DataCacheEntry, DataMessage$1 as DataMessage, DataMessagePicker, DataMessagePickerProps, DataMessagePickerSelection, DataSchemas, DatePicker, Debug, ErrorBoundary, ExcelColumnDefinition, FileInfo$1 as FileInfo, FilePlaceholder, FileThumbnail, Footer, Form$1 as Form, FormAccept, FormInvite, Form as FormPage, GenericJsonRenderer, Header, Help, Home, HomeButtonStyles, HomePageProps, HtmlView, HtmlViewer, ImageViewer as ImageView, Input, ItemType, Label, LanguageSelector, ListDefinitions, ListPage, ListPageProps, _default as ListView, ListViewProps, Log, LogPageProps, LogTagDefinition, Login, Logout, Markdown, MemberInfo, Menu, MenuPageProps, Message$2 as Message, Content$1 as MessageContent, MessageInput, MessageItem, ModuleFlags, OfflineMessage, Page, Profile, Prompt, Purchase, QrCodeDialog, QrScan, QrScanner, RealtimeVoice, RecordModal, RecordModalProps, ResolvedAuditConfig, Sales, Schema, SchemaDefinition, SchemaEditor, SchemaItem, Search, SearchBox, Snap, SnapFooter, Spinner, StateContext, TemplateVariable, Text, TextHeader, Textarea, TimePicker, Title, Tool, ToolMergeStrategy, ToolsConfig, TranslationDictionary, TranslationResponse, Translations, TypingIndicator, UploadFile, UploadFileProps, UploadFileRef, UrlProcessor, UseAuditFiltersResult, UseAuditManagerDataParams, UseAuditManagerDataResult, UseAuditManagerFiltersResult, UseAuditRequirementsFiltersResult, UseAuditRoleCheckParams, UseAuditRoleCheckResult, UseAuditStateParams, UseAuditStateResult, UseAuthState, UseCodicentAppOptions, UserInfo, UserRole, VoiceIcon, VoiceIconProps, WavRecorder, WavStreamPlayer, buildAuditPackage, calcValidUntil, calculateAuditTimeRemaining, createAppStateMachine, createCodicentApp, dataCache, exportAuditPackageAsHtml, exportAuditPackageAsJson, exportToExcel, formatValidityPeriod, generateBrandVariants, getAuditComplianceRate, getAuditRoleCapabilities, getAuditUrgencyColor, getConfigValue, getEffectiveAnswerOptions, getGpsLocation, getTimeString, importAuditPackageFromHtml, importAuditPackageFromJson, initCodicentApp, isAnswerCompliant, isMobileDevice, log, parseValidityPeriod, resolveAuditConfig, setBaseUrl, setSignalRHost, stateMachineCacheManager, useAppStyles, useAudioRecorder, useAuditFilters, useAuditManagerData, useAuditManagerFilters, useAuditRequirementsFilters, useAuditRoleCheck, useAuditState, useAuthState, useChat, useCodicentApp, useCodicentState, useDebugLogs, useLocalization, useObserveDataSchemas, useOnlineStatus, useRealtimeVoiceAI, useStateWithLocalStorage, useTemplateVariables, useToaster, useTools, useUserRoles, withWakeLock };
2732
+ export { AUDIT_CHECKBOX_OPTIONS, AiInput, AppButtonsConfig, AppConfig, AppConfigOptions, AppFrame, AppInfo, AppStateDefinition, AppStateMachine, AudioIcon, AudioRecorder, AudioRecorderState, AuditAnswer, AuditAnswerCell, AuditAnswerMode, AuditAnswerOption, AuditBulkExportDialog, AuditBulkUploadDialog, AuditCircularProgress, AuditConfig, AuditFilterBar, AuditFilterChips, AuditFilterState, AuditGroupsProgress, AuditHorizontalProgress, AuditManagerFilterState, AuditManagerStats, AuditPackage, AuditRequirement, AuditRequirementDialog, AuditRequirementDialogProps, AuditRequirementFieldMapping, AuditRequirementStatus, AuditRequirementsFilterState, AuditRole, AuditRoleCapabilities, AuditRoleIndicator, AuditRoleLabels, AuditSearchBar, AuditSortPreset, AuditSortPresets, AuditSummaryDashboard, AuditTagConfig, AuditTerminology, AuditTimeRemaining, AuditUnitExportDialog, AuditUnitFieldMapping, AuditUnitImportDialog, AuditUnitOption, AuditUnitStats, AuditUnitSwitcher, AuthStateOptions, BulkUploadDialog, Button, ButtonConfig, CacheEntry, CacheManager, CachedUserSession, Canvas, CanvasPageProps, Chat, ChatInput, ChatInstructions, ChatMessage, ChatProps, CodicentApp, CodicentAppState, CodicentMessage, CodicentService, CodicentServiceOptions, ColorPicker, ColumnAction, ColumnDefinition, CombinedPlaceholderDialog, Compose, CompoundButton, Content, CookieBanner, CookieBannerProps, CreateAppConfig, CrmPage, CrmPagePersistent, DEFAULT_AUDIT_VALIDITY_PERIOD_MONTHS, DataCacheEntry, DataMessage$1 as DataMessage, DataMessagePicker, DataMessagePickerProps, DataMessagePickerSelection, DataSchemas, DatePicker, Debug, ErrorBoundary, ExcelColumnDefinition, FileInfo$1 as FileInfo, FilePlaceholder, FileThumbnail, Footer, Form$1 as Form, FormAccept, FormInvite, Form as FormPage, GenericJsonRenderer, Header, Help, Home, HomeButtonStyles, HomePageProps, HtmlView, HtmlViewer, ImageViewer as ImageView, Input, ItemType, Label, LanguageSelector, ListConfig, ListDefinitions, ListPage, ListPageProps, _default as ListView, ListViewProps, Log, LogPageProps, LogTagDefinition, Login, Logout, Markdown, MemberInfo, Menu, MenuPageProps, Message$2 as Message, Content$1 as MessageContent, MessageInput, MessageItem, ModuleFlags, OfflineMessage, Page, Profile, Prompt, Purchase, QrCodeDialog, QrScan, QrScanner, RealtimeVoice, RecordModal, RecordModalProps, ResolvedAuditConfig, Sales, Schema, SchemaDefinition, SchemaEditor, SchemaItem, Search, SearchBox, Snap, SnapFooter, Spinner, StateContext, TemplateVariable, Text, TextHeader, Textarea, TimePicker, Title, Tool, ToolMergeStrategy, ToolsConfig, TranslationDictionary, TranslationResponse, Translations, TypingIndicator, UploadFile, UploadFileProps, UploadFileRef, UrlProcessor, UseAuditFiltersResult, UseAuditManagerDataParams, UseAuditManagerDataResult, UseAuditManagerFiltersResult, UseAuditRequirementsFiltersResult, UseAuditRoleCheckParams, UseAuditRoleCheckResult, UseAuditStateParams, UseAuditStateResult, UseAuthState, UseCodicentAppOptions, UserInfo, UserRole, VoiceIcon, VoiceIconProps, WavRecorder, WavStreamPlayer, buildAuditPackage, calcValidUntil, calculateAuditTimeRemaining, createAppStateMachine, createCodicentApp, dataCache, exportAuditPackageAsHtml, exportAuditPackageAsJson, exportToExcel, formatValidityPeriod, generateBrandVariants, getAuditComplianceRate, getAuditRoleCapabilities, getAuditUrgencyColor, getConfigValue, getEffectiveAnswerOptions, getGpsLocation, getTimeString, importAuditPackageFromHtml, importAuditPackageFromJson, initCodicentApp, isAnswerCompliant, isMobileDevice, log, parseValidityPeriod, resolveAuditConfig, setBaseUrl, setSignalRHost, stateMachineCacheManager, useAppStyles, useAudioRecorder, useAuditFilters, useAuditManagerData, useAuditManagerFilters, useAuditRequirementsFilters, useAuditRoleCheck, useAuditState, useAuthState, useChat, useCodicentApp, useCodicentState, useDebugLogs, useLocalization, useObserveDataSchemas, useOnlineStatus, useRealtimeVoiceAI, useStateWithLocalStorage, useTemplateVariables, useToaster, useTools, useUserRoles, withWakeLock };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codicent-app-sdk",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "SDK for building AI-powered applications with Codicent",
5
5
  "type": "module",
6
6
  "main": "dist/cjs/index.js",