codicent-app-sdk 0.6.4 → 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,7 +16,7 @@ export interface ColumnDefinition {
16
16
  hidden?: boolean;
17
17
  hideOnMobile?: boolean;
18
18
  maxWidth?: number;
19
- type?: "file" | "checkbox" | "textarea" | "enum" | "combobox" | undefined;
19
+ type?: "file" | "checkbox" | "textarea" | "enum" | "combobox" | "thumbnail" | undefined;
20
20
  /** Number of rows for textarea type (default: 3) */
21
21
  rows?: number;
22
22
  /** Options for enum type columns (static, small lists) */
@@ -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,CAmiB5C,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;AA+ND,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IACxF,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,2HAA2H;IAC3H,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,wFAAwF;IACxF,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,kFAAkF;IAClF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gHAAgH;IAChH,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,2HAA2H;IAC3H,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,oIAAoI;IACpI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChH,oBAAoB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;CAC1E;AA6ID,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA+iB5C,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"),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
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),n=require("@fluentui/react-components"),i=require("@fluentui/react-icons"),r=require("../services/codicent.js"),l=require("../hooks/useLocalization.js");const o=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}},thumbnailRow:{display:"flex",gap:"4px",flexWrap:"wrap"},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),r=new Date(i,n,e);if(r.getFullYear()===i&&r.getMonth()===n&&r.getDate()===e)return r.getTime()}return null},s=e=>{const t=e.trim().replace(/[\s\u00a0]/g,"");if(""===t||"-"===t)return null;const n=(t.match(/,/g)||[]).length,i=(t.match(/\./g)||[]).length;let r;r=1===n&&0===i?/,\d{1,2}$/.test(t)?t.replace(/,\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/,/g,""):1===i&&0===n?/\.\d{1,2}$/.test(t)?t.replace(/\.\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/\./g,""):t.replace(/[,.]/g,"");const l=Number(r);return""!==r&&isFinite(l)?l:null},c=(e,t)=>{if("string"==typeof t)return e[t];for(const n of t)if(void 0!==e[n])return e[n]},d=n.makeStyles({img:{maxWidth:"40px",maxHeight:"40px",objectFit:"cover",borderRadius:"3px",display:"block"},fileIcon:{width:"24px",height:"24px",verticalAlign:"middle"}}),p=({fileId:n})=>{const[l,o]=t.useState(!0),a=d();return e.jsx("a",{href:r.CodicentService.getFileUrl(n),target:"_blank",rel:"noopener noreferrer",children:l?e.jsx("img",{src:r.CodicentService.getImageUrl(n,40),alt:"",className:a.img,onError:()=>o(!1)}):e.jsx(i.Attach24Regular,{className:a.fileIcon})})},u=({value:i,options:r,optionsLoader:l,minChars:o=2,maxResults:a=50,columnKey:s,item:c,actualIndex:d,onEnumChange:p,label:u,t:h})=>{const[x,m]=t.useState(i),[f,g]=t.useState([]),[y,j]=t.useState(!1),b=t.useRef(null);t.useEffect((()=>{m(i)}),[i]),t.useEffect((()=>{if(l){if(!(x.length<o))return b.current&&clearTimeout(b.current),b.current=setTimeout((async()=>{j(!0);try{const e=await l(x);g(e.slice(0,a))}finally{j(!1)}}),250),()=>{b.current&&clearTimeout(b.current)};g([])}}),[x,l,o,a]);const v=t.useMemo((()=>(r??[]).filter((e=>e.toLowerCase().includes(x.toLowerCase()))).slice(0,a)),[r,x,a]),C=l?f:v;return e.jsx(n.Combobox,{value:x,freeform:!0,"aria-label":u,placeholder:y?h("Loading..."):l&&x.length<o?h(`Type ${o}+ characters to search...`):void 0,onChange:e=>m(e.target.value),onOptionSelect:(e,t)=>{t.optionValue&&(m(t.optionValue),p&&p(c,s,t.optionValue,d))},onBlur:()=>{p&&p(c,s,x,d)},style:{width:"100%"},children:C.map((t=>e.jsx(n.Option,{value:t,children:t},t)))})},h=({data:d,columns:h,canEdit:x,onEdit:m,onDelete:f,onToggleCheckbox:g,onEnumChange:y,onFilteredDataChange:j})=>{const b=o(),{visibleColumns:v,defaultSortIndex:C,defaultSortDirection:w}=t.useMemo((()=>{const e=d&&d.length>0?Array.from(new Set(d.flatMap((e=>Object.keys(e))))):[],t=(h||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,h]),[S,k]=t.useState(C>=0?C:null),[N,W]=t.useState(w),[O,I]=t.useState(!1),[$,A]=t.useState({title:"",text:""}),[L,M]=t.useState({}),[T,D]=t.useState(0),{t:B}=l.default(),F=e=>e.title?B(e.title):Array.isArray(e.key)?e.key[0]:e.key,R=e=>{const t=[];return e.hideOnMobile&&t.push(b.hideOnMobile),t.join(" ")},E=(e,t)=>{M((n=>{const i={...n};return""===t.trim()?delete i[e]:i[e]=t,i}))},q=e=>null==e||"string"==typeof e&&e.startsWith("[")&&e.endsWith("]")?"":"object"==typeof e?JSON.stringify(e):String(e),z=t.useMemo((()=>{const e=[...d];if(null!==S&&N){const t=v[S];e.sort(((e,n)=>{const i=c(e,t.key),r=c(n,t.key);if(null==i)return 1;if(null==r)return-1;let l=0;if("string"==typeof i&&"string"==typeof r){const e=a(i),t=a(r);if(null!==e&&null!==t)l=e-t;else{const e=s(i),t=s(r);l=null!==e&&null!==t?e-t:i.localeCompare(r)}}else if("number"==typeof i&&"number"==typeof r)l=i-r;else{const e=s(String(i)),t=s(String(r));l=null!==e&&null!==t?e-t:String(i).localeCompare(String(r))}return"asc"===N?l:-l}))}return e}),[d,S,N,v]),H=t.useMemo((()=>z.filter((e=>{for(const[t,n]of Object.entries(L)){const i=parseInt(t),r=v[i],l=c(e,r.key),o=q(l).toLowerCase(),a=n.toLowerCase();if(!("enum"===r.type&&r.enumOptions?o===a:o.includes(a)))return!1}return!0}))),[z,L,v]);t.useEffect((()=>{j&&j(H)}),[H,j]);const P="undefined"!=typeof window?window.innerHeight-250:600,_=Math.max(0,Math.floor(T/49)-5),V=Math.min(H.length,Math.ceil((T+P)/49)+5),Y=H.slice(_,V),U=49*H.length,K=49*_,J=(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)})(v.slice(0,3).map((t=>String(c(e,t.key)??""))).join("-"))}`};return d&&0!==d.length?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:b.container,onScroll:e=>{D(e.currentTarget.scrollTop)},style:{maxHeight:"calc(100vh - 200px)",overflowY:"auto"},children:e.jsxs("table",{className:b.table,children:[e.jsxs("thead",{children:[e.jsxs("tr",{children:[v.map(((t,n)=>{const i=t.maxWidth?{width:`${t.maxWidth}px`,maxWidth:`${t.maxWidth}px`}:{};return e.jsxs("th",{className:`${b.th} ${R(t)}`.trim(),style:i,onClick:()=>(e=>{S===e?"asc"===N?W("desc"):"desc"===N&&(k(null),W(null)):(k(e),W("asc"))})(n),children:[F(t),S===n&&e.jsx("span",{className:b.sortIndicator,children:"asc"===N?"▲":"▼"})]},n)})),x&&e.jsx("th",{className:`${b.th} ${b.actionsColumn}`,style:{width:"100px"},children:B("Actions")})]}),e.jsxs("tr",{children:[v.map(((t,i)=>{const r=t.maxWidth?{width:`${t.maxWidth}px`,maxWidth:`${t.maxWidth}px`}:{};return e.jsx("th",{className:R(t),style:r,children:t.filterable&&e.jsx("div",{className:b.filterWrapper,children:"enum"===t.type&&t.enumOptions?e.jsxs(n.Select,{className:b.filterInput,value:L[i]||"",onChange:(e,t)=>E(i,t.value),onClick:e=>e.stopPropagation(),children:[e.jsx("option",{value:"",children:B("All")}),t.enumOptions.filter((e=>""!==e)).map((t=>e.jsx("option",{value:t,children:B(t)},t)))]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",className:b.filterInput,placeholder:B("Filter")+"...",value:L[i]||"",onChange:e=>E(i,e.target.value),onClick:e=>e.stopPropagation()}),(L[i]||"").length>0&&e.jsx(n.Button,{appearance:"subtle",className:b.clearFilterButton,onClick:e=>{e.stopPropagation(),(e=>{M((t=>{const n={...t};return delete n[e],n}))})(i)},children:"×"})]})})},i)})),x&&e.jsx("th",{className:b.actionsColumn})]})]}),e.jsxs("tbody",{children:[_>0&&e.jsx("tr",{style:{height:`${K}px`},children:e.jsx("td",{colSpan:v.length+(x?1:0),style:{padding:0,border:"none"}})}),Y.map(((t,l)=>{const o=t._index,a="number"==typeof o?o:_+l;return e.jsxs("tr",{className:b.tr,children:[v.map(((i,l)=>{const o=c(t,i.key),s=i.format?i.format(o):q(o),d=i.maxWidth?`${b.td} ${b.tdTruncated} ${R(i)}`.trim():`${b.td} ${R(i)}`.trim(),h=()=>{window.matchMedia("(hover: hover)").matches||i.maxWidth&&s.length>0&&(A({title:F(i),text:s}),I(!0))};if("thumbnail"===i.type){const t=Array.isArray(o)?o:[];return e.jsx("td",{className:d,children:e.jsx("div",{className:b.thumbnailRow,children:t.map((t=>e.jsx(p,{fileId:t},t)))})},l)}if("file"===i.type&&s)return e.jsx("td",{className:d,onClick:h,children:e.jsx("a",{href:r.CodicentService.getFileUrl(s),target:"_blank",rel:"noopener noreferrer",children:B("Download")})},l);if("checkbox"===i.type){const r=!0===o||"true"===o||"yes"===o||"1"===o;return e.jsx("td",{className:d,children:e.jsx(n.Checkbox,{checked:r,onChange:(e,n)=>{g&&g(t,i.key,!0===n.checked,a)}})},l)}if("enum"===i.type&&i.enumOptions&&i.editable)return e.jsx("td",{className:d,children:e.jsxs(n.Select,{value:s,"aria-label":i.title?B(i.title):Array.isArray(i.key)?i.key[0]:i.key,onChange:(e,n)=>{y&&y(t,i.key,n.value,a)},style:{width:"100%"},children:[!i.enumOptions.includes(s)&&s&&e.jsx("option",{value:s,children:s}),i.enumOptions.map((t=>e.jsx("option",{value:t,children:B(t)},t)))]})},l);if("combobox"===i.type&&i.editable&&(i.enumOptions||i.enumOptionsLoader))return e.jsx("td",{className:d,children:e.jsx(u,{value:s,options:i.enumOptions,optionsLoader:i.enumOptionsLoader,minChars:i.enumOptionsLoaderMinChars,maxResults:i.enumOptionsLoaderMaxResults,columnKey:i.key,item:t,actualIndex:a,onEnumChange:y,label:i.title?B(i.title):Array.isArray(i.key)?i.key[0]:i.key,t:B})},l);const x=()=>i.maxWidth&&s.length>0?e.jsx(n.Tooltip,{content:{children:s,style:{maxWidth:"600px",whiteSpace:"normal"}},relationship:"description",children:e.jsx("span",{children:s})}):s,m=()=>{if(!i.action)return null;const r=i.action,l=i.action.icon,o=e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(l,{}),className:b.actionIcon,onClick:e=>{e.stopPropagation(),r.onClick(t)},size:"small"});return r.tooltip?e.jsx(n.Tooltip,{content:B(r.tooltip),relationship:"label",children:o}):o};return e.jsx("td",{className:d,onClick:h,children:i.action?e.jsxs("div",{className:b.cellWithAction,children:[i.action.iconLeft&&m(),e.jsx("span",{className:b.cellText,children:x()}),!i.action.iconLeft&&m()]}):x()},l)})),x&&(m||f)&&e.jsx("td",{className:`${b.td} ${b.actionsColumn}`,children:e.jsxs("div",{style:{display:"flex",gap:"4px",justifyContent:"center"},children:[m&&e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(i.Edit24Regular,{}),className:b.editButton,onClick:()=>m(t,a),title:B("Edit")}),f&&e.jsx(n.Button,{appearance:"subtle",icon:e.jsx(i.Delete24Regular,{}),className:b.editButton,onClick:()=>f(t,a),title:B("Delete")})]})})]},J(t,a))})),V<H.length&&e.jsx("tr",{style:{height:U-K-49*Y.length+"px"},children:e.jsx("td",{colSpan:v.length+(x?1:0),style:{padding:0,border:"none"}})})]})]})}),e.jsx(n.Dialog,{open:O,onOpenChange:(e,t)=>I(t.open),children:e.jsx(n.DialogSurface,{children:e.jsxs(n.DialogBody,{children:[e.jsx(n.DialogTitle,{children:$.title}),e.jsx(n.DialogContent,{className:b.dialogContent,children:$.text})]})})})]}):e.jsx("div",{className:b.emptyState,children:B("No data to display")})};var x=t.memo(h);exports.ListView=h,exports.default=x;
@@ -1 +1 @@
1
- {"version":3,"file":"RecordModal.d.ts","sourceRoot":"","sources":["../../../src/components/RecordModal.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAoB5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA+G9C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAuJlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"RecordModal.d.ts","sourceRoot":"","sources":["../../../src/components/RecordModal.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAqB5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAwJ9C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA+KlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),a=require("react"),t=require("@fluentui/react-components"),n=require("../hooks/useLocalization.js");const o=t.makeStyles({surface:{backgroundColor:t.tokens.colorNeutralBackground1,width:"min(calc(100vw - 32px), 560px)",maxWidth:"calc(100vw - 32px)"},content:{display:"flex",flexDirection:"column",gap:"16px",minWidth:"0",maxHeight:"60vh",overflowY:"auto"},field:{display:"flex",flexDirection:"column"}}),r=({value:n,options:o,optionsLoader:r,minChars:l=2,maxResults:i=50,label:s,onChange:c,t:u})=>{const[d,p]=a.useState(n),[h,x]=a.useState([]),[m,f]=a.useState(!1),y=a.useRef(null);a.useEffect((()=>{p(n)}),[n]),a.useEffect((()=>{if(r){if(!(d.length<l))return y.current&&clearTimeout(y.current),y.current=setTimeout((async()=>{f(!0);try{const e=await r(d);x(e.slice(0,i))}finally{f(!1)}}),250),()=>{y.current&&clearTimeout(y.current)};x([])}}),[d,r,l,i]);const g=a.useMemo((()=>(o??[]).filter((e=>e.toLowerCase().includes(d.toLowerCase()))).slice(0,i)),[o,d,i]),v=r?h:g;return e.jsx(t.Combobox,{value:d,freeform:!0,"aria-label":s,placeholder:m?u("Loading..."):r&&d.length<l?u(`Type ${l}+ characters to search...`):void 0,onChange:e=>p(e.target.value),onOptionSelect:(e,a)=>{a.optionValue&&(p(a.optionValue),c(a.optionValue))},onBlur:()=>c(d),style:{width:"100%"},children:v.map((a=>e.jsx(t.Option,{value:a,children:a},a)))})},l=({open:l,onClose:i,onSave:s,columns:c,initialData:u,title:d})=>{const p=o(),{t:h}=n.default(),[x,m]=a.useState({}),[f,y]=a.useState(!1);a.useEffect((()=>{l&&m(u||{})}),[l,u]);const g=e=>Array.isArray(e.key)?e.key[0]:e.key,v=e=>{if(Array.isArray(e.key))for(const a of e.key)if(void 0!==x[a])return a;return g(e)},j=(e,a)=>{const t=v(e);m((e=>({...e,[t]:a})))},C=c.filter((e=>!e.hidden&&"file"!==e.type&&"createdAt"!==g(e)));return e.jsx(t.Dialog,{open:l,onOpenChange:(e,a)=>!f&&!1===a.open&&i(),children:e.jsx(t.DialogSurface,{className:p.surface,backdrop:{style:{backgroundColor:"rgba(0, 0, 0, 0.4)"}},children:e.jsxs(t.DialogBody,{children:[e.jsx(t.DialogTitle,{children:d||h(u?"Edit Record":"Add Record")}),e.jsx(t.DialogContent,{className:p.content,children:C.map(((a,n)=>{const o=g(a),l=(e=>{const a=v(e);return x[a]})(a),i=a.title||o;return"checkbox"===a.type?e.jsx(t.Field,{label:i,className:p.field,children:e.jsx(t.Checkbox,{checked:!0===l||"true"===l||"yes"===l||"1"===l,onChange:(e,t)=>j(a,t.checked)})},n):"textarea"===a.type?e.jsx(t.Field,{label:i,className:p.field,children:e.jsx(t.Textarea,{value:String(l??""),rows:a.rows??3,onChange:(e,t)=>j(a,t.value),placeholder:h("Enter")+" "+i.toLowerCase(),resize:"vertical"})},n):"enum"===a.type&&a.enumOptions?e.jsx(t.Field,{label:i,className:p.field,children:e.jsx(t.Select,{value:String(l??""),onChange:(e,t)=>j(a,t.value),children:a.enumOptions.map((a=>e.jsx("option",{value:a,children:a||h("(None)")},a)))})},n):"combobox"===a.type&&(a.enumOptions||a.enumOptionsLoader)?e.jsx(t.Field,{label:i,className:p.field,children:e.jsx(r,{value:String(l??""),options:a.enumOptions,optionsLoader:a.enumOptionsLoader,minChars:a.enumOptionsLoaderMinChars,maxResults:a.enumOptionsLoaderMaxResults,label:i,onChange:e=>j(a,e),t:h})},n):e.jsx(t.Field,{label:i,className:p.field,children:e.jsx(t.Input,{value:String(l??""),onChange:(e,t)=>j(a,t.value),placeholder:h("Enter")+" "+i.toLowerCase()})},n)}))}),e.jsxs(t.DialogActions,{children:[e.jsx(t.Button,{appearance:"secondary",onClick:i,disabled:f,children:h("Cancel")}),e.jsx(t.Button,{appearance:"primary",onClick:async()=>{y(!0);try{await s(x),i()}catch(e){console.error("Failed to save record:",e)}finally{y(!1)}},disabled:f,children:h(f?"Saving...":"Save")})]})]})})})};exports.RecordModal=l,exports.default=l;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),a=require("react"),t=require("@fluentui/react-components"),l=require("@fluentui/react-icons"),r=require("../hooks/useLocalization.js"),n=require("../services/codicent.js");const i=t.makeStyles({surface:{backgroundColor:t.tokens.colorNeutralBackground1,width:"min(calc(100vw - 32px), 560px)",maxWidth:"calc(100vw - 32px)"},content:{display:"flex",flexDirection:"column",gap:"16px",minWidth:"0",maxHeight:"60vh",overflowY:"auto"},field:{display:"flex",flexDirection:"column"},thumbnailRow:{display:"flex",flexWrap:"wrap",gap:"6px",marginTop:"4px"},thumbnailImg:{maxWidth:"60px",maxHeight:"60px",objectFit:"cover",borderRadius:"4px",display:"block"},thumbnailIcon:{width:"32px",height:"32px",verticalAlign:"middle"}}),o=({fileId:t,imgClassName:r,iconClassName:i})=>{const[o,s]=a.useState(!0);return e.jsx("a",{href:n.CodicentService.getFileUrl(t),target:"_blank",rel:"noopener noreferrer",children:o?e.jsx("img",{src:n.CodicentService.getImageUrl(t,60),alt:`File attachment ${t}`,className:r,onError:()=>s(!1)}):e.jsx(l.Attach24Regular,{className:i})})},s=({value:l,options:r,optionsLoader:n,minChars:i=2,maxResults:o=50,label:s,onChange:c,t:u})=>{const[d,m]=a.useState(l),[p,h]=a.useState([]),[x,f]=a.useState(!1),g=a.useRef(null);a.useEffect((()=>{m(l)}),[l]),a.useEffect((()=>{if(n){if(!(d.length<i))return g.current&&clearTimeout(g.current),g.current=setTimeout((async()=>{f(!0);try{const e=await n(d);h(e.slice(0,o))}finally{f(!1)}}),250),()=>{g.current&&clearTimeout(g.current)};h([])}}),[d,n,i,o]);const y=a.useMemo((()=>(r??[]).filter((e=>e.toLowerCase().includes(d.toLowerCase()))).slice(0,o)),[r,d,o]),b=n?p:y;return e.jsx(t.Combobox,{value:d,freeform:!0,"aria-label":s,placeholder:x?u("Loading..."):n&&d.length<i?u(`Type ${i}+ characters to search...`):void 0,onChange:e=>m(e.target.value),onOptionSelect:(e,a)=>{a.optionValue&&(m(a.optionValue),c(a.optionValue))},onBlur:()=>c(d),style:{width:"100%"},children:b.map((a=>e.jsx(t.Option,{value:a,children:a},a)))})},c=({open:l,onClose:n,onSave:c,columns:u,initialData:d,title:m})=>{const p=i(),{t:h}=r.default(),[x,f]=a.useState({}),[g,y]=a.useState(!1);a.useEffect((()=>{l&&f(d||{})}),[l,d]);const b=e=>Array.isArray(e.key)?e.key[0]:e.key,j=e=>{if(Array.isArray(e.key))for(const a of e.key)if(void 0!==x[a])return a;return b(e)},v=(e,a)=>{const t=j(e);f((e=>({...e,[t]:a})))},C=u.filter((e=>!e.hidden&&"file"!==e.type&&"thumbnail"!==e.type&&"createdAt"!==b(e))),k=u.filter((e=>!e.hidden&&"thumbnail"===e.type));return e.jsx(t.Dialog,{open:l,onOpenChange:(e,a)=>!g&&!1===a.open&&n(),children:e.jsx(t.DialogSurface,{className:p.surface,backdrop:{style:{backgroundColor:"rgba(0, 0, 0, 0.4)"}},children:e.jsxs(t.DialogBody,{children:[e.jsx(t.DialogTitle,{children:m||h(d?"Edit Record":"Add Record")}),e.jsxs(t.DialogContent,{className:p.content,children:[k.map(((a,l)=>{const r=b(a),n=a.title||r,i=d?.[r],s=Array.isArray(i)?i:[];return 0===s.length?null:e.jsx(t.Field,{label:n,className:p.field,children:e.jsx("div",{className:p.thumbnailRow,children:s.map((a=>e.jsx(o,{fileId:a,imgClassName:p.thumbnailImg,iconClassName:p.thumbnailIcon},a)))})},`thumb-${l}`)})),C.map(((a,l)=>{const r=b(a),n=(e=>{const a=j(e);return x[a]})(a),i=a.title||r;return"checkbox"===a.type?e.jsx(t.Field,{label:i,className:p.field,children:e.jsx(t.Checkbox,{checked:!0===n||"true"===n||"yes"===n||"1"===n,onChange:(e,t)=>v(a,t.checked)})},l):"textarea"===a.type?e.jsx(t.Field,{label:i,className:p.field,children:e.jsx(t.Textarea,{value:String(n??""),rows:a.rows??3,onChange:(e,t)=>v(a,t.value),placeholder:h("Enter")+" "+i.toLowerCase(),resize:"vertical"})},l):"enum"===a.type&&a.enumOptions?e.jsx(t.Field,{label:i,className:p.field,children:e.jsx(t.Select,{value:String(n??""),onChange:(e,t)=>v(a,t.value),children:a.enumOptions.map((a=>e.jsx("option",{value:a,children:a||h("(None)")},a)))})},l):"combobox"===a.type&&(a.enumOptions||a.enumOptionsLoader)?e.jsx(t.Field,{label:i,className:p.field,children:e.jsx(s,{value:String(n??""),options:a.enumOptions,optionsLoader:a.enumOptionsLoader,minChars:a.enumOptionsLoaderMinChars,maxResults:a.enumOptionsLoaderMaxResults,label:i,onChange:e=>v(a,e),t:h})},l):e.jsx(t.Field,{label:i,className:p.field,children:e.jsx(t.Input,{value:String(n??""),onChange:(e,t)=>v(a,t.value),placeholder:h("Enter")+" "+i.toLowerCase()})},l)}))]}),e.jsxs(t.DialogActions,{children:[e.jsx(t.Button,{appearance:"secondary",onClick:n,disabled:g,children:h("Cancel")}),e.jsx(t.Button,{appearance:"primary",onClick:async()=>{y(!0);try{await c(x),n()}catch(e){console.error("Failed to save record:",e)}finally{y(!1)}},disabled:g,children:h(g?"Saving...":"Save")})]})]})})})};exports.RecordModal=c,exports.default=c;
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthState.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAuthState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,QAAQ,EAAqB,MAAM,oBAAoB,CAAC;AAC9G,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAUrC,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IAInB,IAAI,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,eAAe,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,gBAAgB;IAC/B,wFAAwF;IACxF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IACzG,8FAA8F;IAC9F,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB;AAED,QAAA,MAAM,YAAY,UAAW,qBAAqB,YAAY,gBAAgB,KAAG,YA+QhF,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"useAuthState.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAuthState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,QAAQ,EAAqB,MAAM,oBAAoB,CAAC;AAC9G,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAUrC,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IAInB,IAAI,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,eAAe,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,gBAAgB;IAC/B,wFAAwF;IACxF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IACzG,8FAA8F;IAC9F,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB;AAED,QAAA,MAAM,YAAY,UAAW,qBAAqB,YAAY,gBAAgB,KAAG,YA0RhF,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("../services/codicent.js");require("../components/Markdown.js"),require("../components/Textarea.js"),require("../components/Button.js"),require("../components/CompoundButton.js"),require("react/jsx-runtime"),require("@fluentui/react-components"),require("../components/Spinner.js"),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"),require("@fluentui/react-icons");var s=require("../config/index.js");require("../utils/MessageContent.js"),require("../node_modules/tinycolor2/esm/tinycolor.js"),require("../_virtual/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"),require("exceljs"),require("./useLocalization.js"),require("./useAppStyles.js"),require("../components/FileThumbnail.js"),require("../components/MessageInput.js"),require("../components/UploadFile.js"),require("../components/SnapFooter.js"),require("../components/Profile.js"),require("../components/MessageItem.js"),require("../components/Content.js"),require("../components/AiInput.js"),require("../components/SearchBox.js"),require("../components/DataMessagePicker.js"),require("../components/HtmlView.js"),require("../components/Footer.js"),require("../components/Page.js"),require("../components/QrCodeDialog.js"),require("../components/QrScanner.js"),require("../components/OfflineMessage.js"),require("../components/LanguageSelector.js"),require("../components/ListView.js"),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"),require("../pages/AppFrame.js"),require("../pages/Canvas.js"),require("../pages/Chat.js"),require("../pages/Compose.js"),require("../pages/Snap.js"),require("../pages/Search.js"),require("../pages/Menu.js"),require("../pages/Log.js"),require("../pages/Login.js"),require("../pages/Home.js"),require("../pages/ListPage.js"),require("../pages/CrmPage.js"),require("../pages/CrmPagePersistent.js"),require("../pages/ImageView.js"),require("../pages/FormInvite.js"),require("../pages/FormAccept.js"),require("../pages/Sales.js"),require("react-router-dom"),require("../pages/Purchase.js"),require("../pages/QrScan.js"),require("react-dom/client"),require("../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js");exports.default=(o,i)=>{const{isAuthenticated:t,getAccessTokenSilently:n,user:u,isLoading:a,logout:c,getAccessTokenWithPopup:l,loginWithRedirect:g,loginWithPopup:p}=o,[d,q]=e.useState(null),[m,j]=e.useState(void 0),[C,P]=e.useState(null),[E,_]=e.useState(""),A=e.useMemo((()=>new r.CodicentService({API_BASE_URL:s.getConfigValue("API_BASE_URL"),PUBSUB_URL:s.getConfigValue("PUBSUB_URL"),APP_LOG_CODICENT:s.getConfigValue("APP_LOG_CODICENT"),APP_LOG_TOKEN:s.getConfigValue("APP_LOG_TOKEN"),APP_NAME:s.getConfigValue("APP_NAME"),APP_PREFIX:s.getConfigValue("APP_PREFIX"),APP_TEMPLATE:s.getConfigValue("APP_TEMPLATE"),BUTTON_TAG:s.getConfigValue("BUTTON_TAG"),STRIPE_PUBLIC_KEY:s.getConfigValue("STRIPE_PUBLIC_KEY"),STRIPE_SOURCE:s.getConfigValue("STRIPE_SOURCE"),STRIPE_TRIAL_PERIOD_DAYS:s.getConfigValue("STRIPE_TRIAL_PERIOD_DAYS"),SUBSCRIPTION_NEEDED:s.getConfigValue("SUBSCRIPTION_NEEDED"),USER_PREFIX:s.getConfigValue("USER_PREFIX"),ANONYMOUS_TOKEN:s.getConfigValue("ANONYMOUS_TOKEN")})),[]);e.useEffect((()=>{!a&&t&&(async()=>{try{const e=await n({});console.debug("CODICENT: ACCESS TOKEN",e),q(e)}catch(e){console.debug("CODICENT: Failed to get access token",e);const r=e;if(r&&"object"==typeof r&&"error"in r&&"login_required"===r.error)console.warn("CODICENT: Session expired (login_required)"),q(null);else if(r&&"object"==typeof r&&"error"in r&&"consent_required"===r.error)try{const e=await l();if(!e)return void P("Failed to get access token: no token from auth0 with popup");console.log("CODICENT: GOT ACCESS TOKEN"),q(e)}catch(e){console.warn("CODICENT: Failed to get access token with popup",e),P("Samtycke krävs för inloggning. Tillåt popup-fönster och försök igen."),q(null)}else P("Failed to get access token: "+(r.message?.toString()||r.toString())),console.log("CODICENT: ACCESS TOKEN ERROR",r)}})().then((()=>{}))}),[t,l,n,g,a]),e.useEffect((()=>{if(u&&u.sub&&d&&void 0===m){let e=!0;return(i?.loginFn?i.loginFn(A,u.sub,d):A.loginUser(u.sub,d)).then((r=>{e&&(null===r?j(!1):""===r?P("Kontrollera internetanslutningen och försök igen."):(A.setToken(r),A.getNickname().then(_),j(!0)))})).catch((()=>{e&&(P("Ett fel uppstod. Försök igen senare."),j(!1))})),()=>{e=!1}}}),[u,d,m,A]);const S=e.useCallback((()=>{A.logout(),q(null),P(null),j(void 0),_(""),c({logoutParams:{returnTo:s.getConfigValue("AUTH_REDIRECT_URL")}})}),[A,c]),T=e.useCallback((async e=>{const r=i?.registerFn?await i.registerFn(A,e,u.email,u.sub,d):await A.registerUser(e,u.email,u.sub,d);return r&&(A.setToken(r),j(!0)),r}),[A,u,d]);e.useEffect((()=>{A.onUnauthorized=S}),[A]);const f=e.useCallback((async e=>{try{await p({authorizationParams:{connection:"email",login_hint:e}})}catch(e){console.error("Passwordless login failed:",e),P(`Passwordless login failed: ${e}`)}}),[p]);return e.useMemo((()=>({isAuthenticated:t,isRegistered:m,accessToken:d,authError:C,isLoading:a,user:u,nickname:E,logout:S,registerUser:T,codicentService:A,loginWithRedirect:g,loginPasswordless:f})),[t,m,d,C,a,u,E,S,T,A,g,f])};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("../services/codicent.js");require("../components/Markdown.js"),require("../components/Textarea.js"),require("../components/Button.js"),require("../components/CompoundButton.js"),require("react/jsx-runtime"),require("@fluentui/react-components"),require("../components/Spinner.js"),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"),require("@fluentui/react-icons");var o=require("../config/index.js");require("../utils/MessageContent.js"),require("../node_modules/tinycolor2/esm/tinycolor.js"),require("../_virtual/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"),require("exceljs"),require("./useLocalization.js"),require("./useAppStyles.js"),require("../components/FileThumbnail.js"),require("../components/MessageInput.js"),require("../components/UploadFile.js"),require("../components/SnapFooter.js"),require("../components/Profile.js"),require("../components/MessageItem.js"),require("../components/Content.js"),require("../components/AiInput.js"),require("../components/SearchBox.js"),require("../components/DataMessagePicker.js"),require("../components/HtmlView.js"),require("../components/Footer.js"),require("../components/Page.js"),require("../components/QrCodeDialog.js"),require("../components/QrScanner.js"),require("../components/OfflineMessage.js"),require("../components/LanguageSelector.js"),require("../components/ListView.js"),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"),require("../pages/AppFrame.js"),require("../pages/Canvas.js"),require("../pages/Chat.js"),require("../pages/Compose.js"),require("../pages/Snap.js"),require("../pages/Search.js"),require("../pages/Menu.js"),require("../pages/Log.js"),require("../pages/Login.js"),require("../pages/Home.js"),require("../pages/ListPage.js"),require("../pages/CrmPage.js"),require("../pages/CrmPagePersistent.js"),require("../pages/ImageView.js"),require("../pages/FormInvite.js"),require("../pages/FormAccept.js"),require("../pages/Sales.js"),require("react-router-dom"),require("../pages/Purchase.js"),require("../pages/QrScan.js"),require("react-dom/client"),require("../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js");exports.default=(s,i)=>{const{isAuthenticated:t,getAccessTokenSilently:n,user:u,isLoading:a,logout:c,getAccessTokenWithPopup:l,loginWithRedirect:g,loginWithPopup:p}=s,[d,q]=e.useState(null),[m,j]=e.useState(void 0),[C,P]=e.useState(null),[E,_]=e.useState(""),A=e.useMemo((()=>new r.CodicentService({API_BASE_URL:o.getConfigValue("API_BASE_URL"),PUBSUB_URL:o.getConfigValue("PUBSUB_URL"),APP_LOG_CODICENT:o.getConfigValue("APP_LOG_CODICENT"),APP_LOG_TOKEN:o.getConfigValue("APP_LOG_TOKEN"),APP_NAME:o.getConfigValue("APP_NAME"),APP_PREFIX:o.getConfigValue("APP_PREFIX"),APP_TEMPLATE:o.getConfigValue("APP_TEMPLATE"),BUTTON_TAG:o.getConfigValue("BUTTON_TAG"),STRIPE_PUBLIC_KEY:o.getConfigValue("STRIPE_PUBLIC_KEY"),STRIPE_SOURCE:o.getConfigValue("STRIPE_SOURCE"),STRIPE_TRIAL_PERIOD_DAYS:o.getConfigValue("STRIPE_TRIAL_PERIOD_DAYS"),SUBSCRIPTION_NEEDED:o.getConfigValue("SUBSCRIPTION_NEEDED"),USER_PREFIX:o.getConfigValue("USER_PREFIX"),ANONYMOUS_TOKEN:o.getConfigValue("ANONYMOUS_TOKEN")})),[]);e.useEffect((()=>{!a&&t&&(async()=>{try{const e=await n({});console.debug("CODICENT: ACCESS TOKEN",e),q(e)}catch(e){console.debug("CODICENT: Failed to get access token",e);const r=e;if(r&&"object"==typeof r&&"error"in r&&"login_required"===r.error)console.warn("CODICENT: Session expired (login_required)"),q(null);else if(r&&"object"==typeof r&&"error"in r&&("invalid_grant"===r.error||"missing_refresh_token"===r.error))console.warn("CODICENT: Refresh token invalid (invalid_grant), redirecting to login"),q(null),g();else if(r&&"object"==typeof r&&"error"in r&&"consent_required"===r.error)try{const e=await l();if(!e)return void P("Failed to get access token: no token from auth0 with popup");console.log("CODICENT: GOT ACCESS TOKEN"),q(e)}catch(e){console.warn("CODICENT: Failed to get access token with popup",e),P("Samtycke krävs för inloggning. Tillåt popup-fönster och försök igen."),q(null)}else P("Failed to get access token: "+(r.message?.toString()||r.toString())),console.log("CODICENT: ACCESS TOKEN ERROR",r)}})().then((()=>{}))}),[t,l,n,g,a]),e.useEffect((()=>{if(u&&u.sub&&d&&void 0===m){let e=!0;return(i?.loginFn?i.loginFn(A,u.sub,d):A.loginUser(u.sub,d)).then((r=>{e&&(null===r?j(!1):""===r?P("Kontrollera internetanslutningen och försök igen."):(A.setToken(r),A.getNickname().then(_),j(!0)))})).catch((()=>{e&&(P("Ett fel uppstod. Försök igen senare."),j(!1))})),()=>{e=!1}}}),[u,d,m,A]);const S=e.useCallback((()=>{A.logout(),q(null),P(null),j(void 0),_(""),c({logoutParams:{returnTo:o.getConfigValue("AUTH_REDIRECT_URL")}})}),[A,c]),T=e.useCallback((async e=>{const r=i?.registerFn?await i.registerFn(A,e,u.email,u.sub,d):await A.registerUser(e,u.email,u.sub,d);return r&&(A.setToken(r),j(!0)),r}),[A,u,d]);e.useEffect((()=>{A.onUnauthorized=S}),[A]);const f=e.useCallback((async e=>{try{await p({authorizationParams:{connection:"email",login_hint:e}})}catch(e){console.error("Passwordless login failed:",e),P(`Passwordless login failed: ${e}`)}}),[p]);return e.useMemo((()=>({isAuthenticated:t,isRegistered:m,accessToken:d,authError:C,isLoading:a,user:u,nickname:E,logout:S,registerUser:T,codicentService:A,loginWithRedirect:g,loginPasswordless:f})),[t,m,d,C,a,u,E,S,T,A,g,f])};
@@ -37,6 +37,8 @@ export interface HomePageProps {
37
37
  appName?: string;
38
38
  /** URL for a support link shown at the bottom of the home screen. */
39
39
  supportUrl?: string;
40
+ /** Optional URL to a custom icon image for the support link. Falls back to QuestionCircle24Regular when not set. */
41
+ supportIconUrl?: string;
40
42
  }
41
43
  export declare const Home: React.FC<HomePageProps>;
42
44
  export default Home;
@@ -1 +1 @@
1
- {"version":3,"file":"Home.d.ts","sourceRoot":"","sources":["../../../src/pages/Home.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AA2BnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAA+D,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAmCD,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAmJD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,sGAAsG;IACtG,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gHAAgH;IAChH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAmbxC,CAAC;AAEF,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Home.d.ts","sourceRoot":"","sources":["../../../src/pages/Home.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AA2BnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAA+D,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAmCD,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA0JD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,sGAAsG;IACtG,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gHAAgH;IAChH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oHAAoH;IACpH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA4bxC,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),r=require("@fluentui/react-components"),n=require("@fluentui/react-icons"),i=require("react-router-dom");require("../components/Markdown.js"),require("../components/Textarea.js");var s=require("../components/Button.js");require("../components/CompoundButton.js");var o=require("../components/Title.js"),a=require("../components/Text.js"),l=require("../components/Spinner.js");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 c=require("../hooks/useStateWithLocalStorage.js");require("../services/codicent.js"),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"),require("exceljs"),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("./ListPage.js"),require("./CrmPage.js"),require("./CrmPagePersistent.js"),require("./ImageView.js"),require("./FormInvite.js"),require("./FormAccept.js"),require("./Sales.js"),require("./Purchase.js");var u=require("../components/Content.js"),d=require("../components/Page.js");require("./QrScan.js");var p=require("../hooks/useLocalization.js");require("../components/FileThumbnail.js"),require("react-dom/client"),require("../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js");var m=require("../hooks/useCodicentState.js");require("../hooks/useAppStyles.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"),require("../components/SearchBox.js"),require("../components/DataMessagePicker.js"),require("../components/HtmlView.js"),require("../components/Footer.js");var g=require("../components/UrlProcessor.js");require("../components/QrCodeDialog.js"),require("../components/QrScanner.js"),require("../components/OfflineMessage.js"),require("../components/LanguageSelector.js"),require("../components/ListView.js"),require("../components/RecordModal.js");var j=require("../components/BulkUploadDialog.js");function h(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}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 x=h(n);const f=t=>{if(!t)return null;const r=x[t];if(r&&("function"==typeof r||"object"==typeof r))try{return e.jsx(r,{})}catch{return null}return null},v=t=>{switch(t){case"Start Your CV AI Assistant":return e.jsx(n.Rocket24Regular,{});case"Smart CV Matching":return e.jsx(n.Briefcase24Regular,{});case"Enhance & Optimize CVs":return e.jsx(n.Sparkle24Regular,{});case"View CV Database":return e.jsx(n.Database24Regular,{});case"Create Job Requirements":return e.jsx(n.Target24Regular,{});case"Chat with CV AI":return e.jsx(n.Chat24Regular,{});default:return null}},q=r.makeStyles({main:{flexGrow:1,...r.shorthands.padding("10px"),overflowY:"auto",touchAction:"pan-y"},editButton:{position:"absolute",top:"80px",right:"16px",zIndex:10,background:"transparent",boxShadow:"none",border:"none",cursor:"pointer",padding:0,pointerEvents:"auto"},root:{height:"100%",backgroundPosition:"calc(50%) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",touchAction:"pan-y",pointerEvents:"none"},item:{height:"auto",width:"auto",flexShrink:1},buttonsList:{display:"flex",flexWrap:"wrap",justifyContent:"space-between",flexDirection:"column",alignItems:"center",gap:"1.5rem",...r.shorthands.padding("10px"),paddingTop:"30px",pointerEvents:"auto"},buttonContent:{display:"flex",alignItems:"center",gap:"8px"},buttonContentColumn:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:"4px",width:"100%"},buttonContentRow:{display:"flex",alignItems:"center",gap:"8px","& > svg":{flexShrink:0,width:"24px"}},buttonSubtitle:{fontSize:"0.85em",opacity:.75,fontWeight:"normal",marginTop:"2px",paddingLeft:"32px"},menuPopover:{minWidth:"16rem",borderRadius:"12px",...r.shorthands.padding("6px"),boxShadow:"0 8px 32px rgba(0,0,0,0.18), 0 2px 8px rgba(0,0,0,0.10)"},menuItemIconBadge:{display:"flex",alignItems:"center",justifyContent:"center",width:"32px",height:"32px",borderRadius:"8px",backgroundColor:"var(--colorBrandBackground2)",color:"var(--colorBrandForeground2)",flexShrink:0},menuItemTitle:{fontWeight:"500",fontSize:"0.95em"},menuItemSubtitle:{fontSize:"0.78em",opacity:.6,paddingLeft:"42px"},welcomeInfo:{display:"flex",flexDirection:"column",gap:"8px",alignItems:"center",textAlign:"center",maxWidth:"20rem",pointerEvents:"auto"},scrollableContent:{overflowY:"auto"},supportLink:{position:"absolute",top:"80px",right:"52px",zIndex:10,display:"flex",alignItems:"center",gap:"4px",fontSize:"0.8rem",opacity:.6,textDecoration:"none",color:"inherit",pointerEvents:"auto","&:hover":{opacity:1}}}),b=({state:h,audio:x,voice:b,buttons:k,backgroundImageUrl:C,welcomeText:S,slogan:y,indexTitle:w,developerMode:A,onEditClick:I,buttonStyles:D={},appName:N,supportUrl:P})=>{const{selectedApp:T,nickname:B,apps:z,name:M}=h.context,{service:R,error:_,stateMachine:E,currentStateName:L,fixAppUrl:F}=h,W=q(),[U,$]=c.default("app-buttons_"+T,[]),[V,O]=t.useState(!1),[H,Q]=t.useState(!1),[Y,G]=t.useState([]),[K,J]=t.useState(""),[X,Z]=t.useState(""),[ee,te]=t.useState(""),[re,ne]=t.useState(new Set),{updating:ie,welcomeStatusText:se}=m.default(E),{t:oe}=p.default();t.useEffect((()=>{void 0!==k?$(k):T&&R.getAppButtons().then((e=>$(e))).catch(console.warn)}),[R,$,T,k]);const ae=e=>{e.preventDefault(),e.stopPropagation()},le=!T||"hasAccess"!==L,ce=!T||"hasAccess"!==L,ue=T&&"hasAccess"===L,de=!T&&"hasAccess"===L&&z.length>1,pe=!_&&!T&&!N,me="noAccess"===L&&(1===z.length||!!N),ge=T&&"hasAccess"===L;return e.jsx(d.Page,{hideHeader:le,hideFooter:ce,audio:x,voice:b,children:e.jsxs("div",{className:W.root,style:{backgroundImage:C?`url(${C})`:void 0},children:[P&&e.jsx("a",{href:P,target:"_blank",rel:"noopener noreferrer",className:W.supportLink,children:e.jsx(n.QuestionCircle24Regular,{})}),A&&I&&"hasAccess"===L&&e.jsx("div",{className:W.editButton,children:e.jsx(r.Tooltip,{content:oe("Edit settings")||"Edit settings",relationship:"label",children:e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.Edit24Regular,{}),"aria-label":oe("Edit settings")||"Edit settings",onClick:I,size:"small"})})}),e.jsx("div",{className:W.item,children:e.jsx("div",{className:W.item,children:e.jsxs("div",{className:W.buttonsList,children:[de&&e.jsxs(e.Fragment,{children:[e.jsx(o.Title,{children:oe("Välkommen, vart vill du gå?")}),z.map(((t,n)=>e.jsx("div",{children:e.jsx(s.Button,{size:"large",appearance:"primary",onClick:()=>E.setSelectedApp(t.id),children:e.jsxs("div",{className:W.buttonContent,children:[t.logo&&e.jsx(r.Image,{src:t.logo,height:24}),t.title||t.id]})})},"codicent_button_"+n)))]}),pe&&e.jsxs(e.Fragment,{children:[e.jsx(o.Title,{children:oe("Skapa ny?")}),e.jsx(a.Text,{size:400,children:oe("Här går du vidare för att skapa din egna privata digitala assistent.")}),e.jsx(s.Button,{size:"large",appearance:"primary",onClick:()=>E.update(),children:oe("Kör!")})]}),me&&e.jsx("div",{children:e.jsxs(u.default,{children:[e.jsx(o.Title,{children:`${oe("Välkommen till")} ${w}`}),!V&&e.jsx(a.Text,{size:400,children:oe("Du är inte medlem än. Skicka begäran för att komma in!")}),!V&&e.jsx(s.Button,{size:"large",appearance:"primary",onClick:async()=>{if(O(!0),!N)return console.error("appName prop not provided."),alert("appName not defined."),void O(!1);await R.requestInvite(B,N)?alert(oe("Begäran skickad! Du får åtkomst när ägaren godkänner.")):(O(!1),alert(oe("Misslyckades att skicka begäran. Försök igen senare.")))},children:oe("Skicka begäran")}),!V&&e.jsxs(a.Text,{size:300,children:[oe("Har du redan ett abonnemang? Då kanske har du loggat in med fel konto.")," ",e.jsx(i.Link,{to:"/logout",children:oe("Logga ut")})," ",oe("och sedan in igen för att komma igång.")]}),V&&e.jsx(a.Text,{size:400,children:oe("Begäran skickad till ägaren.")}),V&&e.jsx(s.Button,{size:"large",onClick:()=>{window.location.href="./"},children:oe("Kontrollera åtkomst")})]})}),ge&&e.jsxs("div",{className:W.welcomeInfo,children:[e.jsx(a.Text,{weight:"semibold",size:500,align:"center",children:S?S.replace("{{username}}",M||B||""):oe("Välkommen")}),y&&e.jsx(a.Text,{weight:"semibold",italic:!0,size:400,align:"center",children:y}),ie&&e.jsx(l.Spinner,{}),!ie&&se&&e.jsx(a.Text,{size:400,align:"center",children:oe(se)})]}),ue&&U.map(((t,n)=>{const i="file_drop"===t.type,o="multi_option"===t.type,a=t.options&&Array.isArray(t.options)?t.options:[],l=e=>{const t=e.replace("upload:","").split(":");if(t.length>=4){J(t[0]?.trim()||""),Z(t[1]?.trim()||""),te(t[2]?.trim()||"");const e=t[3]?.trim()||"";G(e?e.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[])}else{J(""),Z(""),te("");const e=t[0]?.trim()||"";G(e?e.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[])}Q(!0)},c=(e,t)=>{if(e.startsWith("voice:")){const t=e.replace("voice:","").trim();t&&b?.updateInstructions(t),b?.connectConversation()}else e.startsWith("upload:")?l(e):e.startsWith("app:")?t(e.replace("app:",F("/app/index.html?token={token}&app={app}&nickname={nickname}")).trim()):t(e)};return e.jsx("div",{children:i?e.jsx("div",{className:`${W.item} ${re.has(n)?"dragActive":""}`,style:{width:"16rem",minWidth:"15rem",border:`2px dashed ${D.textColor||"#ccc"}`,backgroundColor:re.has(n)?D.activeColor||void 0:D.backgroundColor||void 0,color:D.textColor||void 0,borderRadius:"8px",padding:"1.2rem 1rem",textAlign:"center",cursor:"pointer"},onDragEnter:e=>((e,t)=>{e.preventDefault(),e.stopPropagation(),ne((e=>new Set(e.add(t))))})(e,n),onDragLeave:e=>((e,t)=>{e.preventDefault(),e.stopPropagation(),ne((e=>{const r=new Set(e);return r.delete(t),r}))})(e,n),onDragOver:ae,onDrop:e=>(async(e,t,r)=>{e.preventDefault(),e.stopPropagation(),ne((e=>{const t=new Set(e);return t.delete(r),t}));const n=Array.from(e.dataTransfer.files);if(0===n.length)return;let i=[];if(t.url.startsWith("upload:")){const e=t.url.replace("upload:","").split(":"),r=(e.length>=4?e[3]:e[0])?.trim()||"";i=r?r.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[]}for(const e of n)try{const t=new FormData;t.append("file",e);const r=await R.uploadFile(e.name,t);if(!r)continue;const n=i.length>0?i.map((e=>`#${e}`)).join(" "):"#index #summarize";await R.sendMessage(`@${T} ${n}\n\n${e.name}\n#file:${r}\n`)}catch(t){console.error("Error processing file:",e.name,t)}})(e,t,n),onClick:()=>t.url.startsWith("upload:")&&l(t.url),children:e.jsxs("div",{className:W.buttonContentColumn,children:[e.jsxs("div",{className:W.buttonContentRow,children:[f(t.icon)||v(t.title),e.jsx("span",{children:oe(t.title)})]}),e.jsx("div",{className:W.buttonSubtitle,children:re.has(n)?oe("Drop files here..."):oe("Drag files here or click")})]})}):o?e.jsxs(r.Menu,{children:[e.jsx(r.MenuTrigger,{children:e.jsx(r.MenuButton,{size:"large",appearance:"primary",style:{width:"16rem",minWidth:"15rem",border:"none",backgroundColor:D.backgroundColor||void 0,color:D.textColor||void 0,padding:"1.2rem 1rem"},children:e.jsxs("div",{className:W.buttonContentColumn,children:[e.jsxs("div",{className:W.buttonContentRow,children:[f(t.icon)||v(t.title),e.jsx("span",{children:oe(t.title)})]}),t.subtitle&&e.jsx("div",{className:W.buttonSubtitle,children:oe(t.subtitle)})]})})}),e.jsx(r.MenuPopover,{className:W.menuPopover,children:e.jsx(r.MenuList,{children:a.map(((t,i)=>e.jsx(g.UrlProcessor,{service:R,children:n=>e.jsx(r.MenuItem,{onClick:()=>c(t.url,n),children:e.jsxs("div",{children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[f(t.icon)&&e.jsx("div",{className:W.menuItemIconBadge,children:f(t.icon)}),e.jsx("span",{className:W.menuItemTitle,children:oe(t.title)})]}),t.subtitle&&e.jsx("div",{className:W.menuItemSubtitle,children:oe(t.subtitle)})]})})},`option_${n}_${i}`)))})})]}):e.jsx(g.UrlProcessor,{service:R,children:r=>e.jsx(s.Button,{size:"large",appearance:"primary",style:{width:"16rem",minWidth:"15rem",border:"none",backgroundColor:D.backgroundColor||void 0,color:D.textColor||void 0,padding:"1.2rem 1rem"},onClick:()=>c(t.url,r),children:e.jsxs("div",{className:W.buttonContentColumn,children:[e.jsxs("div",{className:W.buttonContentRow,children:[f(t.icon)||v(t.title),e.jsx("span",{children:oe(t.title)})]}),t.subtitle&&e.jsx("div",{className:W.buttonSubtitle,children:oe(t.subtitle)})]})})})},"button_"+n)}))]})})}),P&&e.jsx("a",{href:P,target:"_blank",rel:"noopener noreferrer",className:W.supportLink,children:e.jsx(n.QuestionCircle24Regular,{})}),_&&e.jsx("div",{className:"error",children:_}),e.jsx(j.default,{project:T||"",hidden:!H,onDismiss:()=>{Q(!1),J(""),Z(""),te(""),G([])},sendMessage:async e=>{try{return await R.sendMessage(e)}catch{return}},onUploaded:()=>{Q(!1),J(""),Z(""),te(""),G([])},service:R,tags:Y,title:K,description:X,dropText:ee})]})})};exports.Home=b,exports.default=b;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),r=require("@fluentui/react-components"),n=require("@fluentui/react-icons"),i=require("react-router-dom");require("../components/Markdown.js"),require("../components/Textarea.js");var s=require("../components/Button.js");require("../components/CompoundButton.js");var o=require("../components/Title.js"),a=require("../components/Text.js"),l=require("../components/Spinner.js");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 c=require("../hooks/useStateWithLocalStorage.js");require("../services/codicent.js"),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"),require("exceljs"),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("./ListPage.js"),require("./CrmPage.js"),require("./CrmPagePersistent.js"),require("./ImageView.js"),require("./FormInvite.js"),require("./FormAccept.js"),require("./Sales.js"),require("./Purchase.js");var u=require("../components/Content.js"),d=require("../components/Page.js");require("./QrScan.js");var p=require("../hooks/useLocalization.js");require("../components/FileThumbnail.js"),require("react-dom/client"),require("../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js");var m=require("../hooks/useCodicentState.js");require("../hooks/useAppStyles.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"),require("../components/SearchBox.js"),require("../components/DataMessagePicker.js"),require("../components/HtmlView.js"),require("../components/Footer.js");var g=require("../components/UrlProcessor.js");require("../components/QrCodeDialog.js"),require("../components/QrScanner.js"),require("../components/OfflineMessage.js"),require("../components/LanguageSelector.js"),require("../components/ListView.js"),require("../components/RecordModal.js");var h=require("../components/BulkUploadDialog.js");function j(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}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 x=j(n);const f=t=>{if(!t)return null;const r=x[t];if(r&&("function"==typeof r||"object"==typeof r))try{return e.jsx(r,{})}catch{return null}return null},v=t=>{switch(t){case"Start Your CV AI Assistant":return e.jsx(n.Rocket24Regular,{});case"Smart CV Matching":return e.jsx(n.Briefcase24Regular,{});case"Enhance & Optimize CVs":return e.jsx(n.Sparkle24Regular,{});case"View CV Database":return e.jsx(n.Database24Regular,{});case"Create Job Requirements":return e.jsx(n.Target24Regular,{});case"Chat with CV AI":return e.jsx(n.Chat24Regular,{});default:return null}},b=r.makeStyles({main:{flexGrow:1,...r.shorthands.padding("10px"),overflowY:"auto",touchAction:"pan-y"},editButton:{position:"absolute",top:"80px",right:"16px",zIndex:10,background:"transparent",boxShadow:"none",border:"none",cursor:"pointer",padding:0,pointerEvents:"auto"},root:{height:"100%",backgroundPosition:"calc(50%) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",touchAction:"pan-y",pointerEvents:"none"},item:{height:"auto",width:"auto",flexShrink:1},buttonsList:{display:"flex",flexWrap:"wrap",justifyContent:"space-between",flexDirection:"column",alignItems:"center",gap:"1.5rem",...r.shorthands.padding("10px"),paddingTop:"30px",pointerEvents:"auto"},buttonContent:{display:"flex",alignItems:"center",gap:"8px"},buttonContentColumn:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:"4px",width:"100%"},buttonContentRow:{display:"flex",alignItems:"center",gap:"8px","& > svg":{flexShrink:0,width:"24px"}},buttonSubtitle:{fontSize:"0.85em",opacity:.75,fontWeight:"normal",marginTop:"2px",paddingLeft:"32px"},menuPopover:{minWidth:"16rem",borderRadius:"12px",...r.shorthands.padding("6px"),boxShadow:"0 8px 32px rgba(0,0,0,0.18), 0 2px 8px rgba(0,0,0,0.10)"},menuItemIconBadge:{display:"flex",alignItems:"center",justifyContent:"center",width:"32px",height:"32px",borderRadius:"8px",backgroundColor:"var(--colorBrandBackground2)",color:"var(--colorBrandForeground2)",flexShrink:0},menuItemTitle:{fontWeight:"500",fontSize:"0.95em"},menuItemSubtitle:{fontSize:"0.78em",opacity:.6,paddingLeft:"42px"},welcomeInfo:{display:"flex",flexDirection:"column",gap:"8px",alignItems:"center",textAlign:"center",maxWidth:"20rem",pointerEvents:"auto"},scrollableContent:{overflowY:"auto"},supportLink:{position:"absolute",top:"80px",right:"52px",zIndex:10,display:"flex",alignItems:"center",gap:"4px",fontSize:"0.8rem",opacity:.6,textDecoration:"none",color:"inherit",pointerEvents:"auto","&:hover":{opacity:1}},supportIcon:{height:"24px",width:"auto",maxWidth:"120px",objectFit:"contain",display:"block"}}),q=({state:j,audio:x,voice:q,buttons:k,backgroundImageUrl:C,welcomeText:S,slogan:y,indexTitle:w,developerMode:A,onEditClick:I,buttonStyles:D={},appName:N,supportUrl:P,supportIconUrl:T})=>{const{selectedApp:B,nickname:z,apps:M,name:R}=j.context,{service:_,error:E,stateMachine:L,currentStateName:F,fixAppUrl:W}=j,U=b(),[$,V]=c.default("app-buttons_"+B,[]),[O,H]=t.useState(!1),[Q,Y]=t.useState(!1),[G,K]=t.useState([]),[J,X]=t.useState(""),[Z,ee]=t.useState(""),[te,re]=t.useState(""),[ne,ie]=t.useState(new Set),{updating:se,welcomeStatusText:oe}=m.default(L),{t:ae}=p.default();t.useEffect((()=>{void 0!==k?V(k):B&&_.getAppButtons().then((e=>V(e))).catch(console.warn)}),[_,V,B,k]);const le=e=>{e.preventDefault(),e.stopPropagation()},ce=!B||"hasAccess"!==F,ue=!B||"hasAccess"!==F,de=B&&"hasAccess"===F,pe=!B&&"hasAccess"===F&&M.length>1,me=!E&&!B&&!N,ge="noAccess"===F&&(1===M.length||!!N),he=B&&"hasAccess"===F;return e.jsx(d.Page,{hideHeader:ce,hideFooter:ue,audio:x,voice:q,children:e.jsxs("div",{className:U.root,style:{backgroundImage:C?`url(${C})`:void 0},children:[P&&e.jsx("a",{href:P,target:"_blank",rel:"noopener noreferrer",className:U.supportLink,children:T?e.jsx("img",{src:T,alt:"Support",className:U.supportIcon}):e.jsx(n.QuestionCircle24Regular,{})}),A&&I&&"hasAccess"===F&&e.jsx("div",{className:U.editButton,children:e.jsx(r.Tooltip,{content:ae("Edit settings")||"Edit settings",relationship:"label",children:e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.Edit24Regular,{}),"aria-label":ae("Edit settings")||"Edit settings",onClick:I,size:"small"})})}),e.jsx("div",{className:U.item,children:e.jsx("div",{className:U.item,children:e.jsxs("div",{className:U.buttonsList,children:[pe&&e.jsxs(e.Fragment,{children:[e.jsx(o.Title,{children:ae("Välkommen, vart vill du gå?")}),M.map(((t,n)=>e.jsx("div",{children:e.jsx(s.Button,{size:"large",appearance:"primary",onClick:()=>L.setSelectedApp(t.id),children:e.jsxs("div",{className:U.buttonContent,children:[t.logo&&e.jsx(r.Image,{src:t.logo,height:24}),t.title||t.id]})})},"codicent_button_"+n)))]}),me&&e.jsxs(e.Fragment,{children:[e.jsx(o.Title,{children:ae("Skapa ny?")}),e.jsx(a.Text,{size:400,children:ae("Här går du vidare för att skapa din egna privata digitala assistent.")}),e.jsx(s.Button,{size:"large",appearance:"primary",onClick:()=>L.update(),children:ae("Kör!")})]}),ge&&e.jsx("div",{children:e.jsxs(u.default,{children:[e.jsx(o.Title,{children:`${ae("Välkommen till")} ${w}`}),!O&&e.jsx(a.Text,{size:400,children:ae("Du är inte medlem än. Skicka begäran för att komma in!")}),!O&&e.jsx(s.Button,{size:"large",appearance:"primary",onClick:async()=>{if(H(!0),!N)return console.error("appName prop not provided."),alert("appName not defined."),void H(!1);await _.requestInvite(z,N)?alert(ae("Begäran skickad! Du får åtkomst när ägaren godkänner.")):(H(!1),alert(ae("Misslyckades att skicka begäran. Försök igen senare.")))},children:ae("Skicka begäran")}),!O&&e.jsxs(a.Text,{size:300,children:[ae("Har du redan ett abonnemang? Då kanske har du loggat in med fel konto.")," ",e.jsx(i.Link,{to:"/logout",children:ae("Logga ut")})," ",ae("och sedan in igen för att komma igång.")]}),O&&e.jsx(a.Text,{size:400,children:ae("Begäran skickad till ägaren.")}),O&&e.jsx(s.Button,{size:"large",onClick:()=>{window.location.href="./"},children:ae("Kontrollera åtkomst")})]})}),he&&e.jsxs("div",{className:U.welcomeInfo,children:[e.jsx(a.Text,{weight:"semibold",size:500,align:"center",children:S?S.replace("{{username}}",R||z||""):ae("Välkommen")}),y&&e.jsx(a.Text,{weight:"semibold",italic:!0,size:400,align:"center",children:y}),se&&e.jsx(l.Spinner,{}),!se&&oe&&e.jsx(a.Text,{size:400,align:"center",children:ae(oe)})]}),de&&$.map(((t,n)=>{const i="file_drop"===t.type,o="multi_option"===t.type,a=t.options&&Array.isArray(t.options)?t.options:[],l=e=>{const t=e.replace("upload:","").split(":");if(t.length>=4){X(t[0]?.trim()||""),ee(t[1]?.trim()||""),re(t[2]?.trim()||"");const e=t[3]?.trim()||"";K(e?e.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[])}else{X(""),ee(""),re("");const e=t[0]?.trim()||"";K(e?e.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[])}Y(!0)},c=(e,t)=>{if(e.startsWith("voice:")){const t=e.replace("voice:","").trim();t&&q?.updateInstructions(t),q?.connectConversation()}else e.startsWith("upload:")?l(e):e.startsWith("app:")?t(e.replace("app:",W("/app/index.html?token={token}&app={app}&nickname={nickname}")).trim()):t(e)};return e.jsx("div",{children:i?e.jsx("div",{className:`${U.item} ${ne.has(n)?"dragActive":""}`,style:{width:"16rem",minWidth:"15rem",border:`2px dashed ${D.textColor||"#ccc"}`,backgroundColor:ne.has(n)?D.activeColor||void 0:D.backgroundColor||void 0,color:D.textColor||void 0,borderRadius:"8px",padding:"1.2rem 1rem",textAlign:"center",cursor:"pointer"},onDragEnter:e=>((e,t)=>{e.preventDefault(),e.stopPropagation(),ie((e=>new Set(e.add(t))))})(e,n),onDragLeave:e=>((e,t)=>{e.preventDefault(),e.stopPropagation(),ie((e=>{const r=new Set(e);return r.delete(t),r}))})(e,n),onDragOver:le,onDrop:e=>(async(e,t,r)=>{e.preventDefault(),e.stopPropagation(),ie((e=>{const t=new Set(e);return t.delete(r),t}));const n=Array.from(e.dataTransfer.files);if(0===n.length)return;let i=[];if(t.url.startsWith("upload:")){const e=t.url.replace("upload:","").split(":"),r=(e.length>=4?e[3]:e[0])?.trim()||"";i=r?r.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[]}for(const e of n)try{const t=new FormData;t.append("file",e);const r=await _.uploadFile(e.name,t);if(!r)continue;const n=i.length>0?i.map((e=>`#${e}`)).join(" "):"#index #summarize";await _.sendMessage(`@${B} ${n}\n\n${e.name}\n#file:${r}\n`)}catch(t){console.error("Error processing file:",e.name,t)}})(e,t,n),onClick:()=>t.url.startsWith("upload:")&&l(t.url),children:e.jsxs("div",{className:U.buttonContentColumn,children:[e.jsxs("div",{className:U.buttonContentRow,children:[f(t.icon)||v(t.title),e.jsx("span",{children:ae(t.title)})]}),e.jsx("div",{className:U.buttonSubtitle,children:ne.has(n)?ae("Drop files here..."):ae("Drag files here or click")})]})}):o?e.jsxs(r.Menu,{children:[e.jsx(r.MenuTrigger,{children:e.jsx(r.MenuButton,{size:"large",appearance:"primary",style:{width:"16rem",minWidth:"15rem",border:"none",backgroundColor:D.backgroundColor||void 0,color:D.textColor||void 0,padding:"1.2rem 1rem"},children:e.jsxs("div",{className:U.buttonContentColumn,children:[e.jsxs("div",{className:U.buttonContentRow,children:[f(t.icon)||v(t.title),e.jsx("span",{children:ae(t.title)})]}),t.subtitle&&e.jsx("div",{className:U.buttonSubtitle,children:ae(t.subtitle)})]})})}),e.jsx(r.MenuPopover,{className:U.menuPopover,children:e.jsx(r.MenuList,{children:a.map(((t,i)=>e.jsx(g.UrlProcessor,{service:_,children:n=>e.jsx(r.MenuItem,{onClick:()=>c(t.url,n),children:e.jsxs("div",{children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[f(t.icon)&&e.jsx("div",{className:U.menuItemIconBadge,children:f(t.icon)}),e.jsx("span",{className:U.menuItemTitle,children:ae(t.title)})]}),t.subtitle&&e.jsx("div",{className:U.menuItemSubtitle,children:ae(t.subtitle)})]})})},`option_${n}_${i}`)))})})]}):e.jsx(g.UrlProcessor,{service:_,children:r=>e.jsx(s.Button,{size:"large",appearance:"primary",style:{width:"16rem",minWidth:"15rem",border:"none",backgroundColor:D.backgroundColor||void 0,color:D.textColor||void 0,padding:"1.2rem 1rem"},onClick:()=>c(t.url,r),children:e.jsxs("div",{className:U.buttonContentColumn,children:[e.jsxs("div",{className:U.buttonContentRow,children:[f(t.icon)||v(t.title),e.jsx("span",{children:ae(t.title)})]}),t.subtitle&&e.jsx("div",{className:U.buttonSubtitle,children:ae(t.subtitle)})]})})})},"button_"+n)}))]})})}),P&&e.jsx("a",{href:P,target:"_blank",rel:"noopener noreferrer",className:U.supportLink,children:T?e.jsx("img",{src:T,alt:"Support",className:U.supportIcon}):e.jsx(n.QuestionCircle24Regular,{})}),E&&e.jsx("div",{className:"error",children:E}),e.jsx(h.default,{project:B||"",hidden:!Q,onDismiss:()=>{Y(!1),X(""),ee(""),re(""),K([])},sendMessage:async e=>{try{return await _.sendMessage(e)}catch{return}},onUploaded:()=>{Y(!1),X(""),ee(""),re(""),K([])},service:_,tags:G,title:J,description:Z,dropText:te})]})})};exports.Home=q,exports.default=q;
@@ -1 +1 @@
1
- {"version":3,"file":"ListPage.d.ts","sourceRoot":"","sources":["../../../src/pages/ListPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAuB3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;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
+ {"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,4CAsmB1F,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 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;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react");require("../components/Markdown.js"),require("../components/Textarea.js"),require("../components/Button.js"),require("../components/CompoundButton.js");var r=require("@fluentui/react-components");require("../components/Spinner.js");var n=require("../components/TextHeader.js");require("../components/TypingIndicator.js"),require("../components/Dialog.js"),require("../components/ChatInput.js"),require("../components/CombinedPlaceholderDialog.js"),require("../components/ChatMessage.js"),require("../components/Header.js");var a=require("@fluentui/react-icons");require("../services/codicent.js");var s=require("../services/dataCache.js"),i=require("../utils/MessageContent.js");require("../node_modules/tinycolor2/esm/tinycolor.js"),require("../_virtual/index.js"),require("../config/index.js"),require("../utils/cacheManager.js"),require("../lib/wavtools/lib/wav_packer.js"),require("../lib/wavtools/lib/analysis/audio_analysis.js"),require("../lib/wavtools/lib/wav_stream_player.js"),require("../lib/wavtools/lib/wav_recorder.js");var o=require("../utils/excelExport.js");require("./AppFrame.js"),require("./Canvas.js"),require("./Chat.js"),require("./Compose.js"),require("./Snap.js"),require("./Search.js"),require("./Menu.js"),require("./Log.js"),require("./Login.js"),require("./Home.js"),require("./CrmPage.js"),require("./CrmPagePersistent.js"),require("./ImageView.js"),require("./FormInvite.js"),require("./FormAccept.js"),require("./Sales.js");var c=require("react-router-dom");require("./Purchase.js"),require("../components/Content.js");var l=require("../components/Page.js");require("./QrScan.js");var u=require("../hooks/useLocalization.js");require("../components/FileThumbnail.js"),require("react-dom/client"),require("../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js"),require("../hooks/useAppStyles.js");var d=require("../hooks/useUserRoles.js");require("../components/MessageInput.js"),require("../components/UploadFile.js"),require("../components/SnapFooter.js"),require("../components/Profile.js"),require("../components/MessageItem.js"),require("../components/AiInput.js");var p=require("../components/SearchBox.js");require("../components/DataMessagePicker.js"),require("../components/HtmlView.js"),require("../components/Footer.js"),require("../components/QrCodeDialog.js"),require("../components/QrScanner.js"),require("../components/OfflineMessage.js"),require("../components/LanguageSelector.js");var m=require("../components/ListView.js"),g=require("../components/RecordModal.js");require("../components/BulkUploadDialog.js"),require("../components/CookieBanner.js"),require("../components/audit/AuditCircularProgress.js"),require("../components/audit/AuditHorizontalProgress.js"),require("../components/audit/AuditRoleIndicator.js"),require("../components/audit/AuditUnitSwitcher.js"),require("../components/audit/AuditAnswerCell.js"),require("../components/audit/AuditSearchBar.js"),require("../components/audit/AuditFilterChips.js"),require("../components/audit/AuditFilterBar.js"),require("../components/audit/AuditGroupsProgress.js"),require("../components/audit/AuditSummaryDashboard.js"),require("../components/audit/AuditRequirementDialog.js"),require("../components/audit/AuditUnitExportDialog.js"),require("../components/audit/AuditUnitImportDialog.js"),require("../components/audit/AuditBulkExportDialog.js"),require("../components/audit/AuditBulkUploadDialog.js"),require("../components/audit/AuditSortPresets.js");var f=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"}}),j=500,q=({state:q,getColumnDefs:x,getListConfig:C,filterData:S})=>{const[y,w]=c.useSearchParams(),A=y.get("tag")||"logbook",v=y.get("title")||"",k=y.get("contentTitle"),b="true"===y.get("loadAll"),D="true"===y.get("canAdd"),M="true"===y.get("canEdit"),R="false"!==y.get("canExport"),B=y.get("addUrl")||"",E=y.get("q")||"",[I,P]=t.useState(E),[_,T]=t.useState(E),{service:$}=q,[N,L]=t.useState([]),[U,F]=t.useState(!1),[O,H]=t.useState(!1),[W,z]=t.useState(!1),V=t.useRef(null),G=t.useRef(E),J=t.useRef(""),Q=t.useRef(0),K=t.useRef($);K.current=$;const X=!!$,[Y,Z]=t.useState(0),[ee,te]=t.useState(null),re=h(),{t:ne}=u.default(),ae=c.useNavigate(),{getCurrentUserName:se}=d.useUserRoles($,q.context.nickname,q.context.selectedApp),ie=t.useMemo((()=>(k?[{key:k,title:k,maxWidth:250}]:C?C(A)?.columns??[]:x?x(A):[]).map((e=>({...e,title:e.title?ne(e.title):void 0})))),[k,A,ne,x,C]),[oe,ce]=t.useState(!1),[le,ue]=t.useState(null),[de,pe]=t.useState(!1),[me,ge]=t.useState(null),fe=t.useMemo((()=>`listpage_searches_${A}`),[A]),he=e=>{try{const t=localStorage.getItem(e);return t?JSON.parse(t):[]}catch{return[]}},[je,qe]=t.useState((()=>he(fe)));t.useEffect((()=>{qe(he(fe))}),[fe]);const xe=t.useCallback((e=>{const t=e.trim();t&&qe((e=>{const r=[t,...e.filter((e=>e!==t))].slice(0,20);try{localStorage.setItem(fe,JSON.stringify(r))}catch{}return r}))}),[fe]),Ce=t.useCallback((e=>{qe((t=>{const r=t.filter((t=>t!==e));try{localStorage.setItem(fe,JSON.stringify(r))}catch{}return r}))}),[fe]),Se=t.useMemo((()=>f.lodashExports.debounce((e=>T(e)),500)),[T]);t.useEffect((()=>()=>{Se.cancel()}),[Se]);const ye=t.useCallback((e=>{P(e),Se(e)}),[Se]),we=t.useCallback((e=>{xe(e)}),[xe]);t.useEffect((()=>{if(!y.get("q")){const e=y.get(`filter_${A}`);if(e){let t=e;if("%USERNAME%"===t){const e=se();if(!e)return;t=e}P(t),T(t),G.current=t}}}),[A,y,se]),t.useEffect((()=>{const e=y.get("q")||"";e!==G.current&&(P(e),T(e),G.current=e,J.current="")}),[y]),t.useEffect((()=>(V.current&&clearTimeout(V.current),V.current=setTimeout((()=>{if(G.current!==I){const e=new URLSearchParams(y);I?e.set("q",I):e.delete("q"),w(e,{replace:!0}),G.current=I}}),500),()=>{V.current&&clearTimeout(V.current)})),[I,y,w]),t.useEffect((()=>{if(!K.current)return;const e=`${A}-${k}-${b}-${Y}-${_}`;if(e===J.current)return;J.current=e;const t=++Q.current,r=()=>t===Q.current,n=k?`${A}-${_}-${k}`:`${A}-${_||"all"}`,a=s.dataCache.get(n);if(a){if(L(a),H(!b&&!k&&a.length>=j),!k&&!_&&a.length>0){const e=a.reduce(((e,t)=>t.createdAt>e?t.createdAt:e),a[0].createdAt);K.current.readDataMessages(A,"",void 0,void 0,void 0,e).then((e=>{r()&&L((t=>{const r=new Set(t.map((e=>e.id))),a=e.filter((e=>!r.has(e.id)));if(0===a.length)return t;const i=[...a,...t];return s.dataCache.set(n,i),i}))})).catch(console.warn)}}else if(H(!1),F(!0),k)K.current.getMessagesFast([A],_).then((e=>{if(!r())return;const t=e.map((e=>{const t=new Date(e.createdAt).toLocaleString();return{id:e.id,data:{[k]:new i.default(e.content).content,createdAt:t},fileId:null,fileIds:[],tags:[A],mentions:[K.current.codicent],createdAt:t}}));s.dataCache.set(n,t),L(t)})).catch(console.warn).finally((()=>{r()&&F(!1)}));else{const e=_||"",t=b||e?void 0:j;K.current.readDataMessages(A,e,void 0,0,t).then((t=>{r()&&(s.dataCache.set(n,t),L(t),H(!b&&!e&&t.length===j))})).catch(console.warn).finally((()=>{r()&&F(!1)}))}}),[A,k,b,_,Y,X]);const Ae=t.useMemo((()=>{const e={};y.forEach(((t,r)=>{r.startsWith("filter_")&&(e[r.replace("filter_","")]=t)}));let t=N.map(((e,t)=>({item:e,index:t})));for(const[r,n]of Object.entries(e)){const e=n.replace("%USERNAME%",se()),a=q.context.nickname||"";t=t.filter((({item:t})=>{const n=t.data[r];return null!=n&&(String(n).includes(e)||String(n).includes(a))}))}if(S){const e=S(t.map((({item:e})=>e)),A),r=new Set(e.map((e=>e.id)));t=t.filter((({item:e})=>r.has(e.id)))}const r=t.map((({item:e,index:t})=>({...e.data,createdAt:e.createdAt,_id:e.id,originalMessageId:e.originalMessageId||e.id,_fileIds:e.fileIds??[],_index:t}))),n=C?.(A)?.deduplicateBy;if(n){const e=Array.isArray(n)?n:[n],t=t=>{for(const r of e){const e=t[r];if(null!=e&&""!==String(e).trim())return String(e)}},a=new Set;return r.filter((e=>{const r=t(e);return void 0===r||!a.has(r)&&(a.add(r),!0)}))}return r}),[N,y,q.context.nickname,se,S,A,C]),ve=t.useMemo((()=>{const e=(I||"").trim().toLowerCase();if(!e)return Ae;const t=ie.filter((e=>!e.hidden)).map((e=>e.key));return Ae.filter((r=>{for(const n of t)if(Array.isArray(n))for(const t of n){const n=r[t];if(null!=n&&String(n).toLowerCase().includes(e))return!0}else{const t=r[n];if(null!=t&&String(t).toLowerCase().includes(e))return!0}return!1}))}),[Ae,I,ie]),ke=t.useCallback((()=>{s.dataCache.clearPattern(A),J.current="",Z((e=>e+1))}),[A]),be=t.useCallback((async()=>{z(!0);try{const e=await K.current.readDataMessages(A,"",void 0,N.length,j),t=[...N,...e];L(t),s.dataCache.set(`${A}-all`,t),H(e.length===j)}catch(e){console.warn(e)}finally{z(!1)}}),[N,A]),De=t.useCallback((e=>{te(e)}),[]),Me=()=>{pe(!1),ge(null)},Re=t.useCallback((async()=>{const e=`${A}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const t=null!==ee?ee:ve;await o.exportToExcel(t,ie,e,ne)||console.warn("No data to export")}),[ee,ve,ie,A,ne]),Be=t.useMemo((()=>null!==ee?ee.length:ve.length),[ee,ve]);return e.jsx(l.Page,{hideHeader:!0,children:e.jsxs("div",{className:re.container,children:[e.jsx("div",{className:re.backButton,children:e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(a.ArrowLeft24Regular,{}),onClick:()=>ae(-1),children:ne("Tillbaka")})}),e.jsxs("div",{className:re.headerRow,children:[e.jsx(n.default,{title:ne(v||"Loggbok")}),e.jsxs("div",{className:re.buttonGroup,children:[e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(a.ArrowClockwise24Regular,{}),onClick:ke,title:ne("Refresh"),children:ne("Refresh")}),R&&e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(a.ArrowDownload24Regular,{}),onClick:Re,title:ne("Export to Excel"),children:ne("Export to Excel")}),(D||B)&&e.jsx(r.Button,{appearance:"primary",icon:e.jsx(a.Add24Regular,{}),onClick:D?()=>{ue(null),ce(!0)}:()=>window.open(B,"_blank"),className:re.addButton,children:ne("Add Record")})]})]}),e.jsx("div",{className:re.searchBox,children:e.jsx(p.default,{placeholder:ne("Sök")+"...",value:I,onChange:ye,recentSearches:je,onCommitSearch:we,onRemoveRecentSearch:Ce})}),!U&&e.jsxs("div",{className:re.recordsCount,children:[ne("Total"),": ",Be," ",ne("records"),Be!==N.length&&` (${ne("filtered from")} ${N.length})`]}),e.jsxs("div",{className:re.listContainer,children:[U&&e.jsx("p",{children:ne("Söker")+"..."}),!U&&e.jsx(m.default,{data:ve,columns:ie,canEdit:M,onEdit:(e,t)=>{const r=N[t];r&&(ue({data:{...r.data,_fileIds:r.fileIds??[]},index:t}),ce(!0))},onDelete:(e,t)=>{const r=N[t];r&&(ge({index:t,id:r.id}),pe(!0))},onToggleCheckbox:async(e,t,r,n)=>{const a=N[n];if(a){const e=Array.isArray(t)?t[0]:t,i={...a.data,[e]:String(r)},o=await $.updateDataMessage(a.id,i);L((e=>{const t=[...e];return t[n]={...a,id:o,data:i},t})),s.dataCache.clearPattern(A)}},onEnumChange:async(e,t,r,n)=>{const a=N[n];if(a){const e=Array.isArray(t)?t[0]:t,i={...a.data,[e]:r},o=await $.updateDataMessage(a.id,i);L((e=>{const t=[...e];return t[n]={...a,id:o,data:i},t})),s.dataCache.clearPattern(A)}},onFilteredDataChange:De})]}),O&&!I.trim()&&e.jsx("div",{className:re.loadMoreContainer,children:e.jsx(r.Button,{appearance:"primary",size:"medium",onClick:be,disabled:W,children:W?ne("Laddar..."):ne("Visa fler")+` (${N.length} ${ne("laddade")})`})}),e.jsx(g.RecordModal,{open:oe,onClose:()=>ce(!1),onSave:async e=>{const t=new Set(ie.filter((e=>"thumbnail"===e.type)).map((e=>Array.isArray(e.key)?e.key[0]:e.key)));if(le){const r=N[le.index];if(r){const n={};for(const r in e){if(t.has(r))continue;const a=e[r];n[r]=null==a?"":String(a)}const a=await $.updateDataMessage(r.id,n);L((e=>{const t=[...e];return t[le.index]={...r,id:a,data:n},t})),s.dataCache.clearPattern(A)}}else{const r={};for(const n in e){if(t.has(n))continue;const a=e[n];r[n]=null==a?"":String(a)}const n={id:await $.createDataMessage(A,r),data:r,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[A],mentions:[$.codicent]};L((e=>[n,...e])),s.dataCache.clearPattern(A)}},columns:ie,initialData:le?.data}),e.jsx(r.Dialog,{open:de,onOpenChange:(e,t)=>!t.open&&Me(),children:e.jsx(r.DialogSurface,{children:e.jsxs(r.DialogBody,{children:[e.jsx(r.DialogTitle,{children:ne("Confirm Delete")}),e.jsx(r.DialogContent,{children:ne("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:Me,children:ne("Cancel")}),e.jsx(r.Button,{appearance:"primary",onClick:async()=>{if(me)try{await $.deleteDataMessage(me.id),L((e=>e.filter(((e,t)=>t!==me.index)))),s.dataCache.clearPattern(A)}catch(e){console.error("Failed to delete record:",e)}finally{pe(!1),ge(null)}},children:ne("Delete")})]})]})})})]})})};exports.ListPage=q,exports.default=q;
@@ -16,7 +16,7 @@ export interface ColumnDefinition {
16
16
  hidden?: boolean;
17
17
  hideOnMobile?: boolean;
18
18
  maxWidth?: number;
19
- type?: "file" | "checkbox" | "textarea" | "enum" | "combobox" | undefined;
19
+ type?: "file" | "checkbox" | "textarea" | "enum" | "combobox" | "thumbnail" | undefined;
20
20
  /** Number of rows for textarea type (default: 3) */
21
21
  rows?: number;
22
22
  /** Options for enum type columns (static, small lists) */
@@ -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,CAmiB5C,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;AA+ND,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IACxF,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,2HAA2H;IAC3H,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,wFAAwF;IACxF,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,kFAAkF;IAClF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gHAAgH;IAChH,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,2HAA2H;IAC3H,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,oIAAoI;IACpI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChH,oBAAoB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;CAC1E;AA6ID,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA+iB5C,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,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
+ import{jsx as e,jsxs as t,Fragment as n}from"react/jsx-runtime";import i,{useMemo as r,useState as l,useEffect as o}from"react";import{makeStyles as a,Select as c,Button as s,Checkbox as d,Dialog as p,DialogSurface as h,DialogBody as u,DialogTitle as m,DialogContent as f,Combobox as g,Option as x,Tooltip as y}from"@fluentui/react-components";import{Edit24Regular as b,Delete24Regular as w,Attach24Regular as v}from"@fluentui/react-icons";import{CodicentService as C}from"../services/codicent.js";import k from"../hooks/useLocalization.js";const N=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}},thumbnailRow:{display:"flex",gap:"4px",flexWrap:"wrap"},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},W=e=>{const t=e.trim().replace(/[\s\u00a0]/g,"");if(""===t||"-"===t)return null;const n=(t.match(/,/g)||[]).length,i=(t.match(/\./g)||[]).length;let r;r=1===n&&0===i?/,\d{1,2}$/.test(t)?t.replace(/,\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/,/g,""):1===i&&0===n?/\.\d{1,2}$/.test(t)?t.replace(/\.\d+$/,"").replace(/[^0-9-]/g,""):t.replace(/\./g,""):t.replace(/[,.]/g,"");const l=Number(r);return""!==r&&isFinite(l)?l:null},I=(e,t)=>{if("string"==typeof t)return e[t];for(const n of t)if(void 0!==e[n])return e[n]},$=a({img:{maxWidth:"40px",maxHeight:"40px",objectFit:"cover",borderRadius:"3px",display:"block"},fileIcon:{width:"24px",height:"24px",verticalAlign:"middle"}}),O=({fileId:t})=>{const[n,i]=l(!0),r=$();return e("a",{href:C.getFileUrl(t),target:"_blank",rel:"noopener noreferrer",children:n?e("img",{src:C.getImageUrl(t,40),alt:"",className:r.img,onError:()=>i(!1)}):e(v,{className:r.fileIcon})})},A=({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]=l(t),[w,v]=l([]),[C,k]=l(!1),N=i.useRef(null);o((()=>{b(t)}),[t]),o((()=>{if(a){if(!(y.length<c))return N.current&&clearTimeout(N.current),N.current=setTimeout((async()=>{k(!0);try{const e=await a(y);v(e.slice(0,s))}finally{k(!1)}}),250),()=>{N.current&&clearTimeout(N.current)};v([])}}),[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(g,{value:y,freeform:!0,"aria-label":m,placeholder:C?f("Loading..."):a&&y.length<c?f(`Type ${c}+ characters to search...`):void 0,onChange:e=>b(e.target.value),onOptionSelect:(e,t)=>{t.optionValue&&(b(t.optionValue),u&&u(p,d,t.optionValue,h))},onBlur:()=>{u&&u(p,d,y,h)},style:{width:"100%"},children:W.map((t=>e(x,{value:t,children:t},t)))})},L=({data:i,columns:a,canEdit:g,onEdit:x,onDelete:v,onToggleCheckbox:$,onEnumChange:L,onFilteredDataChange:T})=>{const j=N(),{visibleColumns:M,defaultSortIndex:F,defaultSortDirection:D}=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]),[R,B]=l(F>=0?F:null),[E,z]=l(D),[H,P]=l(!1),[Y,U]=l({title:"",text:""}),[V,_]=l({}),[K,J]=l(0),{t:X}=k(),q=e=>e.title?X(e.title):Array.isArray(e.key)?e.key[0]:e.key,G=e=>{const t=[];return e.hideOnMobile&&t.push(j.hideOnMobile),t.join(" ")},Q=(e,t)=>{_((n=>{const i={...n};return""===t.trim()?delete i[e]:i[e]=t,i}))},Z=e=>null==e||"string"==typeof e&&e.startsWith("[")&&e.endsWith("]")?"":"object"==typeof e?JSON.stringify(e):String(e),ee=r((()=>{const e=[...i];if(null!==R&&E){const t=M[R];e.sort(((e,n)=>{const i=I(e,t.key),r=I(n,t.key);if(null==i)return 1;if(null==r)return-1;let l=0;if("string"==typeof i&&"string"==typeof r){const e=S(i),t=S(r);if(null!==e&&null!==t)l=e-t;else{const e=W(i),t=W(r);l=null!==e&&null!==t?e-t:i.localeCompare(r)}}else if("number"==typeof i&&"number"==typeof r)l=i-r;else{const e=W(String(i)),t=W(String(r));l=null!==e&&null!==t?e-t:String(i).localeCompare(String(r))}return"asc"===E?l:-l}))}return e}),[i,R,E,M]),te=r((()=>ee.filter((e=>{for(const[t,n]of Object.entries(V)){const i=parseInt(t),r=M[i],l=I(e,r.key),o=Z(l).toLowerCase(),a=n.toLowerCase();if(!("enum"===r.type&&r.enumOptions?o===a:o.includes(a)))return!1}return!0}))),[ee,V,M]);o((()=>{T&&T(te)}),[te,T]);const ne="undefined"!=typeof window?window.innerHeight-250:600,ie=Math.max(0,Math.floor(K/49)-5),re=Math.min(te.length,Math.ceil((K+ne)/49)+5),le=te.slice(ie,re),oe=49*te.length,ae=49*ie,ce=(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)})(M.slice(0,3).map((t=>String(I(e,t.key)??""))).join("-"))}`};return i&&0!==i.length?t(n,{children:[e("div",{className:j.container,onScroll:e=>{J(e.currentTarget.scrollTop)},style:{maxHeight:"calc(100vh - 200px)",overflowY:"auto"},children:t("table",{className:j.table,children:[t("thead",{children:[t("tr",{children:[M.map(((n,i)=>{const r=n.maxWidth?{width:`${n.maxWidth}px`,maxWidth:`${n.maxWidth}px`}:{};return t("th",{className:`${j.th} ${G(n)}`.trim(),style:r,onClick:()=>(e=>{R===e?"asc"===E?z("desc"):"desc"===E&&(B(null),z(null)):(B(e),z("asc"))})(i),children:[q(n),R===i&&e("span",{className:j.sortIndicator,children:"asc"===E?"▲":"▼"})]},i)})),g&&e("th",{className:`${j.th} ${j.actionsColumn}`,style:{width:"100px"},children:X("Actions")})]}),t("tr",{children:[M.map(((i,r)=>{const l=i.maxWidth?{width:`${i.maxWidth}px`,maxWidth:`${i.maxWidth}px`}:{};return e("th",{className:G(i),style:l,children:i.filterable&&e("div",{className:j.filterWrapper,children:"enum"===i.type&&i.enumOptions?t(c,{className:j.filterInput,value:V[r]||"",onChange:(e,t)=>Q(r,t.value),onClick:e=>e.stopPropagation(),children:[e("option",{value:"",children:X("All")}),i.enumOptions.filter((e=>""!==e)).map((t=>e("option",{value:t,children:X(t)},t)))]}):t(n,{children:[e("input",{type:"text",className:j.filterInput,placeholder:X("Filter")+"...",value:V[r]||"",onChange:e=>Q(r,e.target.value),onClick:e=>e.stopPropagation()}),(V[r]||"").length>0&&e(s,{appearance:"subtle",className:j.clearFilterButton,onClick:e=>{e.stopPropagation(),(e=>{_((t=>{const n={...t};return delete n[e],n}))})(r)},children:"×"})]})})},r)})),g&&e("th",{className:j.actionsColumn})]})]}),t("tbody",{children:[ie>0&&e("tr",{style:{height:`${ae}px`},children:e("td",{colSpan:M.length+(g?1:0),style:{padding:0,border:"none"}})}),le.map(((n,i)=>{const r=n._index,l="number"==typeof r?r:ie+i;return t("tr",{className:j.tr,children:[M.map(((i,r)=>{const o=I(n,i.key),a=i.format?i.format(o):Z(o),p=i.maxWidth?`${j.td} ${j.tdTruncated} ${G(i)}`.trim():`${j.td} ${G(i)}`.trim(),h=()=>{window.matchMedia("(hover: hover)").matches||i.maxWidth&&a.length>0&&(U({title:q(i),text:a}),P(!0))};if("thumbnail"===i.type){const t=Array.isArray(o)?o:[];return e("td",{className:p,children:e("div",{className:j.thumbnailRow,children:t.map((t=>e(O,{fileId:t},t)))})},r)}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:X("Download")})},r);if("checkbox"===i.type){return e("td",{className:p,children:e(d,{checked:!0===o||"true"===o||"yes"===o||"1"===o,onChange:(e,t)=>{$&&$(n,i.key,!0===t.checked,l)}})},r)}if("enum"===i.type&&i.enumOptions&&i.editable)return e("td",{className:p,children:t(c,{value:a,"aria-label":i.title?X(i.title):Array.isArray(i.key)?i.key[0]:i.key,onChange:(e,t)=>{L&&L(n,i.key,t.value,l)},style:{width:"100%"},children:[!i.enumOptions.includes(a)&&a&&e("option",{value:a,children:a}),i.enumOptions.map((t=>e("option",{value:t,children:X(t)},t)))]})},r);if("combobox"===i.type&&i.editable&&(i.enumOptions||i.enumOptionsLoader))return e("td",{className:p,children:e(A,{value:a,options:i.enumOptions,optionsLoader:i.enumOptionsLoader,minChars:i.enumOptionsLoaderMinChars,maxResults:i.enumOptionsLoaderMaxResults,columnKey:i.key,item:n,actualIndex:l,onEnumChange:L,label:i.title?X(i.title):Array.isArray(i.key)?i.key[0]:i.key,t:X})},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,l=e(s,{appearance:"subtle",icon:e(r,{}),className:j.actionIcon,onClick:e=>{e.stopPropagation(),t.onClick(n)},size:"small"});return t.tooltip?e(y,{content:X(t.tooltip),relationship:"label",children:l}):l};return e("td",{className:p,onClick:h,children:i.action?t("div",{className:j.cellWithAction,children:[i.action.iconLeft&&m(),e("span",{className:j.cellText,children:u()}),!i.action.iconLeft&&m()]}):u()},r)})),g&&(x||v)&&e("td",{className:`${j.td} ${j.actionsColumn}`,children:t("div",{style:{display:"flex",gap:"4px",justifyContent:"center"},children:[x&&e(s,{appearance:"subtle",icon:e(b,{}),className:j.editButton,onClick:()=>x(n,l),title:X("Edit")}),v&&e(s,{appearance:"subtle",icon:e(w,{}),className:j.editButton,onClick:()=>v(n,l),title:X("Delete")})]})})]},ce(n,l))})),re<te.length&&e("tr",{style:{height:oe-ae-49*le.length+"px"},children:e("td",{colSpan:M.length+(g?1:0),style:{padding:0,border:"none"}})})]})]})}),e(p,{open:H,onOpenChange:(e,t)=>P(t.open),children:e(h,{children:t(u,{children:[e(m,{children:Y.title}),e(f,{className:j.dialogContent,children:Y.text})]})})})]}):e("div",{className:j.emptyState,children:X("No data to display")})};var T=i.memo(L);export{L as ListView,T as default};
@@ -1 +1 @@
1
- {"version":3,"file":"RecordModal.d.ts","sourceRoot":"","sources":["../../../src/components/RecordModal.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAoB5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA+G9C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAuJlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"RecordModal.d.ts","sourceRoot":"","sources":["../../../src/components/RecordModal.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAqB5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAwJ9C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA+KlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1 +1 @@
1
- import{jsx as e,jsxs as n}from"react/jsx-runtime";import a,{useState as r,useEffect as o,useMemo as l}from"react";import{makeStyles as t,tokens as i,Dialog as c,DialogSurface as s,DialogBody as d,DialogTitle as u,DialogContent as p,Field as h,Checkbox as m,Textarea as f,Select as y,Input as g,DialogActions as v,Button as C,Combobox as x,Option as b}from"@fluentui/react-components";import k from"../hooks/useLocalization.js";const w=t({surface:{backgroundColor:i.colorNeutralBackground1,width:"min(calc(100vw - 32px), 560px)",maxWidth:"calc(100vw - 32px)"},content:{display:"flex",flexDirection:"column",gap:"16px",minWidth:"0",maxHeight:"60vh",overflowY:"auto"},field:{display:"flex",flexDirection:"column"}}),L=({value:n,options:t,optionsLoader:i,minChars:c=2,maxResults:s=50,label:d,onChange:u,t:p})=>{const[h,m]=r(n),[f,y]=r([]),[g,v]=r(!1),C=a.useRef(null);o((()=>{m(n)}),[n]),o((()=>{if(i){if(!(h.length<c))return C.current&&clearTimeout(C.current),C.current=setTimeout((async()=>{v(!0);try{const e=await i(h);y(e.slice(0,s))}finally{v(!1)}}),250),()=>{C.current&&clearTimeout(C.current)};y([])}}),[h,i,c,s]);const k=l((()=>(t??[]).filter((e=>e.toLowerCase().includes(h.toLowerCase()))).slice(0,s)),[t,h,s]),w=i?f:k;return e(x,{value:h,freeform:!0,"aria-label":d,placeholder:g?p("Loading..."):i&&h.length<c?p(`Type ${c}+ characters to search...`):void 0,onChange:e=>m(e.target.value),onOptionSelect:(e,n)=>{n.optionValue&&(m(n.optionValue),u(n.optionValue))},onBlur:()=>u(h),style:{width:"100%"},children:w.map((n=>e(b,{value:n,children:n},n)))})},O=({open:a,onClose:l,onSave:t,columns:i,initialData:x,title:b})=>{const O=w(),{t:N}=k(),[S,A]=r({}),[R,T]=r(!1);o((()=>{a&&A(x||{})}),[a,x]);const D=e=>Array.isArray(e.key)?e.key[0]:e.key,E=e=>{if(Array.isArray(e.key))for(const n of e.key)if(void 0!==S[n])return n;return D(e)},V=(e,n)=>{const a=E(e);A((e=>({...e,[a]:n})))},j=i.filter((e=>!e.hidden&&"file"!==e.type&&"createdAt"!==D(e)));return e(c,{open:a,onOpenChange:(e,n)=>!R&&!1===n.open&&l(),children:e(s,{className:O.surface,backdrop:{style:{backgroundColor:"rgba(0, 0, 0, 0.4)"}},children:n(d,{children:[e(u,{children:b||N(x?"Edit Record":"Add Record")}),e(p,{className:O.content,children:j.map(((n,a)=>{const r=D(n),o=(e=>{const n=E(e);return S[n]})(n),l=n.title||r;return"checkbox"===n.type?e(h,{label:l,className:O.field,children:e(m,{checked:!0===o||"true"===o||"yes"===o||"1"===o,onChange:(e,a)=>V(n,a.checked)})},a):"textarea"===n.type?e(h,{label:l,className:O.field,children:e(f,{value:String(o??""),rows:n.rows??3,onChange:(e,a)=>V(n,a.value),placeholder:N("Enter")+" "+l.toLowerCase(),resize:"vertical"})},a):"enum"===n.type&&n.enumOptions?e(h,{label:l,className:O.field,children:e(y,{value:String(o??""),onChange:(e,a)=>V(n,a.value),children:n.enumOptions.map((n=>e("option",{value:n,children:n||N("(None)")},n)))})},a):"combobox"===n.type&&(n.enumOptions||n.enumOptionsLoader)?e(h,{label:l,className:O.field,children:e(L,{value:String(o??""),options:n.enumOptions,optionsLoader:n.enumOptionsLoader,minChars:n.enumOptionsLoaderMinChars,maxResults:n.enumOptionsLoaderMaxResults,label:l,onChange:e=>V(n,e),t:N})},a):e(h,{label:l,className:O.field,children:e(g,{value:String(o??""),onChange:(e,a)=>V(n,a.value),placeholder:N("Enter")+" "+l.toLowerCase()})},a)}))}),n(v,{children:[e(C,{appearance:"secondary",onClick:l,disabled:R,children:N("Cancel")}),e(C,{appearance:"primary",onClick:async()=>{T(!0);try{await t(S),l()}catch(e){console.error("Failed to save record:",e)}finally{T(!1)}},disabled:R,children:N(R?"Saving...":"Save")})]})]})})})};export{O as RecordModal,O as default};
1
+ import{jsx as e,jsxs as a}from"react/jsx-runtime";import r,{useState as n,useEffect as l,useMemo as t}from"react";import{makeStyles as o,tokens as i,Dialog as c,DialogSurface as s,DialogBody as d,DialogTitle as m,DialogContent as u,Field as p,Checkbox as h,Textarea as f,Select as g,Input as y,DialogActions as b,Button as x,Combobox as v,Option as C}from"@fluentui/react-components";import{Attach24Regular as k}from"@fluentui/react-icons";import w from"../hooks/useLocalization.js";import{CodicentService as N}from"../services/codicent.js";const L=o({surface:{backgroundColor:i.colorNeutralBackground1,width:"min(calc(100vw - 32px), 560px)",maxWidth:"calc(100vw - 32px)"},content:{display:"flex",flexDirection:"column",gap:"16px",minWidth:"0",maxHeight:"60vh",overflowY:"auto"},field:{display:"flex",flexDirection:"column"},thumbnailRow:{display:"flex",flexWrap:"wrap",gap:"6px",marginTop:"4px"},thumbnailImg:{maxWidth:"60px",maxHeight:"60px",objectFit:"cover",borderRadius:"4px",display:"block"},thumbnailIcon:{width:"32px",height:"32px",verticalAlign:"middle"}}),O=({fileId:a,imgClassName:r,iconClassName:l})=>{const[t,o]=n(!0);return e("a",{href:N.getFileUrl(a),target:"_blank",rel:"noopener noreferrer",children:t?e("img",{src:N.getImageUrl(a,60),alt:`File attachment ${a}`,className:r,onError:()=>o(!1)}):e(k,{className:l})})},A=({value:a,options:o,optionsLoader:i,minChars:c=2,maxResults:s=50,label:d,onChange:m,t:u})=>{const[p,h]=n(a),[f,g]=n([]),[y,b]=n(!1),x=r.useRef(null);l((()=>{h(a)}),[a]),l((()=>{if(i){if(!(p.length<c))return x.current&&clearTimeout(x.current),x.current=setTimeout((async()=>{b(!0);try{const e=await i(p);g(e.slice(0,s))}finally{b(!1)}}),250),()=>{x.current&&clearTimeout(x.current)};g([])}}),[p,i,c,s]);const k=t((()=>(o??[]).filter((e=>e.toLowerCase().includes(p.toLowerCase()))).slice(0,s)),[o,p,s]),w=i?f:k;return e(v,{value:p,freeform:!0,"aria-label":d,placeholder:y?u("Loading..."):i&&p.length<c?u(`Type ${c}+ characters to search...`):void 0,onChange:e=>h(e.target.value),onOptionSelect:(e,a)=>{a.optionValue&&(h(a.optionValue),m(a.optionValue))},onBlur:()=>m(p),style:{width:"100%"},children:w.map((a=>e(C,{value:a,children:a},a)))})},R=({open:r,onClose:t,onSave:o,columns:i,initialData:v,title:C})=>{const k=L(),{t:N}=w(),[R,S]=n({}),[I,T]=n(!1);l((()=>{r&&S(v||{})}),[r,v]);const j=e=>Array.isArray(e.key)?e.key[0]:e.key,E=e=>{if(Array.isArray(e.key))for(const a of e.key)if(void 0!==R[a])return a;return j(e)},F=(e,a)=>{const r=E(e);S((e=>({...e,[r]:a})))},W=i.filter((e=>!e.hidden&&"file"!==e.type&&"thumbnail"!==e.type&&"createdAt"!==j(e))),D=i.filter((e=>!e.hidden&&"thumbnail"===e.type));return e(c,{open:r,onOpenChange:(e,a)=>!I&&!1===a.open&&t(),children:e(s,{className:k.surface,backdrop:{style:{backgroundColor:"rgba(0, 0, 0, 0.4)"}},children:a(d,{children:[e(m,{children:C||N(v?"Edit Record":"Add Record")}),a(u,{className:k.content,children:[D.map(((a,r)=>{const n=j(a),l=a.title||n,t=v?.[n],o=Array.isArray(t)?t:[];return 0===o.length?null:e(p,{label:l,className:k.field,children:e("div",{className:k.thumbnailRow,children:o.map((a=>e(O,{fileId:a,imgClassName:k.thumbnailImg,iconClassName:k.thumbnailIcon},a)))})},`thumb-${r}`)})),W.map(((a,r)=>{const n=j(a),l=(e=>{const a=E(e);return R[a]})(a),t=a.title||n;return"checkbox"===a.type?e(p,{label:t,className:k.field,children:e(h,{checked:!0===l||"true"===l||"yes"===l||"1"===l,onChange:(e,r)=>F(a,r.checked)})},r):"textarea"===a.type?e(p,{label:t,className:k.field,children:e(f,{value:String(l??""),rows:a.rows??3,onChange:(e,r)=>F(a,r.value),placeholder:N("Enter")+" "+t.toLowerCase(),resize:"vertical"})},r):"enum"===a.type&&a.enumOptions?e(p,{label:t,className:k.field,children:e(g,{value:String(l??""),onChange:(e,r)=>F(a,r.value),children:a.enumOptions.map((a=>e("option",{value:a,children:a||N("(None)")},a)))})},r):"combobox"===a.type&&(a.enumOptions||a.enumOptionsLoader)?e(p,{label:t,className:k.field,children:e(A,{value:String(l??""),options:a.enumOptions,optionsLoader:a.enumOptionsLoader,minChars:a.enumOptionsLoaderMinChars,maxResults:a.enumOptionsLoaderMaxResults,label:t,onChange:e=>F(a,e),t:N})},r):e(p,{label:t,className:k.field,children:e(y,{value:String(l??""),onChange:(e,r)=>F(a,r.value),placeholder:N("Enter")+" "+t.toLowerCase()})},r)}))]}),a(b,{children:[e(x,{appearance:"secondary",onClick:t,disabled:I,children:N("Cancel")}),e(x,{appearance:"primary",onClick:async()=>{T(!0);try{await o(R),t()}catch(e){console.error("Failed to save record:",e)}finally{T(!1)}},disabled:I,children:N(I?"Saving...":"Save")})]})]})})})};export{R as RecordModal,R as default};
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthState.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAuthState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,QAAQ,EAAqB,MAAM,oBAAoB,CAAC;AAC9G,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAUrC,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IAInB,IAAI,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,eAAe,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,gBAAgB;IAC/B,wFAAwF;IACxF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IACzG,8FAA8F;IAC9F,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB;AAED,QAAA,MAAM,YAAY,UAAW,qBAAqB,YAAY,gBAAgB,KAAG,YA+QhF,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"useAuthState.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAuthState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,QAAQ,EAAqB,MAAM,oBAAoB,CAAC;AAC9G,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAUrC,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IAInB,IAAI,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,eAAe,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,gBAAgB;IAC/B,wFAAwF;IACxF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IACzG,8FAA8F;IAC9F,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB;AAED,QAAA,MAAM,YAAY,UAAW,qBAAqB,YAAY,gBAAgB,KAAG,YA0RhF,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1 +1 @@
1
- import{useState as o,useMemo as t,useEffect as e,useCallback as s}from"react";import{CodicentService as i}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"react/jsx-runtime";import"@fluentui/react-components";import"../components/Spinner.js";import"../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"@fluentui/react-icons";import{getConfigValue as n}from"../config/index.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/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"exceljs";import"./useLocalization.js";import"./useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../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"../pages/AppFrame.js";import"../pages/Canvas.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Menu.js";import"../pages/Log.js";import"../pages/Login.js";import"../pages/Home.js";import"../pages/ListPage.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"react-router-dom";import"../pages/Purchase.js";import"../pages/QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";const r=(r,p)=>{const{isAuthenticated:a,getAccessTokenSilently:m,user:c,isLoading:l,logout:u,getAccessTokenWithPopup:g,loginWithRedirect:d,loginWithPopup:j}=r,[P,E]=o(null),[A,_]=o(void 0),[T,S]=o(null),[C,I]=o(""),h=t((()=>new i({API_BASE_URL:n("API_BASE_URL"),PUBSUB_URL:n("PUBSUB_URL"),APP_LOG_CODICENT:n("APP_LOG_CODICENT"),APP_LOG_TOKEN:n("APP_LOG_TOKEN"),APP_NAME:n("APP_NAME"),APP_PREFIX:n("APP_PREFIX"),APP_TEMPLATE:n("APP_TEMPLATE"),BUTTON_TAG:n("BUTTON_TAG"),STRIPE_PUBLIC_KEY:n("STRIPE_PUBLIC_KEY"),STRIPE_SOURCE:n("STRIPE_SOURCE"),STRIPE_TRIAL_PERIOD_DAYS:n("STRIPE_TRIAL_PERIOD_DAYS"),SUBSCRIPTION_NEEDED:n("SUBSCRIPTION_NEEDED"),USER_PREFIX:n("USER_PREFIX"),ANONYMOUS_TOKEN:n("ANONYMOUS_TOKEN")})),[]);e((()=>{!l&&a&&(async()=>{try{const o=await m({});console.debug("CODICENT: ACCESS TOKEN",o),E(o)}catch(o){console.debug("CODICENT: Failed to get access token",o);const t=o;if(t&&"object"==typeof t&&"error"in t&&"login_required"===t.error)console.warn("CODICENT: Session expired (login_required)"),E(null);else if(t&&"object"==typeof t&&"error"in t&&"consent_required"===t.error)try{const o=await g();if(!o)return void S("Failed to get access token: no token from auth0 with popup");console.log("CODICENT: GOT ACCESS TOKEN"),E(o)}catch(o){console.warn("CODICENT: Failed to get access token with popup",o),S("Samtycke krävs för inloggning. Tillåt popup-fönster och försök igen."),E(null)}else S("Failed to get access token: "+(t.message?.toString()||t.toString())),console.log("CODICENT: ACCESS TOKEN ERROR",t)}})().then((()=>{}))}),[a,g,m,d,l]),e((()=>{if(c&&c.sub&&P&&void 0===A){let o=!0;return(p?.loginFn?p.loginFn(h,c.sub,P):h.loginUser(c.sub,P)).then((t=>{o&&(null===t?_(!1):""===t?S("Kontrollera internetanslutningen och försök igen."):(h.setToken(t),h.getNickname().then(I),_(!0)))})).catch((()=>{o&&(S("Ett fel uppstod. Försök igen senare."),_(!1))})),()=>{o=!1}}}),[c,P,A,h]);const R=s((()=>{h.logout(),E(null),S(null),_(void 0),I(""),u({logoutParams:{returnTo:n("AUTH_REDIRECT_URL")}})}),[h,u]),O=s((async o=>{const t=p?.registerFn?await p.registerFn(h,o,c.email,c.sub,P):await h.registerUser(o,c.email,c.sub,P);return t&&(h.setToken(t),_(!0)),t}),[h,c,P]);e((()=>{h.onUnauthorized=R}),[h]);const U=s((async o=>{try{await j({authorizationParams:{connection:"email",login_hint:o}})}catch(o){console.error("Passwordless login failed:",o),S(`Passwordless login failed: ${o}`)}}),[j]);return t((()=>({isAuthenticated:a,isRegistered:A,accessToken:P,authError:T,isLoading:l,user:c,nickname:C,logout:R,registerUser:O,codicentService:h,loginWithRedirect:d,loginPasswordless:U})),[a,A,P,T,l,c,C,R,O,h,d,U])};export{r as default};
1
+ import{useState as o,useMemo as t,useEffect as e,useCallback as s}from"react";import{CodicentService as i}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"react/jsx-runtime";import"@fluentui/react-components";import"../components/Spinner.js";import"../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"@fluentui/react-icons";import{getConfigValue as n}from"../config/index.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/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"exceljs";import"./useLocalization.js";import"./useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../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"../pages/AppFrame.js";import"../pages/Canvas.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Menu.js";import"../pages/Log.js";import"../pages/Login.js";import"../pages/Home.js";import"../pages/ListPage.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"react-router-dom";import"../pages/Purchase.js";import"../pages/QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";const r=(r,p)=>{const{isAuthenticated:a,getAccessTokenSilently:m,user:c,isLoading:l,logout:u,getAccessTokenWithPopup:g,loginWithRedirect:d,loginWithPopup:j}=r,[P,E]=o(null),[_,A]=o(void 0),[T,S]=o(null),[C,I]=o(""),h=t((()=>new i({API_BASE_URL:n("API_BASE_URL"),PUBSUB_URL:n("PUBSUB_URL"),APP_LOG_CODICENT:n("APP_LOG_CODICENT"),APP_LOG_TOKEN:n("APP_LOG_TOKEN"),APP_NAME:n("APP_NAME"),APP_PREFIX:n("APP_PREFIX"),APP_TEMPLATE:n("APP_TEMPLATE"),BUTTON_TAG:n("BUTTON_TAG"),STRIPE_PUBLIC_KEY:n("STRIPE_PUBLIC_KEY"),STRIPE_SOURCE:n("STRIPE_SOURCE"),STRIPE_TRIAL_PERIOD_DAYS:n("STRIPE_TRIAL_PERIOD_DAYS"),SUBSCRIPTION_NEEDED:n("SUBSCRIPTION_NEEDED"),USER_PREFIX:n("USER_PREFIX"),ANONYMOUS_TOKEN:n("ANONYMOUS_TOKEN")})),[]);e((()=>{!l&&a&&(async()=>{try{const o=await m({});console.debug("CODICENT: ACCESS TOKEN",o),E(o)}catch(o){console.debug("CODICENT: Failed to get access token",o);const t=o;if(t&&"object"==typeof t&&"error"in t&&"login_required"===t.error)console.warn("CODICENT: Session expired (login_required)"),E(null);else if(t&&"object"==typeof t&&"error"in t&&("invalid_grant"===t.error||"missing_refresh_token"===t.error))console.warn("CODICENT: Refresh token invalid (invalid_grant), redirecting to login"),E(null),d();else if(t&&"object"==typeof t&&"error"in t&&"consent_required"===t.error)try{const o=await g();if(!o)return void S("Failed to get access token: no token from auth0 with popup");console.log("CODICENT: GOT ACCESS TOKEN"),E(o)}catch(o){console.warn("CODICENT: Failed to get access token with popup",o),S("Samtycke krävs för inloggning. Tillåt popup-fönster och försök igen."),E(null)}else S("Failed to get access token: "+(t.message?.toString()||t.toString())),console.log("CODICENT: ACCESS TOKEN ERROR",t)}})().then((()=>{}))}),[a,g,m,d,l]),e((()=>{if(c&&c.sub&&P&&void 0===_){let o=!0;return(p?.loginFn?p.loginFn(h,c.sub,P):h.loginUser(c.sub,P)).then((t=>{o&&(null===t?A(!1):""===t?S("Kontrollera internetanslutningen och försök igen."):(h.setToken(t),h.getNickname().then(I),A(!0)))})).catch((()=>{o&&(S("Ett fel uppstod. Försök igen senare."),A(!1))})),()=>{o=!1}}}),[c,P,_,h]);const R=s((()=>{h.logout(),E(null),S(null),A(void 0),I(""),u({logoutParams:{returnTo:n("AUTH_REDIRECT_URL")}})}),[h,u]),O=s((async o=>{const t=p?.registerFn?await p.registerFn(h,o,c.email,c.sub,P):await h.registerUser(o,c.email,c.sub,P);return t&&(h.setToken(t),A(!0)),t}),[h,c,P]);e((()=>{h.onUnauthorized=R}),[h]);const U=s((async o=>{try{await j({authorizationParams:{connection:"email",login_hint:o}})}catch(o){console.error("Passwordless login failed:",o),S(`Passwordless login failed: ${o}`)}}),[j]);return t((()=>({isAuthenticated:a,isRegistered:_,accessToken:P,authError:T,isLoading:l,user:c,nickname:C,logout:R,registerUser:O,codicentService:h,loginWithRedirect:d,loginPasswordless:U})),[a,_,P,T,l,c,C,R,O,h,d,U])};export{r as default};
@@ -37,6 +37,8 @@ export interface HomePageProps {
37
37
  appName?: string;
38
38
  /** URL for a support link shown at the bottom of the home screen. */
39
39
  supportUrl?: string;
40
+ /** Optional URL to a custom icon image for the support link. Falls back to QuestionCircle24Regular when not set. */
41
+ supportIconUrl?: string;
40
42
  }
41
43
  export declare const Home: React.FC<HomePageProps>;
42
44
  export default Home;
@@ -1 +1 @@
1
- {"version":3,"file":"Home.d.ts","sourceRoot":"","sources":["../../../src/pages/Home.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AA2BnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAA+D,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAmCD,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAmJD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,sGAAsG;IACtG,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gHAAgH;IAChH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAmbxC,CAAC;AAEF,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Home.d.ts","sourceRoot":"","sources":["../../../src/pages/Home.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AA2BnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAA+D,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAmCD,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA0JD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,sGAAsG;IACtG,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gHAAgH;IAChH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oHAAoH;IACpH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA4bxC,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1 +1 @@
1
- import{jsx as e,jsxs as t,Fragment as o}from"react/jsx-runtime";import{useState as n,useEffect as i}from"react";import{makeStyles as r,shorthands as a,Tooltip as s,Button as l,Image as p,Menu as c,MenuTrigger as m,MenuButton as d,MenuPopover as u,MenuList as h,MenuItem as g}from"@fluentui/react-components";import*as f from"@fluentui/react-icons";import{QuestionCircle24Regular as j,Edit24Regular as b,Chat24Regular as v,Target24Regular as x,Database24Regular as k,Sparkle24Regular as C,Briefcase24Regular as w,Rocket24Regular as y}from"@fluentui/react-icons";import{Link as S}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as A}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as I}from"../components/Title.js";import{Text as D}from"../components/Text.js";import{Spinner as N}from"../components/Spinner.js";import"../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 z from"../hooks/useStateWithLocalStorage.js";import"../services/codicent.js";import"../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"exceljs";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"./ListPage.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import P from"../components/Content.js";import{Page as B}from"../components/Page.js";import"./QrScan.js";import _ from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import M from"../hooks/useCodicentState.js";import"../hooks/useAppStyles.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"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import{UrlProcessor as L}from"../components/UrlProcessor.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import E from"../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";const T=t=>{if(!t)return null;const o=f[t];if(o&&("function"==typeof o||"object"==typeof o))try{return e(o,{})}catch{return null}return null},F=t=>{switch(t){case"Start Your CV AI Assistant":return e(y,{});case"Smart CV Matching":return e(w,{});case"Enhance & Optimize CVs":return e(C,{});case"View CV Database":return e(k,{});case"Create Job Requirements":return e(x,{});case"Chat with CV AI":return e(v,{});default:return null}},W=r({main:{flexGrow:1,...a.padding("10px"),overflowY:"auto",touchAction:"pan-y"},editButton:{position:"absolute",top:"80px",right:"16px",zIndex:10,background:"transparent",boxShadow:"none",border:"none",cursor:"pointer",padding:0,pointerEvents:"auto"},root:{height:"100%",backgroundPosition:"calc(50%) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",touchAction:"pan-y",pointerEvents:"none"},item:{height:"auto",width:"auto",flexShrink:1},buttonsList:{display:"flex",flexWrap:"wrap",justifyContent:"space-between",flexDirection:"column",alignItems:"center",gap:"1.5rem",...a.padding("10px"),paddingTop:"30px",pointerEvents:"auto"},buttonContent:{display:"flex",alignItems:"center",gap:"8px"},buttonContentColumn:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:"4px",width:"100%"},buttonContentRow:{display:"flex",alignItems:"center",gap:"8px","& > svg":{flexShrink:0,width:"24px"}},buttonSubtitle:{fontSize:"0.85em",opacity:.75,fontWeight:"normal",marginTop:"2px",paddingLeft:"32px"},menuPopover:{minWidth:"16rem",borderRadius:"12px",...a.padding("6px"),boxShadow:"0 8px 32px rgba(0,0,0,0.18), 0 2px 8px rgba(0,0,0,0.10)"},menuItemIconBadge:{display:"flex",alignItems:"center",justifyContent:"center",width:"32px",height:"32px",borderRadius:"8px",backgroundColor:"var(--colorBrandBackground2)",color:"var(--colorBrandForeground2)",flexShrink:0},menuItemTitle:{fontWeight:"500",fontSize:"0.95em"},menuItemSubtitle:{fontSize:"0.78em",opacity:.6,paddingLeft:"42px"},welcomeInfo:{display:"flex",flexDirection:"column",gap:"8px",alignItems:"center",textAlign:"center",maxWidth:"20rem",pointerEvents:"auto"},scrollableContent:{overflowY:"auto"},supportLink:{position:"absolute",top:"80px",right:"52px",zIndex:10,display:"flex",alignItems:"center",gap:"4px",fontSize:"0.8rem",opacity:.6,textDecoration:"none",color:"inherit",pointerEvents:"auto","&:hover":{opacity:1}}}),$=({state:r,audio:a,voice:f,buttons:v,backgroundImageUrl:x,welcomeText:k,slogan:C,indexTitle:w,developerMode:y,onEditClick:$,buttonStyles:R={},appName:V,supportUrl:U})=>{const{selectedApp:H,nickname:q,apps:O,name:Q}=r.context,{service:Y,error:G,stateMachine:K,currentStateName:J,fixAppUrl:X}=r,Z=W(),[ee,te]=z("app-buttons_"+H,[]),[oe,ne]=n(!1),[ie,re]=n(!1),[ae,se]=n([]),[le,pe]=n(""),[ce,me]=n(""),[de,ue]=n(""),[he,ge]=n(new Set),{updating:fe,welcomeStatusText:je}=M(K),{t:be}=_();i((()=>{void 0!==v?te(v):H&&Y.getAppButtons().then((e=>te(e))).catch(console.warn)}),[Y,te,H,v]);const ve=e=>{e.preventDefault(),e.stopPropagation()},xe=!H||"hasAccess"!==J,ke=!H||"hasAccess"!==J,Ce=H&&"hasAccess"===J,we=!H&&"hasAccess"===J&&O.length>1,ye=!G&&!H&&!V,Se="noAccess"===J&&(1===O.length||!!V),Ae=H&&"hasAccess"===J;return e(B,{hideHeader:xe,hideFooter:ke,audio:a,voice:f,children:t("div",{className:Z.root,style:{backgroundImage:x?`url(${x})`:void 0},children:[U&&e("a",{href:U,target:"_blank",rel:"noopener noreferrer",className:Z.supportLink,children:e(j,{})}),y&&$&&"hasAccess"===J&&e("div",{className:Z.editButton,children:e(s,{content:be("Edit settings")||"Edit settings",relationship:"label",children:e(l,{appearance:"subtle",icon:e(b,{}),"aria-label":be("Edit settings")||"Edit settings",onClick:$,size:"small"})})}),e("div",{className:Z.item,children:e("div",{className:Z.item,children:t("div",{className:Z.buttonsList,children:[we&&t(o,{children:[e(I,{children:be("Välkommen, vart vill du gå?")}),O.map(((o,n)=>e("div",{children:e(A,{size:"large",appearance:"primary",onClick:()=>K.setSelectedApp(o.id),children:t("div",{className:Z.buttonContent,children:[o.logo&&e(p,{src:o.logo,height:24}),o.title||o.id]})})},"codicent_button_"+n)))]}),ye&&t(o,{children:[e(I,{children:be("Skapa ny?")}),e(D,{size:400,children:be("Här går du vidare för att skapa din egna privata digitala assistent.")}),e(A,{size:"large",appearance:"primary",onClick:()=>K.update(),children:be("Kör!")})]}),Se&&e("div",{children:t(P,{children:[e(I,{children:`${be("Välkommen till")} ${w}`}),!oe&&e(D,{size:400,children:be("Du är inte medlem än. Skicka begäran för att komma in!")}),!oe&&e(A,{size:"large",appearance:"primary",onClick:async()=>{if(ne(!0),!V)return console.error("appName prop not provided."),alert("appName not defined."),void ne(!1);await Y.requestInvite(q,V)?alert(be("Begäran skickad! Du får åtkomst när ägaren godkänner.")):(ne(!1),alert(be("Misslyckades att skicka begäran. Försök igen senare.")))},children:be("Skicka begäran")}),!oe&&t(D,{size:300,children:[be("Har du redan ett abonnemang? Då kanske har du loggat in med fel konto.")," ",e(S,{to:"/logout",children:be("Logga ut")})," ",be("och sedan in igen för att komma igång.")]}),oe&&e(D,{size:400,children:be("Begäran skickad till ägaren.")}),oe&&e(A,{size:"large",onClick:()=>{window.location.href="./"},children:be("Kontrollera åtkomst")})]})}),Ae&&t("div",{className:Z.welcomeInfo,children:[e(D,{weight:"semibold",size:500,align:"center",children:k?k.replace("{{username}}",Q||q||""):be("Välkommen")}),C&&e(D,{weight:"semibold",italic:!0,size:400,align:"center",children:C}),fe&&e(N,{}),!fe&&je&&e(D,{size:400,align:"center",children:be(je)})]}),Ce&&ee.map(((o,n)=>{const i="file_drop"===o.type,r="multi_option"===o.type,a=o.options&&Array.isArray(o.options)?o.options:[],s=e=>{const t=e.replace("upload:","").split(":");if(t.length>=4){pe(t[0]?.trim()||""),me(t[1]?.trim()||""),ue(t[2]?.trim()||"");const e=t[3]?.trim()||"";se(e?e.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[])}else{pe(""),me(""),ue("");const e=t[0]?.trim()||"";se(e?e.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[])}re(!0)},l=(e,t)=>{if(e.startsWith("voice:")){const t=e.replace("voice:","").trim();t&&f?.updateInstructions(t),f?.connectConversation()}else e.startsWith("upload:")?s(e):e.startsWith("app:")?t(e.replace("app:",X("/app/index.html?token={token}&app={app}&nickname={nickname}")).trim()):t(e)};return e("div",{children:i?e("div",{className:`${Z.item} ${he.has(n)?"dragActive":""}`,style:{width:"16rem",minWidth:"15rem",border:`2px dashed ${R.textColor||"#ccc"}`,backgroundColor:he.has(n)?R.activeColor||void 0:R.backgroundColor||void 0,color:R.textColor||void 0,borderRadius:"8px",padding:"1.2rem 1rem",textAlign:"center",cursor:"pointer"},onDragEnter:e=>((e,t)=>{e.preventDefault(),e.stopPropagation(),ge((e=>new Set(e.add(t))))})(e,n),onDragLeave:e=>((e,t)=>{e.preventDefault(),e.stopPropagation(),ge((e=>{const o=new Set(e);return o.delete(t),o}))})(e,n),onDragOver:ve,onDrop:e=>(async(e,t,o)=>{e.preventDefault(),e.stopPropagation(),ge((e=>{const t=new Set(e);return t.delete(o),t}));const n=Array.from(e.dataTransfer.files);if(0===n.length)return;let i=[];if(t.url.startsWith("upload:")){const e=t.url.replace("upload:","").split(":"),o=(e.length>=4?e[3]:e[0])?.trim()||"";i=o?o.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[]}for(const e of n)try{const t=new FormData;t.append("file",e);const o=await Y.uploadFile(e.name,t);if(!o)continue;const n=i.length>0?i.map((e=>`#${e}`)).join(" "):"#index #summarize";await Y.sendMessage(`@${H} ${n}\n\n${e.name}\n#file:${o}\n`)}catch(t){console.error("Error processing file:",e.name,t)}})(e,o,n),onClick:()=>o.url.startsWith("upload:")&&s(o.url),children:t("div",{className:Z.buttonContentColumn,children:[t("div",{className:Z.buttonContentRow,children:[T(o.icon)||F(o.title),e("span",{children:be(o.title)})]}),e("div",{className:Z.buttonSubtitle,children:he.has(n)?be("Drop files here..."):be("Drag files here or click")})]})}):r?t(c,{children:[e(m,{children:e(d,{size:"large",appearance:"primary",style:{width:"16rem",minWidth:"15rem",border:"none",backgroundColor:R.backgroundColor||void 0,color:R.textColor||void 0,padding:"1.2rem 1rem"},children:t("div",{className:Z.buttonContentColumn,children:[t("div",{className:Z.buttonContentRow,children:[T(o.icon)||F(o.title),e("span",{children:be(o.title)})]}),o.subtitle&&e("div",{className:Z.buttonSubtitle,children:be(o.subtitle)})]})})}),e(u,{className:Z.menuPopover,children:e(h,{children:a.map(((o,i)=>e(L,{service:Y,children:n=>e(g,{onClick:()=>l(o.url,n),children:t("div",{children:[t("div",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[T(o.icon)&&e("div",{className:Z.menuItemIconBadge,children:T(o.icon)}),e("span",{className:Z.menuItemTitle,children:be(o.title)})]}),o.subtitle&&e("div",{className:Z.menuItemSubtitle,children:be(o.subtitle)})]})})},`option_${n}_${i}`)))})})]}):e(L,{service:Y,children:n=>e(A,{size:"large",appearance:"primary",style:{width:"16rem",minWidth:"15rem",border:"none",backgroundColor:R.backgroundColor||void 0,color:R.textColor||void 0,padding:"1.2rem 1rem"},onClick:()=>l(o.url,n),children:t("div",{className:Z.buttonContentColumn,children:[t("div",{className:Z.buttonContentRow,children:[T(o.icon)||F(o.title),e("span",{children:be(o.title)})]}),o.subtitle&&e("div",{className:Z.buttonSubtitle,children:be(o.subtitle)})]})})})},"button_"+n)}))]})})}),U&&e("a",{href:U,target:"_blank",rel:"noopener noreferrer",className:Z.supportLink,children:e(j,{})}),G&&e("div",{className:"error",children:G}),e(E,{project:H||"",hidden:!ie,onDismiss:()=>{re(!1),pe(""),me(""),ue(""),se([])},sendMessage:async e=>{try{return await Y.sendMessage(e)}catch{return}},onUploaded:()=>{re(!1),pe(""),me(""),ue(""),se([])},service:Y,tags:ae,title:le,description:ce,dropText:de})]})})};export{$ as Home,$ as default};
1
+ import{jsx as e,jsxs as t,Fragment as o}from"react/jsx-runtime";import{useState as n,useEffect as i}from"react";import{makeStyles as r,shorthands as a,Tooltip as s,Button as l,Image as p,Menu as c,MenuTrigger as m,MenuButton as d,MenuPopover as u,MenuList as h,MenuItem as g}from"@fluentui/react-components";import*as f from"@fluentui/react-icons";import{QuestionCircle24Regular as j,Edit24Regular as b,Chat24Regular as v,Target24Regular as x,Database24Regular as k,Sparkle24Regular as C,Briefcase24Regular as w,Rocket24Regular as y}from"@fluentui/react-icons";import{Link as S}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as A}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as I}from"../components/Title.js";import{Text as D}from"../components/Text.js";import{Spinner as N}from"../components/Spinner.js";import"../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 z from"../hooks/useStateWithLocalStorage.js";import"../services/codicent.js";import"../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"exceljs";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"./ListPage.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import P from"../components/Content.js";import{Page as B}from"../components/Page.js";import"./QrScan.js";import _ from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import M from"../hooks/useCodicentState.js";import"../hooks/useAppStyles.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"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import{UrlProcessor as L}from"../components/UrlProcessor.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import E from"../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";const F=t=>{if(!t)return null;const o=f[t];if(o&&("function"==typeof o||"object"==typeof o))try{return e(o,{})}catch{return null}return null},T=t=>{switch(t){case"Start Your CV AI Assistant":return e(y,{});case"Smart CV Matching":return e(w,{});case"Enhance & Optimize CVs":return e(C,{});case"View CV Database":return e(k,{});case"Create Job Requirements":return e(x,{});case"Chat with CV AI":return e(v,{});default:return null}},W=r({main:{flexGrow:1,...a.padding("10px"),overflowY:"auto",touchAction:"pan-y"},editButton:{position:"absolute",top:"80px",right:"16px",zIndex:10,background:"transparent",boxShadow:"none",border:"none",cursor:"pointer",padding:0,pointerEvents:"auto"},root:{height:"100%",backgroundPosition:"calc(50%) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",touchAction:"pan-y",pointerEvents:"none"},item:{height:"auto",width:"auto",flexShrink:1},buttonsList:{display:"flex",flexWrap:"wrap",justifyContent:"space-between",flexDirection:"column",alignItems:"center",gap:"1.5rem",...a.padding("10px"),paddingTop:"30px",pointerEvents:"auto"},buttonContent:{display:"flex",alignItems:"center",gap:"8px"},buttonContentColumn:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:"4px",width:"100%"},buttonContentRow:{display:"flex",alignItems:"center",gap:"8px","& > svg":{flexShrink:0,width:"24px"}},buttonSubtitle:{fontSize:"0.85em",opacity:.75,fontWeight:"normal",marginTop:"2px",paddingLeft:"32px"},menuPopover:{minWidth:"16rem",borderRadius:"12px",...a.padding("6px"),boxShadow:"0 8px 32px rgba(0,0,0,0.18), 0 2px 8px rgba(0,0,0,0.10)"},menuItemIconBadge:{display:"flex",alignItems:"center",justifyContent:"center",width:"32px",height:"32px",borderRadius:"8px",backgroundColor:"var(--colorBrandBackground2)",color:"var(--colorBrandForeground2)",flexShrink:0},menuItemTitle:{fontWeight:"500",fontSize:"0.95em"},menuItemSubtitle:{fontSize:"0.78em",opacity:.6,paddingLeft:"42px"},welcomeInfo:{display:"flex",flexDirection:"column",gap:"8px",alignItems:"center",textAlign:"center",maxWidth:"20rem",pointerEvents:"auto"},scrollableContent:{overflowY:"auto"},supportLink:{position:"absolute",top:"80px",right:"52px",zIndex:10,display:"flex",alignItems:"center",gap:"4px",fontSize:"0.8rem",opacity:.6,textDecoration:"none",color:"inherit",pointerEvents:"auto","&:hover":{opacity:1}},supportIcon:{height:"24px",width:"auto",maxWidth:"120px",objectFit:"contain",display:"block"}}),$=({state:r,audio:a,voice:f,buttons:v,backgroundImageUrl:x,welcomeText:k,slogan:C,indexTitle:w,developerMode:y,onEditClick:$,buttonStyles:R={},appName:U,supportUrl:V,supportIconUrl:H})=>{const{selectedApp:q,nickname:O,apps:Q,name:Y}=r.context,{service:G,error:K,stateMachine:J,currentStateName:X,fixAppUrl:Z}=r,ee=W(),[te,oe]=z("app-buttons_"+q,[]),[ne,ie]=n(!1),[re,ae]=n(!1),[se,le]=n([]),[pe,ce]=n(""),[me,de]=n(""),[ue,he]=n(""),[ge,fe]=n(new Set),{updating:je,welcomeStatusText:be}=M(J),{t:ve}=_();i((()=>{void 0!==v?oe(v):q&&G.getAppButtons().then((e=>oe(e))).catch(console.warn)}),[G,oe,q,v]);const xe=e=>{e.preventDefault(),e.stopPropagation()},ke=!q||"hasAccess"!==X,Ce=!q||"hasAccess"!==X,we=q&&"hasAccess"===X,ye=!q&&"hasAccess"===X&&Q.length>1,Se=!K&&!q&&!U,Ae="noAccess"===X&&(1===Q.length||!!U),Ie=q&&"hasAccess"===X;return e(B,{hideHeader:ke,hideFooter:Ce,audio:a,voice:f,children:t("div",{className:ee.root,style:{backgroundImage:x?`url(${x})`:void 0},children:[V&&e("a",{href:V,target:"_blank",rel:"noopener noreferrer",className:ee.supportLink,children:H?e("img",{src:H,alt:"Support",className:ee.supportIcon}):e(j,{})}),y&&$&&"hasAccess"===X&&e("div",{className:ee.editButton,children:e(s,{content:ve("Edit settings")||"Edit settings",relationship:"label",children:e(l,{appearance:"subtle",icon:e(b,{}),"aria-label":ve("Edit settings")||"Edit settings",onClick:$,size:"small"})})}),e("div",{className:ee.item,children:e("div",{className:ee.item,children:t("div",{className:ee.buttonsList,children:[ye&&t(o,{children:[e(I,{children:ve("Välkommen, vart vill du gå?")}),Q.map(((o,n)=>e("div",{children:e(A,{size:"large",appearance:"primary",onClick:()=>J.setSelectedApp(o.id),children:t("div",{className:ee.buttonContent,children:[o.logo&&e(p,{src:o.logo,height:24}),o.title||o.id]})})},"codicent_button_"+n)))]}),Se&&t(o,{children:[e(I,{children:ve("Skapa ny?")}),e(D,{size:400,children:ve("Här går du vidare för att skapa din egna privata digitala assistent.")}),e(A,{size:"large",appearance:"primary",onClick:()=>J.update(),children:ve("Kör!")})]}),Ae&&e("div",{children:t(P,{children:[e(I,{children:`${ve("Välkommen till")} ${w}`}),!ne&&e(D,{size:400,children:ve("Du är inte medlem än. Skicka begäran för att komma in!")}),!ne&&e(A,{size:"large",appearance:"primary",onClick:async()=>{if(ie(!0),!U)return console.error("appName prop not provided."),alert("appName not defined."),void ie(!1);await G.requestInvite(O,U)?alert(ve("Begäran skickad! Du får åtkomst när ägaren godkänner.")):(ie(!1),alert(ve("Misslyckades att skicka begäran. Försök igen senare.")))},children:ve("Skicka begäran")}),!ne&&t(D,{size:300,children:[ve("Har du redan ett abonnemang? Då kanske har du loggat in med fel konto.")," ",e(S,{to:"/logout",children:ve("Logga ut")})," ",ve("och sedan in igen för att komma igång.")]}),ne&&e(D,{size:400,children:ve("Begäran skickad till ägaren.")}),ne&&e(A,{size:"large",onClick:()=>{window.location.href="./"},children:ve("Kontrollera åtkomst")})]})}),Ie&&t("div",{className:ee.welcomeInfo,children:[e(D,{weight:"semibold",size:500,align:"center",children:k?k.replace("{{username}}",Y||O||""):ve("Välkommen")}),C&&e(D,{weight:"semibold",italic:!0,size:400,align:"center",children:C}),je&&e(N,{}),!je&&be&&e(D,{size:400,align:"center",children:ve(be)})]}),we&&te.map(((o,n)=>{const i="file_drop"===o.type,r="multi_option"===o.type,a=o.options&&Array.isArray(o.options)?o.options:[],s=e=>{const t=e.replace("upload:","").split(":");if(t.length>=4){ce(t[0]?.trim()||""),de(t[1]?.trim()||""),he(t[2]?.trim()||"");const e=t[3]?.trim()||"";le(e?e.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[])}else{ce(""),de(""),he("");const e=t[0]?.trim()||"";le(e?e.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[])}ae(!0)},l=(e,t)=>{if(e.startsWith("voice:")){const t=e.replace("voice:","").trim();t&&f?.updateInstructions(t),f?.connectConversation()}else e.startsWith("upload:")?s(e):e.startsWith("app:")?t(e.replace("app:",Z("/app/index.html?token={token}&app={app}&nickname={nickname}")).trim()):t(e)};return e("div",{children:i?e("div",{className:`${ee.item} ${ge.has(n)?"dragActive":""}`,style:{width:"16rem",minWidth:"15rem",border:`2px dashed ${R.textColor||"#ccc"}`,backgroundColor:ge.has(n)?R.activeColor||void 0:R.backgroundColor||void 0,color:R.textColor||void 0,borderRadius:"8px",padding:"1.2rem 1rem",textAlign:"center",cursor:"pointer"},onDragEnter:e=>((e,t)=>{e.preventDefault(),e.stopPropagation(),fe((e=>new Set(e.add(t))))})(e,n),onDragLeave:e=>((e,t)=>{e.preventDefault(),e.stopPropagation(),fe((e=>{const o=new Set(e);return o.delete(t),o}))})(e,n),onDragOver:xe,onDrop:e=>(async(e,t,o)=>{e.preventDefault(),e.stopPropagation(),fe((e=>{const t=new Set(e);return t.delete(o),t}));const n=Array.from(e.dataTransfer.files);if(0===n.length)return;let i=[];if(t.url.startsWith("upload:")){const e=t.url.replace("upload:","").split(":"),o=(e.length>=4?e[3]:e[0])?.trim()||"";i=o?o.split(",").map((e=>e.trim())).filter((e=>e.length>0)):[]}for(const e of n)try{const t=new FormData;t.append("file",e);const o=await G.uploadFile(e.name,t);if(!o)continue;const n=i.length>0?i.map((e=>`#${e}`)).join(" "):"#index #summarize";await G.sendMessage(`@${q} ${n}\n\n${e.name}\n#file:${o}\n`)}catch(t){console.error("Error processing file:",e.name,t)}})(e,o,n),onClick:()=>o.url.startsWith("upload:")&&s(o.url),children:t("div",{className:ee.buttonContentColumn,children:[t("div",{className:ee.buttonContentRow,children:[F(o.icon)||T(o.title),e("span",{children:ve(o.title)})]}),e("div",{className:ee.buttonSubtitle,children:ge.has(n)?ve("Drop files here..."):ve("Drag files here or click")})]})}):r?t(c,{children:[e(m,{children:e(d,{size:"large",appearance:"primary",style:{width:"16rem",minWidth:"15rem",border:"none",backgroundColor:R.backgroundColor||void 0,color:R.textColor||void 0,padding:"1.2rem 1rem"},children:t("div",{className:ee.buttonContentColumn,children:[t("div",{className:ee.buttonContentRow,children:[F(o.icon)||T(o.title),e("span",{children:ve(o.title)})]}),o.subtitle&&e("div",{className:ee.buttonSubtitle,children:ve(o.subtitle)})]})})}),e(u,{className:ee.menuPopover,children:e(h,{children:a.map(((o,i)=>e(L,{service:G,children:n=>e(g,{onClick:()=>l(o.url,n),children:t("div",{children:[t("div",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[F(o.icon)&&e("div",{className:ee.menuItemIconBadge,children:F(o.icon)}),e("span",{className:ee.menuItemTitle,children:ve(o.title)})]}),o.subtitle&&e("div",{className:ee.menuItemSubtitle,children:ve(o.subtitle)})]})})},`option_${n}_${i}`)))})})]}):e(L,{service:G,children:n=>e(A,{size:"large",appearance:"primary",style:{width:"16rem",minWidth:"15rem",border:"none",backgroundColor:R.backgroundColor||void 0,color:R.textColor||void 0,padding:"1.2rem 1rem"},onClick:()=>l(o.url,n),children:t("div",{className:ee.buttonContentColumn,children:[t("div",{className:ee.buttonContentRow,children:[F(o.icon)||T(o.title),e("span",{children:ve(o.title)})]}),o.subtitle&&e("div",{className:ee.buttonSubtitle,children:ve(o.subtitle)})]})})})},"button_"+n)}))]})})}),V&&e("a",{href:V,target:"_blank",rel:"noopener noreferrer",className:ee.supportLink,children:H?e("img",{src:H,alt:"Support",className:ee.supportIcon}):e(j,{})}),K&&e("div",{className:"error",children:K}),e(E,{project:q||"",hidden:!re,onDismiss:()=>{ae(!1),ce(""),de(""),he(""),le([])},sendMessage:async e=>{try{return await G.sendMessage(e)}catch{return}},onUploaded:()=>{ae(!1),ce(""),de(""),he(""),le([])},service:G,tags:se,title:pe,description:me,dropText:ue})]})})};export{$ as Home,$ as default};
@@ -1 +1 @@
1
- {"version":3,"file":"ListPage.d.ts","sourceRoot":"","sources":["../../../src/pages/ListPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAuB3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;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
+ {"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,4CAsmB1F,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -1 +1 @@
1
- import{jsx as t,jsxs as e}from"react/jsx-runtime";import{useState as o,useRef as n,useMemo as r,useEffect as i,useCallback as a}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{makeStyles as s,Button as c,Dialog as l,DialogSurface as d,DialogBody as 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};
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 y}from"@fluentui/react-icons";import"../services/codicent.js";import{dataCache as w}from"../services/dataCache.js";import S from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{exportToExcel as A}from"../utils/excelExport.js";import"./AppFrame.js";import"./Canvas.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import{useSearchParams as C,useNavigate as k}from"react-router-dom";import"./Purchase.js";import"../components/Content.js";import{Page as v}from"../components/Page.js";import"./QrScan.js";import b from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import{useUserRoles as D}from"../hooks/useUserRoles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import I from"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import M from"../components/ListView.js";import{RecordModal as _}from"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";import{l as P}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"}}),T=500,B=({state:s,getColumnDefs:B,getListConfig:E,filterData:N})=>{const[R,L]=C(),F=R.get("tag")||"logbook",U=R.get("title")||"",H=R.get("contentTitle"),O="true"===R.get("loadAll"),W="true"===R.get("canAdd"),q="true"===R.get("canEdit"),z="false"!==R.get("canExport"),V=R.get("addUrl")||"",G=R.get("q")||"",[J,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=n(Y);mt.current=Y;const pt=!!Y,[ut,gt]=o(0),[ft,ht]=o(null),jt=$(),{t:xt}=b(),yt=k(),{getCurrentUserName:wt}=D(Y,s.context.nickname,s.context.selectedApp),St=r((()=>(H?[{key:H,title:H,maxWidth:250}]:E?E(F)?.columns??[]:B?B(F):[]).map((t=>({...t,title:t.title?xt(t.title):void 0})))),[H,F,xt,B,E]),[At,Ct]=o(!1),[kt,vt]=o(null),[bt,Dt]=o(!1),[It,Mt]=o(null),_t=r((()=>`listpage_searches_${F}`),[F]),Pt=t=>{try{const e=localStorage.getItem(t);return e?JSON.parse(e):[]}catch{return[]}},[$t,Tt]=o((()=>Pt(_t)));i((()=>{Tt(Pt(_t))}),[_t]);const Bt=a((t=>{const e=t.trim();e&&Tt((t=>{const o=[e,...t.filter((t=>t!==e))].slice(0,20);try{localStorage.setItem(_t,JSON.stringify(o))}catch{}return o}))}),[_t]),Et=a((t=>{Tt((e=>{const o=e.filter((e=>e!==t));try{localStorage.setItem(_t,JSON.stringify(o))}catch{}return o}))}),[_t]),Nt=r((()=>P.debounce((t=>X(t)),500)),[X]);i((()=>()=>{Nt.cancel()}),[Nt]);const Rt=a((t=>{Q(t),Nt(t)}),[Nt]),Lt=a((t=>{Bt(t)}),[Bt]);i((()=>{if(!R.get("q")){const t=R.get(`filter_${F}`);if(t){let e=t;if("%USERNAME%"===e){const t=wt();if(!t)return;e=t}Q(e),X(e),ct.current=e}}}),[F,R,wt]),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=new URLSearchParams(R);J?t.set("q",J):t.delete("q"),L(t,{replace:!0}),ct.current=J}}),500),()=>{st.current&&clearTimeout(st.current)})),[J,R,L]),i((()=>{if(!mt.current)return;const t=`${F}-${H}-${O}-${ut}-${K}`;if(t===lt.current)return;lt.current=t;const e=++dt.current,o=()=>e===dt.current,n=H?`${F}-${K}-${H}`:`${F}-${K||"all"}`,r=w.get(n);if(r){if(tt(r),rt(!O&&!H&&r.length>=T),!H&&!K&&r.length>0){const t=r.reduce(((t,e)=>e.createdAt>t?e.createdAt:t),r[0].createdAt);mt.current.readDataMessages(F,"",void 0,void 0,void 0,t).then((t=>{o()&&tt((e=>{const o=new Set(e.map((t=>t.id))),r=t.filter((t=>!o.has(t.id)));if(0===r.length)return e;const i=[...r,...e];return w.set(n,i),i}))})).catch(console.warn)}}else if(rt(!1),ot(!0),H)mt.current.getMessagesFast([F],K).then((t=>{if(!o())return;const e=t.map((t=>{const e=new Date(t.createdAt).toLocaleString();return{id:t.id,data:{[H]:new S(t.content).content,createdAt:e},fileId:null,fileIds:[],tags:[F],mentions:[mt.current.codicent],createdAt:e}}));w.set(n,e),tt(e)})).catch(console.warn).finally((()=>{o()&&ot(!1)}));else{const t=K||"",e=O||t?void 0:T;mt.current.readDataMessages(F,t,void 0,0,e).then((e=>{o()&&(w.set(n,e),tt(e),rt(!O&&!t&&e.length===T))})).catch(console.warn).finally((()=>{o()&&ot(!1)}))}}),[F,H,O,K,ut,pt]);const Ft=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%",wt()),r=s.context.nickname||"";e=e.filter((({item:e})=>{const n=e.data[o];return null!=n&&(String(n).includes(t)||String(n).includes(r))}))}if(N){const t=N(e.map((({item:t})=>t)),F),o=new Set(t.map((t=>t.id)));e=e.filter((({item:t})=>o.has(t.id)))}const o=e.map((({item:t,index:e})=>({...t.data,createdAt:t.createdAt,_id:t.id,originalMessageId:t.originalMessageId||t.id,_fileIds:t.fileIds??[],_index:e}))),n=E?.(F)?.deduplicateBy;if(n){const t=Array.isArray(n)?n:[n],e=e=>{for(const o of t){const t=e[o];if(null!=t&&""!==String(t).trim())return String(t)}},r=new Set;return o.filter((t=>{const o=e(t);return void 0===o||!r.has(o)&&(r.add(o),!0)}))}return o}),[Z,R,s.context.nickname,wt,N,F,E]),Ut=r((()=>{const t=(J||"").trim().toLowerCase();if(!t)return Ft;const e=St.filter((t=>!t.hidden)).map((t=>t.key));return Ft.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}))}),[Ft,J,St]),Ht=a((()=>{w.clearPattern(F),lt.current="",gt((t=>t+1))}),[F]),Ot=a((async()=>{at(!0);try{const t=await mt.current.readDataMessages(F,"",void 0,Z.length,T),e=[...Z,...t];tt(e),w.set(`${F}-all`,e),rt(t.length===T)}catch(t){console.warn(t)}finally{at(!1)}}),[Z,F]),Wt=a((t=>{ht(t)}),[]),qt=()=>{Dt(!1),Mt(null)},zt=a((async()=>{const t=`${F}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const e=null!==ft?ft:Ut;await A(e,St,t,xt)||console.warn("No data to export")}),[ft,Ut,St,F,xt]),Vt=r((()=>null!==ft?ft.length:Ut.length),[ft,Ut]);return t(v,{hideHeader:!0,children:e("div",{className:jt.container,children:[t("div",{className:jt.backButton,children:t(c,{appearance:"subtle",icon:t(h,{}),onClick:()=>yt(-1),children:xt("Tillbaka")})}),e("div",{className:jt.headerRow,children:[t(f,{title:xt(U||"Loggbok")}),e("div",{className:jt.buttonGroup,children:[t(c,{appearance:"subtle",icon:t(j,{}),onClick:Ht,title:xt("Refresh"),children:xt("Refresh")}),z&&t(c,{appearance:"subtle",icon:t(x,{}),onClick:zt,title:xt("Export to Excel"),children:xt("Export to Excel")}),(W||V)&&t(c,{appearance:"primary",icon:t(y,{}),onClick:W?()=>{vt(null),Ct(!0)}:()=>window.open(V,"_blank"),className:jt.addButton,children:xt("Add Record")})]})]}),t("div",{className:jt.searchBox,children:t(I,{placeholder:xt("Sök")+"...",value:J,onChange:Rt,recentSearches:$t,onCommitSearch:Lt,onRemoveRecentSearch:Et})}),!et&&e("div",{className:jt.recordsCount,children:[xt("Total"),": ",Vt," ",xt("records"),Vt!==Z.length&&` (${xt("filtered from")} ${Z.length})`]}),e("div",{className:jt.listContainer,children:[et&&t("p",{children:xt("Söker")+"..."}),!et&&t(M,{data:Ut,columns:St,canEdit:q,onEdit:(t,e)=>{const o=Z[e];o&&(vt({data:{...o.data,_fileIds:o.fileIds??[]},index:e}),Ct(!0))},onDelete:(t,e)=>{const o=Z[e];o&&(Mt({index:e,id:o.id}),Dt(!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})),w.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})),w.clearPattern(F)}},onFilteredDataChange:Wt})]}),nt&&!J.trim()&&t("div",{className:jt.loadMoreContainer,children:t(c,{appearance:"primary",size:"medium",onClick:Ot,disabled:it,children:it?xt("Laddar..."):xt("Visa fler")+` (${Z.length} ${xt("laddade")})`})}),t(_,{open:At,onClose:()=>Ct(!1),onSave:async t=>{const e=new Set(St.filter((t=>"thumbnail"===t.type)).map((t=>Array.isArray(t.key)?t.key[0]:t.key)));if(kt){const o=Z[kt.index];if(o){const n={};for(const o in t){if(e.has(o))continue;const r=t[o];n[o]=null==r?"":String(r)}const r=await Y.updateDataMessage(o.id,n);tt((t=>{const e=[...t];return e[kt.index]={...o,id:r,data:n},e})),w.clearPattern(F)}}else{const o={};for(const n in t){if(e.has(n))continue;const r=t[n];o[n]=null==r?"":String(r)}const n={id:await Y.createDataMessage(F,o),data:o,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[F],mentions:[Y.codicent]};tt((t=>[n,...t])),w.clearPattern(F)}},columns:St,initialData:kt?.data}),t(l,{open:bt,onOpenChange:(t,e)=>!e.open&&qt(),children:t(d,{children:e(m,{children:[t(p,{children:xt("Confirm Delete")}),t(u,{children:xt("Are you sure you want to delete this record? This action cannot be undone.")}),e(g,{children:[t(c,{appearance:"secondary",onClick:qt,children:xt("Cancel")}),t(c,{appearance:"primary",onClick:async()=>{if(It)try{await Y.deleteDataMessage(It.id),tt((t=>t.filter(((t,e)=>e!==It.index)))),w.clearPattern(F)}catch(t){console.error("Failed to delete record:",t)}finally{Dt(!1),Mt(null)}},children:xt("Delete")})]})]})})})]})})};export{B as ListPage,B as default};
package/dist/index.d.ts CHANGED
@@ -1656,7 +1656,7 @@ interface ColumnDefinition {
1656
1656
  hidden?: boolean;
1657
1657
  hideOnMobile?: boolean;
1658
1658
  maxWidth?: number;
1659
- type?: "file" | "checkbox" | "textarea" | "enum" | "combobox" | undefined;
1659
+ type?: "file" | "checkbox" | "textarea" | "enum" | "combobox" | "thumbnail" | undefined;
1660
1660
  /** Number of rows for textarea type (default: 3) */
1661
1661
  rows?: number;
1662
1662
  /** Options for enum type columns (static, small lists) */
@@ -2545,6 +2545,8 @@ interface HomePageProps {
2545
2545
  appName?: string;
2546
2546
  /** URL for a support link shown at the bottom of the home screen. */
2547
2547
  supportUrl?: string;
2548
+ /** Optional URL to a custom icon image for the support link. Falls back to QuestionCircle24Regular when not set. */
2549
+ supportIconUrl?: string;
2548
2550
  }
2549
2551
  declare const Home: React__default.FC<HomePageProps>;
2550
2552
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codicent-app-sdk",
3
- "version": "0.6.4",
3
+ "version": "0.6.7",
4
4
  "description": "SDK for building AI-powered applications with Codicent",
5
5
  "type": "module",
6
6
  "main": "dist/cjs/index.js",
@@ -35,6 +35,7 @@
35
35
  "build": "rollup -c",
36
36
  "dev": "rollup -c -w",
37
37
  "test": "jest",
38
+ "smoke": "node scripts/smoke.mjs",
38
39
  "prepare": "npm run build",
39
40
  "predeploy": "npm run build && cp -r dist/* docs/",
40
41
  "deploy": "gh-pages -d docs",