codicent-app-sdk 0.5.6 → 0.5.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.
- package/dist/cjs/hooks/useUserRoles.d.ts +1 -1
- package/dist/cjs/hooks/useUserRoles.d.ts.map +1 -1
- package/dist/cjs/hooks/useUserRoles.js +1 -1
- package/dist/cjs/pages/ListPage.js +1 -1
- package/dist/esm/hooks/useUserRoles.d.ts +1 -1
- package/dist/esm/hooks/useUserRoles.d.ts.map +1 -1
- package/dist/esm/hooks/useUserRoles.js +1 -1
- package/dist/esm/pages/ListPage.js +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -7,7 +7,7 @@ export interface UserRole {
|
|
|
7
7
|
role: string;
|
|
8
8
|
claims?: string;
|
|
9
9
|
}
|
|
10
|
-
export declare const useUserRoles: (service: CodicentService, currentNickname?: string) => {
|
|
10
|
+
export declare const useUserRoles: (service: CodicentService, currentNickname?: string, currentCodicent?: string) => {
|
|
11
11
|
userRoles: UserRole[];
|
|
12
12
|
loading: boolean;
|
|
13
13
|
error: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUserRoles.d.ts","sourceRoot":"","sources":["../../../src/hooks/useUserRoles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,YAAa,eAAe,oBAAoB,MAAM;;;;
|
|
1
|
+
{"version":3,"file":"useUserRoles.d.ts","sourceRoot":"","sources":["../../../src/hooks/useUserRoles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,YAAa,eAAe,oBAAoB,MAAM,oBAAoB,MAAM;;;;oCAiC1F,MAAM,KAAG,MAAM;gCAgBO,MAAM,KAAG,MAAM;8BAUjB,MAAM,QAAQ,QAAQ,KAAG,OAAO;+BAe/B,MAAM,KAAG,QAAQ,GAAG,SAAS;mCAKzB,MAAM,KAAG,MAAM,EAAE;8BASxB,QAAQ,GAAG,SAAS;8BAKR,MAAM;CAiBlD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("react"),r=require("../utils/MessageContent.js");exports.useUserRoles=(t,s)=>{const[
|
|
1
|
+
"use strict";var e=require("react"),r=require("../utils/MessageContent.js");exports.useUserRoles=(t,s,n)=>{const[a,o]=e.useState([]),[i,u]=e.useState(!0),[l,c]=e.useState(null);e.useEffect((()=>{if(!s)return;if(!n)return;(async()=>{try{u(!0),c(null);const e=(await t.getMessagesFast(["user_role"],void 0,100)).map((e=>{const t=new r.default(e.content).data;return t&&"object"==typeof t?t:null})).filter((e=>null!==e));o(e)}catch(e){console.error("Failed to fetch user roles:",e),c(e instanceof Error?e.message:"Failed to fetch user roles")}finally{u(!1)}})()}),[t,s,n]);const m=e.useCallback((e=>{if(!e)return"";const r=e.toLowerCase(),t=a.find((e=>{if(!e.nicknames)return!1;return e.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===r))}));return t?.name||e}),[a]),f=(e,r)=>{if(!e||!r)return!1;const t=e.toLowerCase();if(r.nicknames){if(r.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===t)))return!0}return r.name?.toLowerCase()===t||r.email?.toLowerCase()===t},C=e=>{if(e)return a.find((r=>f(e,r)))},p=e.useCallback((()=>s?m(s):""),[s,m]);return{userRoles:a,loading:i,error:l,getNameFromNickname:m,getNicknameFromName:e=>{if(!e)return"";const r=a.find((r=>r.name?.toLowerCase()===e.toLowerCase()));if(r?.nicknames){return r.nicknames.split(",").map((e=>e.trim()))[0]||e}return e},isUserMatch:f,findUserRole:C,getClaimsForUser:e=>{const r=C(e);return r?.claims?r.claims.split(",").map((e=>e.trim())).filter(Boolean):[]},getCurrentUserRole:()=>{if(s)return C(s)},getCurrentUserName:p}};
|
|
@@ -1 +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");var h=require("../node_modules/lodash/lodash.js");const f=r.makeStyles({container:{width:"100%",flex:1,maxWidth:"100%",height:"100%",minHeight:0,backgroundColor:"#ffffff",display:"flex",flexDirection:"column",margin:"0 auto",overflow:"hidden","@media (max-width: 768px)":{maxWidth:"100%",borderRadius:"0"},touchAction:"pan-y",paddingLeft:"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,x=({state:x,getColumnDefs:q,filterData:C})=>{const[S,w]=c.useSearchParams(),v=S.get("tag")||"logbook",y=S.get("title")||"",k=S.get("contentTitle"),b="true"===S.get("loadAll"),M="true"===S.get("canAdd"),A="true"===S.get("canEdit"),D="false"!==S.get("canExport"),E=S.get("addUrl")||"",R=S.get("q")||"",[T,_]=t.useState(R),[B,I]=t.useState(R),{service:$}=x,[P,N]=t.useState([]),[L,F]=t.useState(!1),[O,U]=t.useState(!1),[H,W]=t.useState(!1),V=t.useRef(null),z=t.useRef(R),J=t.useRef(""),Q=t.useRef(!0),[G,K]=t.useState(0),[X,Y]=t.useState(null),Z=f(),{t:ee}=u.default(),te=c.useNavigate(),{getCurrentUserName:re}=d.useUserRoles($,x.context.nickname),ae=t.useMemo((()=>(k?[{key:k,title:k,maxWidth:250}]:q?q(v):[]).map((e=>({...e,title:e.title?ee(e.title):void 0})))),[k,v,ee,q]),[ne,se]=t.useState(!1),[oe,ie]=t.useState(null),[ce,le]=t.useState(!1),[ue,de]=t.useState(null),pe=t.useMemo((()=>`listpage_searches_${v}`),[v]),me=e=>{try{const t=localStorage.getItem(e);return t?JSON.parse(t):[]}catch{return[]}},[ge,he]=t.useState((()=>me(pe)));t.useEffect((()=>{he(me(pe))}),[pe]);const fe=t.useCallback((e=>{const t=e.trim();t&&he((e=>{const r=[t,...e.filter((e=>e!==t))].slice(0,20);try{localStorage.setItem(pe,JSON.stringify(r))}catch{}return r}))}),[pe]),je=t.useCallback((e=>{he((t=>{const r=t.filter((t=>t!==e));try{localStorage.setItem(pe,JSON.stringify(r))}catch{}return r}))}),[pe]),xe=t.useMemo((()=>h.lodashExports.debounce((e=>I(e)),500)),[I]);t.useEffect((()=>()=>{xe.cancel()}),[xe]);const qe=t.useCallback((e=>{_(e),xe(e)}),[xe]),Ce=t.useCallback((e=>{fe(e)}),[fe]);t.useEffect((()=>{if(!S.get("q")){const e=S.get(`filter_${v}`);if(e){let t=e;if("%USERNAME%"===t){const e=re();if(!e)return;t=e}_(t),I(t),z.current=t}}}),[v,S,re]),t.useEffect((()=>{const e=S.get("q")||"";e!==z.current&&(_(e),I(e),z.current=e,J.current="")}),[S]),t.useEffect((()=>(V.current&&clearTimeout(V.current),V.current=setTimeout((()=>{if(z.current!==T){const e={title:y,tag:v};k&&(e.contentTitle=k),T&&(e.q=T),b&&(e.loadAll="true"),w(e,{replace:!0}),z.current=T}}),500),()=>{V.current&&clearTimeout(V.current)})),[T,v,y,k,b,w]),t.useEffect((()=>{Q.current=!0;const e=`${v}-${k}-${b}-${G}-${B}`;if(e===J.current)return;J.current=e;const t=k?`${v}-${B}-${k}`:`${v}-${B||"all"}`,r=s.dataCache.get(t);if(!r){if(U(!1),F(!0),k)$.getMessagesFast([v],B).then((e=>{if(!Q.current)return void F(!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:[v],mentions:[$.codicent],createdAt:t}}));s.dataCache.set(t,r),Q.current&&N(r)})).catch(console.warn).finally((()=>F(!1)));else{const e=B||"",r=b||e?void 0:j;$.readDataMessages(v,e,void 0,0,r).then((r=>{s.dataCache.set(t,r),Q.current?(N(r),U(!b&&!e&&r.length===j)):F(!1)})).catch(console.warn).finally((()=>F(!1)))}return()=>{Q.current=!1}}if(N(r),U(!b&&!k&&r.length>=j),!k&&!B&&r.length>0){const e=r.reduce(((e,t)=>t.createdAt>e?t.createdAt:e),r[0].createdAt);$.readDataMessages(v,"",void 0,void 0,void 0,e).then((e=>{Q.current&&N((r=>{const a=new Set(r.map((e=>e.id))),n=e.filter((e=>!a.has(e.id)));if(0===n.length)return r;const o=[...n,...r];return s.dataCache.set(t,o),o}))})).catch(console.warn)}}),[$,v,k,b,B,G]);const Se=t.useMemo((()=>{const e={};S.forEach(((t,r)=>{r.startsWith("filter_")&&(e[r.replace("filter_","")]=t)}));let t=P.map(((e,t)=>({item:e,index:t})));for(const[r,a]of Object.entries(e)){const e=a.replace("%USERNAME%",re()),n=x.context.nickname||"";t=t.filter((({item:t})=>{const a=t.data[r];return null!=a&&(String(a).includes(e)||String(a).includes(n))}))}if(C){const e=C(t.map((({item:e})=>e)),v),r=new Set(e.map((e=>e.id)));t=t.filter((({item:e})=>r.has(e.id)))}return t.map((({item:e,index:t})=>({...e.data,createdAt:e.createdAt,_id:e.id,originalMessageId:e.originalMessageId||e.id,_index:t})))}),[P,S,x.context.nickname,re,C,v]),we=t.useMemo((()=>{const e=(T||"").trim().toLowerCase();if(!e)return Se;const t=ae.filter((e=>!e.hidden)).map((e=>e.key));return Se.filter((r=>{for(const a of t)if(Array.isArray(a))for(const t of a){const a=r[t];if(null!=a&&String(a).toLowerCase().includes(e))return!0}else{const t=r[a];if(null!=t&&String(t).toLowerCase().includes(e))return!0}return!1}))}),[Se,T,ae]),ve=t.useCallback((()=>{s.dataCache.clearPattern(v),J.current="",K((e=>e+1))}),[v]),ye=t.useCallback((async()=>{W(!0);try{const e=await $.readDataMessages(v,"",void 0,P.length,j),t=[...P,...e];N(t),s.dataCache.set(`${v}-all`,t),U(e.length===j)}catch(e){console.warn(e)}finally{W(!1)}}),[P,$,v]),ke=t.useCallback((e=>{Y(e)}),[]),be=()=>{le(!1),de(null)},Me=t.useCallback((async()=>{const e=`${v}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const t=null!==X?X:we;await i.exportToExcel(t,ae,e,ee)||console.warn("No data to export")}),[X,we,ae,v,ee]),Ae=t.useMemo((()=>null!==X?X.length:we.length),[X,we]);return e.jsx(l.Page,{hideHeader:!0,children:e.jsxs("div",{className:Z.container,children:[e.jsx("div",{className:Z.backButton,children:e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowLeft24Regular,{}),onClick:()=>te(-1),children:ee("Tillbaka")})}),e.jsxs("div",{className:Z.headerRow,children:[e.jsx(a.default,{title:ee(y||"Loggbok")}),e.jsxs("div",{className:Z.buttonGroup,children:[e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowClockwise24Regular,{}),onClick:ve,title:ee("Refresh"),children:ee("Refresh")}),D&&e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowDownload24Regular,{}),onClick:Me,title:ee("Export to Excel"),children:ee("Export to Excel")}),(M||E)&&e.jsx(r.Button,{appearance:"primary",icon:e.jsx(n.Add24Regular,{}),onClick:M?()=>{ie(null),se(!0)}:()=>window.open(E,"_blank"),className:Z.addButton,children:ee("Add Record")})]})]}),e.jsx("div",{className:Z.searchBox,children:e.jsx(p.default,{placeholder:ee("Sök")+"...",value:T,onChange:qe,recentSearches:ge,onCommitSearch:Ce,onRemoveRecentSearch:je})}),!L&&e.jsxs("div",{className:Z.recordsCount,children:[ee("Total"),": ",Ae," ",ee("records"),Ae!==P.length&&` (${ee("filtered from")} ${P.length})`]}),e.jsxs("div",{className:Z.listContainer,children:[L&&e.jsx("p",{children:ee("Söker")+"..."}),!L&&e.jsx(m.default,{data:we,columns:ae,canEdit:A,onEdit:(e,t)=>{const r=P[t];r&&(ie({data:{...r.data},index:t}),se(!0))},onDelete:(e,t)=>{const r=P[t];r&&(de({index:t,id:r.id}),le(!0))},onToggleCheckbox:async(e,t,r,a)=>{const n=P[a];if(n){const e=Array.isArray(t)?t[0]:t,o={...n.data,[e]:String(r)},i=await $.updateDataMessage(n.id,o);N((e=>{const t=[...e];return t[a]={...n,id:i,data:o},t})),s.dataCache.clearPattern(v)}},onEnumChange:async(e,t,r,a)=>{const n=P[a];if(n){const e=Array.isArray(t)?t[0]:t,o={...n.data,[e]:r},i=await $.updateDataMessage(n.id,o);N((e=>{const t=[...e];return t[a]={...n,id:i,data:o},t})),s.dataCache.clearPattern(v)}},onFilteredDataChange:ke})]}),O&&!T.trim()&&e.jsx("div",{className:Z.loadMoreContainer,children:e.jsx(r.Button,{appearance:"primary",size:"medium",onClick:ye,disabled:H,children:H?ee("Laddar..."):ee("Visa fler")+` (${P.length} ${ee("laddade")})`})}),e.jsx(g.RecordModal,{open:ne,onClose:()=>se(!1),onSave:async e=>{if(oe){const t=P[oe.index];if(t){const r={};for(const t in e){const a=e[t];r[t]=null==a?"":String(a)}const a=await $.updateDataMessage(t.id,r);N((e=>{const n=[...e];return n[oe.index]={...t,id:a,data:r},n})),s.dataCache.clearPattern(v)}}else{const t={};for(const r in e){const a=e[r];t[r]=null==a?"":String(a)}const r={id:await $.createDataMessage(v,t),data:t,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[v],mentions:[$.codicent]};N((e=>[r,...e])),s.dataCache.clearPattern(v)}},columns:ae,initialData:oe?.data}),e.jsx(r.Dialog,{open:ce,onOpenChange:(e,t)=>!t.open&&be(),children:e.jsx(r.DialogSurface,{children:e.jsxs(r.DialogBody,{children:[e.jsx(r.DialogTitle,{children:ee("Confirm Delete")}),e.jsx(r.DialogContent,{children:ee("Are you sure you want to delete this record? This action cannot be undone.")}),e.jsxs(r.DialogActions,{children:[e.jsx(r.Button,{appearance:"secondary",onClick:be,children:ee("Cancel")}),e.jsx(r.Button,{appearance:"primary",onClick:async()=>{if(ue)try{await $.deleteDataMessage(ue.id),N((e=>e.filter(((e,t)=>t!==ue.index)))),s.dataCache.clearPattern(v)}catch(e){console.error("Failed to delete record:",e)}finally{le(!1),de(null)}},children:ee("Delete")})]})]})})})]})})};exports.ListPage=x,exports.default=x;
|
|
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");var h=require("../node_modules/lodash/lodash.js");const f=r.makeStyles({container:{width:"100%",flex:1,maxWidth:"100%",height:"100%",minHeight:0,backgroundColor:"#ffffff",display:"flex",flexDirection:"column",margin:"0 auto",overflow:"hidden","@media (max-width: 768px)":{maxWidth:"100%",borderRadius:"0"},touchAction:"pan-y",paddingLeft:"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,x=({state:x,getColumnDefs:q,filterData:C})=>{const[S,w]=c.useSearchParams(),v=S.get("tag")||"logbook",y=S.get("title")||"",k=S.get("contentTitle"),b="true"===S.get("loadAll"),A="true"===S.get("canAdd"),M="true"===S.get("canEdit"),D="false"!==S.get("canExport"),E=S.get("addUrl")||"",R=S.get("q")||"",[T,_]=t.useState(R),[B,I]=t.useState(R),{service:$}=x,[P,N]=t.useState([]),[L,F]=t.useState(!1),[O,U]=t.useState(!1),[H,W]=t.useState(!1),V=t.useRef(null),z=t.useRef(R),J=t.useRef(""),Q=t.useRef(!0),[G,K]=t.useState(0),[X,Y]=t.useState(null),Z=f(),{t:ee}=u.default(),te=c.useNavigate(),{getCurrentUserName:re}=d.useUserRoles($,x.context.nickname,x.context.selectedApp),ae=t.useMemo((()=>(k?[{key:k,title:k,maxWidth:250}]:q?q(v):[]).map((e=>({...e,title:e.title?ee(e.title):void 0})))),[k,v,ee,q]),[ne,se]=t.useState(!1),[oe,ie]=t.useState(null),[ce,le]=t.useState(!1),[ue,de]=t.useState(null),pe=t.useMemo((()=>`listpage_searches_${v}`),[v]),me=e=>{try{const t=localStorage.getItem(e);return t?JSON.parse(t):[]}catch{return[]}},[ge,he]=t.useState((()=>me(pe)));t.useEffect((()=>{he(me(pe))}),[pe]);const fe=t.useCallback((e=>{const t=e.trim();t&&he((e=>{const r=[t,...e.filter((e=>e!==t))].slice(0,20);try{localStorage.setItem(pe,JSON.stringify(r))}catch{}return r}))}),[pe]),je=t.useCallback((e=>{he((t=>{const r=t.filter((t=>t!==e));try{localStorage.setItem(pe,JSON.stringify(r))}catch{}return r}))}),[pe]),xe=t.useMemo((()=>h.lodashExports.debounce((e=>I(e)),500)),[I]);t.useEffect((()=>()=>{xe.cancel()}),[xe]);const qe=t.useCallback((e=>{_(e),xe(e)}),[xe]),Ce=t.useCallback((e=>{fe(e)}),[fe]);t.useEffect((()=>{if(!S.get("q")){const e=S.get(`filter_${v}`);if(e){let t=e;if("%USERNAME%"===t){const e=re();if(!e)return;t=e}_(t),I(t),z.current=t}}}),[v,S,re]),t.useEffect((()=>{const e=S.get("q")||"";e!==z.current&&(_(e),I(e),z.current=e,J.current="")}),[S]),t.useEffect((()=>(V.current&&clearTimeout(V.current),V.current=setTimeout((()=>{if(z.current!==T){const e={title:y,tag:v};k&&(e.contentTitle=k),T&&(e.q=T),b&&(e.loadAll="true"),w(e,{replace:!0}),z.current=T}}),500),()=>{V.current&&clearTimeout(V.current)})),[T,v,y,k,b,w]),t.useEffect((()=>{Q.current=!0;const e=`${v}-${k}-${b}-${G}-${B}`;if(e===J.current)return;J.current=e;const t=k?`${v}-${B}-${k}`:`${v}-${B||"all"}`,r=s.dataCache.get(t);if(!r){if(U(!1),F(!0),k)$.getMessagesFast([v],B).then((e=>{if(!Q.current)return void F(!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:[v],mentions:[$.codicent],createdAt:t}}));s.dataCache.set(t,r),Q.current&&N(r)})).catch(console.warn).finally((()=>F(!1)));else{const e=B||"",r=b||e?void 0:j;$.readDataMessages(v,e,void 0,0,r).then((r=>{s.dataCache.set(t,r),Q.current?(N(r),U(!b&&!e&&r.length===j)):F(!1)})).catch(console.warn).finally((()=>F(!1)))}return()=>{Q.current=!1}}if(N(r),U(!b&&!k&&r.length>=j),!k&&!B&&r.length>0){const e=r.reduce(((e,t)=>t.createdAt>e?t.createdAt:e),r[0].createdAt);$.readDataMessages(v,"",void 0,void 0,void 0,e).then((e=>{Q.current&&N((r=>{const a=new Set(r.map((e=>e.id))),n=e.filter((e=>!a.has(e.id)));if(0===n.length)return r;const o=[...n,...r];return s.dataCache.set(t,o),o}))})).catch(console.warn)}}),[$,v,k,b,B,G]);const Se=t.useMemo((()=>{const e={};S.forEach(((t,r)=>{r.startsWith("filter_")&&(e[r.replace("filter_","")]=t)}));let t=P.map(((e,t)=>({item:e,index:t})));for(const[r,a]of Object.entries(e)){const e=a.replace("%USERNAME%",re()),n=x.context.nickname||"";t=t.filter((({item:t})=>{const a=t.data[r];return null!=a&&(String(a).includes(e)||String(a).includes(n))}))}if(C){const e=C(t.map((({item:e})=>e)),v),r=new Set(e.map((e=>e.id)));t=t.filter((({item:e})=>r.has(e.id)))}return t.map((({item:e,index:t})=>({...e.data,createdAt:e.createdAt,_id:e.id,originalMessageId:e.originalMessageId||e.id,_index:t})))}),[P,S,x.context.nickname,re,C,v]),we=t.useMemo((()=>{const e=(T||"").trim().toLowerCase();if(!e)return Se;const t=ae.filter((e=>!e.hidden)).map((e=>e.key));return Se.filter((r=>{for(const a of t)if(Array.isArray(a))for(const t of a){const a=r[t];if(null!=a&&String(a).toLowerCase().includes(e))return!0}else{const t=r[a];if(null!=t&&String(t).toLowerCase().includes(e))return!0}return!1}))}),[Se,T,ae]),ve=t.useCallback((()=>{s.dataCache.clearPattern(v),J.current="",K((e=>e+1))}),[v]),ye=t.useCallback((async()=>{W(!0);try{const e=await $.readDataMessages(v,"",void 0,P.length,j),t=[...P,...e];N(t),s.dataCache.set(`${v}-all`,t),U(e.length===j)}catch(e){console.warn(e)}finally{W(!1)}}),[P,$,v]),ke=t.useCallback((e=>{Y(e)}),[]),be=()=>{le(!1),de(null)},Ae=t.useCallback((async()=>{const e=`${v}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const t=null!==X?X:we;await i.exportToExcel(t,ae,e,ee)||console.warn("No data to export")}),[X,we,ae,v,ee]),Me=t.useMemo((()=>null!==X?X.length:we.length),[X,we]);return e.jsx(l.Page,{hideHeader:!0,children:e.jsxs("div",{className:Z.container,children:[e.jsx("div",{className:Z.backButton,children:e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowLeft24Regular,{}),onClick:()=>te(-1),children:ee("Tillbaka")})}),e.jsxs("div",{className:Z.headerRow,children:[e.jsx(a.default,{title:ee(y||"Loggbok")}),e.jsxs("div",{className:Z.buttonGroup,children:[e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowClockwise24Regular,{}),onClick:ve,title:ee("Refresh"),children:ee("Refresh")}),D&&e.jsx(r.Button,{appearance:"subtle",icon:e.jsx(n.ArrowDownload24Regular,{}),onClick:Ae,title:ee("Export to Excel"),children:ee("Export to Excel")}),(A||E)&&e.jsx(r.Button,{appearance:"primary",icon:e.jsx(n.Add24Regular,{}),onClick:A?()=>{ie(null),se(!0)}:()=>window.open(E,"_blank"),className:Z.addButton,children:ee("Add Record")})]})]}),e.jsx("div",{className:Z.searchBox,children:e.jsx(p.default,{placeholder:ee("Sök")+"...",value:T,onChange:qe,recentSearches:ge,onCommitSearch:Ce,onRemoveRecentSearch:je})}),!L&&e.jsxs("div",{className:Z.recordsCount,children:[ee("Total"),": ",Me," ",ee("records"),Me!==P.length&&` (${ee("filtered from")} ${P.length})`]}),e.jsxs("div",{className:Z.listContainer,children:[L&&e.jsx("p",{children:ee("Söker")+"..."}),!L&&e.jsx(m.default,{data:we,columns:ae,canEdit:M,onEdit:(e,t)=>{const r=P[t];r&&(ie({data:{...r.data},index:t}),se(!0))},onDelete:(e,t)=>{const r=P[t];r&&(de({index:t,id:r.id}),le(!0))},onToggleCheckbox:async(e,t,r,a)=>{const n=P[a];if(n){const e=Array.isArray(t)?t[0]:t,o={...n.data,[e]:String(r)},i=await $.updateDataMessage(n.id,o);N((e=>{const t=[...e];return t[a]={...n,id:i,data:o},t})),s.dataCache.clearPattern(v)}},onEnumChange:async(e,t,r,a)=>{const n=P[a];if(n){const e=Array.isArray(t)?t[0]:t,o={...n.data,[e]:r},i=await $.updateDataMessage(n.id,o);N((e=>{const t=[...e];return t[a]={...n,id:i,data:o},t})),s.dataCache.clearPattern(v)}},onFilteredDataChange:ke})]}),O&&!T.trim()&&e.jsx("div",{className:Z.loadMoreContainer,children:e.jsx(r.Button,{appearance:"primary",size:"medium",onClick:ye,disabled:H,children:H?ee("Laddar..."):ee("Visa fler")+` (${P.length} ${ee("laddade")})`})}),e.jsx(g.RecordModal,{open:ne,onClose:()=>se(!1),onSave:async e=>{if(oe){const t=P[oe.index];if(t){const r={};for(const t in e){const a=e[t];r[t]=null==a?"":String(a)}const a=await $.updateDataMessage(t.id,r);N((e=>{const n=[...e];return n[oe.index]={...t,id:a,data:r},n})),s.dataCache.clearPattern(v)}}else{const t={};for(const r in e){const a=e[r];t[r]=null==a?"":String(a)}const r={id:await $.createDataMessage(v,t),data:t,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[v],mentions:[$.codicent]};N((e=>[r,...e])),s.dataCache.clearPattern(v)}},columns:ae,initialData:oe?.data}),e.jsx(r.Dialog,{open:ce,onOpenChange:(e,t)=>!t.open&&be(),children:e.jsx(r.DialogSurface,{children:e.jsxs(r.DialogBody,{children:[e.jsx(r.DialogTitle,{children:ee("Confirm Delete")}),e.jsx(r.DialogContent,{children:ee("Are you sure you want to delete this record? This action cannot be undone.")}),e.jsxs(r.DialogActions,{children:[e.jsx(r.Button,{appearance:"secondary",onClick:be,children:ee("Cancel")}),e.jsx(r.Button,{appearance:"primary",onClick:async()=>{if(ue)try{await $.deleteDataMessage(ue.id),N((e=>e.filter(((e,t)=>t!==ue.index)))),s.dataCache.clearPattern(v)}catch(e){console.error("Failed to delete record:",e)}finally{le(!1),de(null)}},children:ee("Delete")})]})]})})})]})})};exports.ListPage=x,exports.default=x;
|
|
@@ -7,7 +7,7 @@ export interface UserRole {
|
|
|
7
7
|
role: string;
|
|
8
8
|
claims?: string;
|
|
9
9
|
}
|
|
10
|
-
export declare const useUserRoles: (service: CodicentService, currentNickname?: string) => {
|
|
10
|
+
export declare const useUserRoles: (service: CodicentService, currentNickname?: string, currentCodicent?: string) => {
|
|
11
11
|
userRoles: UserRole[];
|
|
12
12
|
loading: boolean;
|
|
13
13
|
error: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUserRoles.d.ts","sourceRoot":"","sources":["../../../src/hooks/useUserRoles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,YAAa,eAAe,oBAAoB,MAAM;;;;
|
|
1
|
+
{"version":3,"file":"useUserRoles.d.ts","sourceRoot":"","sources":["../../../src/hooks/useUserRoles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,YAAa,eAAe,oBAAoB,MAAM,oBAAoB,MAAM;;;;oCAiC1F,MAAM,KAAG,MAAM;gCAgBO,MAAM,KAAG,MAAM;8BAUjB,MAAM,QAAQ,QAAQ,KAAG,OAAO;+BAe/B,MAAM,KAAG,QAAQ,GAAG,SAAS;mCAKzB,MAAM,KAAG,MAAM,EAAE;8BASxB,QAAQ,GAAG,SAAS;8BAKR,MAAM;CAiBlD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useState as e,useEffect as r,useCallback as t}from"react";import n from"../utils/MessageContent.js";const s=(s,o)=>{const[
|
|
1
|
+
import{useState as e,useEffect as r,useCallback as t}from"react";import n from"../utils/MessageContent.js";const s=(s,o,a)=>{const[i,m]=e([]),[l,c]=e(!0),[u,f]=e(null);r((()=>{if(!o)return;if(!a)return;(async()=>{try{c(!0),f(null);const e=(await s.getMessagesFast(["user_role"],void 0,100)).map((e=>{const r=new n(e.content).data;return r&&"object"==typeof r?r:null})).filter((e=>null!==e));m(e)}catch(e){console.error("Failed to fetch user roles:",e),f(e instanceof Error?e.message:"Failed to fetch user roles")}finally{c(!1)}})()}),[s,o,a]);const p=t((e=>{if(!e)return"";const r=e.toLowerCase(),t=i.find((e=>{if(!e.nicknames)return!1;return e.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===r))}));return t?.name||e}),[i]),C=(e,r)=>{if(!e||!r)return!1;const t=e.toLowerCase();if(r.nicknames){if(r.nicknames.toLowerCase().split(",").map((e=>e.trim())).some((e=>e===t)))return!0}return r.name?.toLowerCase()===t||r.email?.toLowerCase()===t},g=e=>{if(e)return i.find((r=>C(e,r)))},w=t((()=>o?p(o):""),[o,p]);return{userRoles:i,loading:l,error:u,getNameFromNickname:p,getNicknameFromName:e=>{if(!e)return"";const r=i.find((r=>r.name?.toLowerCase()===e.toLowerCase()));if(r?.nicknames){return r.nicknames.split(",").map((e=>e.trim()))[0]||e}return e},isUserMatch:C,findUserRole:g,getClaimsForUser:e=>{const r=g(e);return r?.claims?r.claims.split(",").map((e=>e.trim())).filter(Boolean):[]},getCurrentUserRole:()=>{if(o)return g(o)},getCurrentUserName:w}};export{s as useUserRoles};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useState as o,useRef as n,useMemo as r,useEffect as a,useCallback as i}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{makeStyles as s,Button as c,Dialog as l,DialogSurface as m,DialogBody as d,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 S}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 v,useNavigate as b}from"react-router-dom";import"./Purchase.js";import"../components/Content.js";import{Page as k}from"../components/Page.js";import"./QrScan.js";import A 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 M}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 D 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{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"}}),N=500,E=({state:s,getColumnDefs:E,filterData:P})=>{const[R,B]=v(),L=R.get("tag")||"logbook",F=R.get("title")||"",O=R.get("contentTitle"),H="true"===R.get("loadAll"),U="true"===R.get("canAdd"),W="true"===R.get("canEdit"),q="false"!==R.get("canExport"),V=R.get("addUrl")||"",z=R.get("q")||"",[J,Q]=o(z),[G,K]=o(z),{service:X}=s,[Y,Z]=o([]),[ee,te]=o(!1),[oe,ne]=o(!1),[re,ae]=o(!1),ie=n(null),se=n(z),ce=n(""),le=n(!0),[me,de]=o(0),[pe,ue]=o(null),ge=_(),{t:fe}=A(),he=b(),{getCurrentUserName:je}=M(X,s.context.nickname),xe=r((()=>(O?[{key:O,title:O,maxWidth:250}]:E?E(L):[]).map((e=>({...e,title:e.title?fe(e.title):void 0})))),[O,L,fe,E]),[we,ye]=o(!1),[Ce,Se]=o(null),[ve,be]=o(!1),[ke,Ae]=o(null),Me=r((()=>`listpage_searches_${L}`),[L]),De=e=>{try{const t=localStorage.getItem(e);return t?JSON.parse(t):[]}catch{return[]}},[Ie,Te]=o((()=>De(Me)));a((()=>{Te(De(Me))}),[Me]);const $e=i((e=>{const t=e.trim();t&&Te((e=>{const o=[t,...e.filter((e=>e!==t))].slice(0,20);try{localStorage.setItem(Me,JSON.stringify(o))}catch{}return o}))}),[Me]),_e=i((e=>{Te((t=>{const o=t.filter((t=>t!==e));try{localStorage.setItem(Me,JSON.stringify(o))}catch{}return o}))}),[Me]),Ne=r((()=>$.debounce((e=>K(e)),500)),[K]);a((()=>()=>{Ne.cancel()}),[Ne]);const Ee=i((e=>{Q(e),Ne(e)}),[Ne]),Pe=i((e=>{$e(e)}),[$e]);a((()=>{if(!R.get("q")){const e=R.get(`filter_${L}`);if(e){let t=e;if("%USERNAME%"===t){const e=je();if(!e)return;t=e}Q(t),K(t),se.current=t}}}),[L,R,je]),a((()=>{const e=R.get("q")||"";e!==se.current&&(Q(e),K(e),se.current=e,ce.current="")}),[R]),a((()=>(ie.current&&clearTimeout(ie.current),ie.current=setTimeout((()=>{if(se.current!==J){const e={title:F,tag:L};O&&(e.contentTitle=O),J&&(e.q=J),H&&(e.loadAll="true"),B(e,{replace:!0}),se.current=J}}),500),()=>{ie.current&&clearTimeout(ie.current)})),[J,L,F,O,H,B]),a((()=>{le.current=!0;const e=`${L}-${O}-${H}-${me}-${G}`;if(e===ce.current)return;ce.current=e;const t=O?`${L}-${G}-${O}`:`${L}-${G||"all"}`,o=y.get(t);if(!o){if(ne(!1),te(!0),O)X.getMessagesFast([L],G).then((e=>{if(!le.current)return void te(!1);const o=e.map((e=>{const t=new Date(e.createdAt).toLocaleString();return{id:e.id,data:{[O]:new C(e.content).content,createdAt:t},fileId:null,fileIds:[],tags:[L],mentions:[X.codicent],createdAt:t}}));y.set(t,o),le.current&&Z(o)})).catch(console.warn).finally((()=>te(!1)));else{const e=G||"",o=H||e?void 0:N;X.readDataMessages(L,e,void 0,0,o).then((o=>{y.set(t,o),le.current?(Z(o),ne(!H&&!e&&o.length===N)):te(!1)})).catch(console.warn).finally((()=>te(!1)))}return()=>{le.current=!1}}if(Z(o),ne(!H&&!O&&o.length>=N),!O&&!G&&o.length>0){const e=o.reduce(((e,t)=>t.createdAt>e?t.createdAt:e),o[0].createdAt);X.readDataMessages(L,"",void 0,void 0,void 0,e).then((e=>{le.current&&Z((o=>{const n=new Set(o.map((e=>e.id))),r=e.filter((e=>!n.has(e.id)));if(0===r.length)return o;const a=[...r,...o];return y.set(t,a),a}))})).catch(console.warn)}}),[X,L,O,H,G,me]);const Re=r((()=>{const e={};R.forEach(((t,o)=>{o.startsWith("filter_")&&(e[o.replace("filter_","")]=t)}));let t=Y.map(((e,t)=>({item:e,index:t})));for(const[o,n]of Object.entries(e)){const e=n.replace("%USERNAME%",je()),r=s.context.nickname||"";t=t.filter((({item:t})=>{const n=t.data[o];return null!=n&&(String(n).includes(e)||String(n).includes(r))}))}if(P){const e=P(t.map((({item:e})=>e)),L),o=new Set(e.map((e=>e.id)));t=t.filter((({item:e})=>o.has(e.id)))}return t.map((({item:e,index:t})=>({...e.data,createdAt:e.createdAt,_id:e.id,originalMessageId:e.originalMessageId||e.id,_index:t})))}),[Y,R,s.context.nickname,je,P,L]),Be=r((()=>{const e=(J||"").trim().toLowerCase();if(!e)return Re;const t=xe.filter((e=>!e.hidden)).map((e=>e.key));return Re.filter((o=>{for(const n of t)if(Array.isArray(n))for(const t of n){const n=o[t];if(null!=n&&String(n).toLowerCase().includes(e))return!0}else{const t=o[n];if(null!=t&&String(t).toLowerCase().includes(e))return!0}return!1}))}),[Re,J,xe]),Le=i((()=>{y.clearPattern(L),ce.current="",de((e=>e+1))}),[L]),Fe=i((async()=>{ae(!0);try{const e=await X.readDataMessages(L,"",void 0,Y.length,N),t=[...Y,...e];Z(t),y.set(`${L}-all`,t),ne(e.length===N)}catch(e){console.warn(e)}finally{ae(!1)}}),[Y,X,L]),Oe=i((e=>{ue(e)}),[]),He=()=>{be(!1),Ae(null)},Ue=i((async()=>{const e=`${L}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const t=null!==pe?pe:Be;await S(t,xe,e,fe)||console.warn("No data to export")}),[pe,Be,xe,L,fe]),We=r((()=>null!==pe?pe.length:Be.length),[pe,Be]);return e(k,{hideHeader:!0,children:t("div",{className:ge.container,children:[e("div",{className:ge.backButton,children:e(c,{appearance:"subtle",icon:e(h,{}),onClick:()=>he(-1),children:fe("Tillbaka")})}),t("div",{className:ge.headerRow,children:[e(f,{title:fe(F||"Loggbok")}),t("div",{className:ge.buttonGroup,children:[e(c,{appearance:"subtle",icon:e(j,{}),onClick:Le,title:fe("Refresh"),children:fe("Refresh")}),q&&e(c,{appearance:"subtle",icon:e(x,{}),onClick:Ue,title:fe("Export to Excel"),children:fe("Export to Excel")}),(U||V)&&e(c,{appearance:"primary",icon:e(w,{}),onClick:U?()=>{Se(null),ye(!0)}:()=>window.open(V,"_blank"),className:ge.addButton,children:fe("Add Record")})]})]}),e("div",{className:ge.searchBox,children:e(D,{placeholder:fe("Sök")+"...",value:J,onChange:Ee,recentSearches:Ie,onCommitSearch:Pe,onRemoveRecentSearch:_e})}),!ee&&t("div",{className:ge.recordsCount,children:[fe("Total"),": ",We," ",fe("records"),We!==Y.length&&` (${fe("filtered from")} ${Y.length})`]}),t("div",{className:ge.listContainer,children:[ee&&e("p",{children:fe("Söker")+"..."}),!ee&&e(I,{data:Be,columns:xe,canEdit:W,onEdit:(e,t)=>{const o=Y[t];o&&(Se({data:{...o.data},index:t}),ye(!0))},onDelete:(e,t)=>{const o=Y[t];o&&(Ae({index:t,id:o.id}),be(!0))},onToggleCheckbox:async(e,t,o,n)=>{const r=Y[n];if(r){const e=Array.isArray(t)?t[0]:t,a={...r.data,[e]:String(o)},i=await X.updateDataMessage(r.id,a);Z((e=>{const t=[...e];return t[n]={...r,id:i,data:a},t})),y.clearPattern(L)}},onEnumChange:async(e,t,o,n)=>{const r=Y[n];if(r){const e=Array.isArray(t)?t[0]:t,a={...r.data,[e]:o},i=await X.updateDataMessage(r.id,a);Z((e=>{const t=[...e];return t[n]={...r,id:i,data:a},t})),y.clearPattern(L)}},onFilteredDataChange:Oe})]}),oe&&!J.trim()&&e("div",{className:ge.loadMoreContainer,children:e(c,{appearance:"primary",size:"medium",onClick:Fe,disabled:re,children:re?fe("Laddar..."):fe("Visa fler")+` (${Y.length} ${fe("laddade")})`})}),e(T,{open:we,onClose:()=>ye(!1),onSave:async e=>{if(Ce){const t=Y[Ce.index];if(t){const o={};for(const t in e){const n=e[t];o[t]=null==n?"":String(n)}const n=await X.updateDataMessage(t.id,o);Z((e=>{const r=[...e];return r[Ce.index]={...t,id:n,data:o},r})),y.clearPattern(L)}}else{const t={};for(const o in e){const n=e[o];t[o]=null==n?"":String(n)}const o={id:await X.createDataMessage(L,t),data:t,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[L],mentions:[X.codicent]};Z((e=>[o,...e])),y.clearPattern(L)}},columns:xe,initialData:Ce?.data}),e(l,{open:ve,onOpenChange:(e,t)=>!t.open&&He(),children:e(m,{children:t(d,{children:[e(p,{children:fe("Confirm Delete")}),e(u,{children:fe("Are you sure you want to delete this record? This action cannot be undone.")}),t(g,{children:[e(c,{appearance:"secondary",onClick:He,children:fe("Cancel")}),e(c,{appearance:"primary",onClick:async()=>{if(ke)try{await X.deleteDataMessage(ke.id),Z((e=>e.filter(((e,t)=>t!==ke.index)))),y.clearPattern(L)}catch(e){console.error("Failed to delete record:",e)}finally{be(!1),Ae(null)}},children:fe("Delete")})]})]})})})]})})};export{E as ListPage,E as default};
|
|
1
|
+
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useState as o,useRef as n,useMemo as r,useEffect as a,useCallback as i}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{makeStyles as s,Button as c,Dialog as l,DialogSurface as m,DialogBody as d,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 S}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 v,useNavigate as b}from"react-router-dom";import"./Purchase.js";import"../components/Content.js";import{Page as k}from"../components/Page.js";import"./QrScan.js";import A 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 M}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 D 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{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"}}),N=500,E=({state:s,getColumnDefs:E,filterData:P})=>{const[R,B]=v(),L=R.get("tag")||"logbook",F=R.get("title")||"",O=R.get("contentTitle"),H="true"===R.get("loadAll"),U="true"===R.get("canAdd"),W="true"===R.get("canEdit"),q="false"!==R.get("canExport"),V=R.get("addUrl")||"",z=R.get("q")||"",[J,Q]=o(z),[G,K]=o(z),{service:X}=s,[Y,Z]=o([]),[ee,te]=o(!1),[oe,ne]=o(!1),[re,ae]=o(!1),ie=n(null),se=n(z),ce=n(""),le=n(!0),[me,de]=o(0),[pe,ue]=o(null),ge=_(),{t:fe}=A(),he=b(),{getCurrentUserName:je}=M(X,s.context.nickname,s.context.selectedApp),xe=r((()=>(O?[{key:O,title:O,maxWidth:250}]:E?E(L):[]).map((e=>({...e,title:e.title?fe(e.title):void 0})))),[O,L,fe,E]),[we,ye]=o(!1),[Ce,Se]=o(null),[ve,be]=o(!1),[ke,Ae]=o(null),Me=r((()=>`listpage_searches_${L}`),[L]),De=e=>{try{const t=localStorage.getItem(e);return t?JSON.parse(t):[]}catch{return[]}},[Ie,Te]=o((()=>De(Me)));a((()=>{Te(De(Me))}),[Me]);const $e=i((e=>{const t=e.trim();t&&Te((e=>{const o=[t,...e.filter((e=>e!==t))].slice(0,20);try{localStorage.setItem(Me,JSON.stringify(o))}catch{}return o}))}),[Me]),_e=i((e=>{Te((t=>{const o=t.filter((t=>t!==e));try{localStorage.setItem(Me,JSON.stringify(o))}catch{}return o}))}),[Me]),Ne=r((()=>$.debounce((e=>K(e)),500)),[K]);a((()=>()=>{Ne.cancel()}),[Ne]);const Ee=i((e=>{Q(e),Ne(e)}),[Ne]),Pe=i((e=>{$e(e)}),[$e]);a((()=>{if(!R.get("q")){const e=R.get(`filter_${L}`);if(e){let t=e;if("%USERNAME%"===t){const e=je();if(!e)return;t=e}Q(t),K(t),se.current=t}}}),[L,R,je]),a((()=>{const e=R.get("q")||"";e!==se.current&&(Q(e),K(e),se.current=e,ce.current="")}),[R]),a((()=>(ie.current&&clearTimeout(ie.current),ie.current=setTimeout((()=>{if(se.current!==J){const e={title:F,tag:L};O&&(e.contentTitle=O),J&&(e.q=J),H&&(e.loadAll="true"),B(e,{replace:!0}),se.current=J}}),500),()=>{ie.current&&clearTimeout(ie.current)})),[J,L,F,O,H,B]),a((()=>{le.current=!0;const e=`${L}-${O}-${H}-${me}-${G}`;if(e===ce.current)return;ce.current=e;const t=O?`${L}-${G}-${O}`:`${L}-${G||"all"}`,o=y.get(t);if(!o){if(ne(!1),te(!0),O)X.getMessagesFast([L],G).then((e=>{if(!le.current)return void te(!1);const o=e.map((e=>{const t=new Date(e.createdAt).toLocaleString();return{id:e.id,data:{[O]:new C(e.content).content,createdAt:t},fileId:null,fileIds:[],tags:[L],mentions:[X.codicent],createdAt:t}}));y.set(t,o),le.current&&Z(o)})).catch(console.warn).finally((()=>te(!1)));else{const e=G||"",o=H||e?void 0:N;X.readDataMessages(L,e,void 0,0,o).then((o=>{y.set(t,o),le.current?(Z(o),ne(!H&&!e&&o.length===N)):te(!1)})).catch(console.warn).finally((()=>te(!1)))}return()=>{le.current=!1}}if(Z(o),ne(!H&&!O&&o.length>=N),!O&&!G&&o.length>0){const e=o.reduce(((e,t)=>t.createdAt>e?t.createdAt:e),o[0].createdAt);X.readDataMessages(L,"",void 0,void 0,void 0,e).then((e=>{le.current&&Z((o=>{const n=new Set(o.map((e=>e.id))),r=e.filter((e=>!n.has(e.id)));if(0===r.length)return o;const a=[...r,...o];return y.set(t,a),a}))})).catch(console.warn)}}),[X,L,O,H,G,me]);const Re=r((()=>{const e={};R.forEach(((t,o)=>{o.startsWith("filter_")&&(e[o.replace("filter_","")]=t)}));let t=Y.map(((e,t)=>({item:e,index:t})));for(const[o,n]of Object.entries(e)){const e=n.replace("%USERNAME%",je()),r=s.context.nickname||"";t=t.filter((({item:t})=>{const n=t.data[o];return null!=n&&(String(n).includes(e)||String(n).includes(r))}))}if(P){const e=P(t.map((({item:e})=>e)),L),o=new Set(e.map((e=>e.id)));t=t.filter((({item:e})=>o.has(e.id)))}return t.map((({item:e,index:t})=>({...e.data,createdAt:e.createdAt,_id:e.id,originalMessageId:e.originalMessageId||e.id,_index:t})))}),[Y,R,s.context.nickname,je,P,L]),Be=r((()=>{const e=(J||"").trim().toLowerCase();if(!e)return Re;const t=xe.filter((e=>!e.hidden)).map((e=>e.key));return Re.filter((o=>{for(const n of t)if(Array.isArray(n))for(const t of n){const n=o[t];if(null!=n&&String(n).toLowerCase().includes(e))return!0}else{const t=o[n];if(null!=t&&String(t).toLowerCase().includes(e))return!0}return!1}))}),[Re,J,xe]),Le=i((()=>{y.clearPattern(L),ce.current="",de((e=>e+1))}),[L]),Fe=i((async()=>{ae(!0);try{const e=await X.readDataMessages(L,"",void 0,Y.length,N),t=[...Y,...e];Z(t),y.set(`${L}-all`,t),ne(e.length===N)}catch(e){console.warn(e)}finally{ae(!1)}}),[Y,X,L]),Oe=i((e=>{ue(e)}),[]),He=()=>{be(!1),Ae(null)},Ue=i((async()=>{const e=`${L}_${(new Date).toISOString().split("T")[0]}`.replace(/[/\\:*?"<>|]/g,"_");const t=null!==pe?pe:Be;await S(t,xe,e,fe)||console.warn("No data to export")}),[pe,Be,xe,L,fe]),We=r((()=>null!==pe?pe.length:Be.length),[pe,Be]);return e(k,{hideHeader:!0,children:t("div",{className:ge.container,children:[e("div",{className:ge.backButton,children:e(c,{appearance:"subtle",icon:e(h,{}),onClick:()=>he(-1),children:fe("Tillbaka")})}),t("div",{className:ge.headerRow,children:[e(f,{title:fe(F||"Loggbok")}),t("div",{className:ge.buttonGroup,children:[e(c,{appearance:"subtle",icon:e(j,{}),onClick:Le,title:fe("Refresh"),children:fe("Refresh")}),q&&e(c,{appearance:"subtle",icon:e(x,{}),onClick:Ue,title:fe("Export to Excel"),children:fe("Export to Excel")}),(U||V)&&e(c,{appearance:"primary",icon:e(w,{}),onClick:U?()=>{Se(null),ye(!0)}:()=>window.open(V,"_blank"),className:ge.addButton,children:fe("Add Record")})]})]}),e("div",{className:ge.searchBox,children:e(D,{placeholder:fe("Sök")+"...",value:J,onChange:Ee,recentSearches:Ie,onCommitSearch:Pe,onRemoveRecentSearch:_e})}),!ee&&t("div",{className:ge.recordsCount,children:[fe("Total"),": ",We," ",fe("records"),We!==Y.length&&` (${fe("filtered from")} ${Y.length})`]}),t("div",{className:ge.listContainer,children:[ee&&e("p",{children:fe("Söker")+"..."}),!ee&&e(I,{data:Be,columns:xe,canEdit:W,onEdit:(e,t)=>{const o=Y[t];o&&(Se({data:{...o.data},index:t}),ye(!0))},onDelete:(e,t)=>{const o=Y[t];o&&(Ae({index:t,id:o.id}),be(!0))},onToggleCheckbox:async(e,t,o,n)=>{const r=Y[n];if(r){const e=Array.isArray(t)?t[0]:t,a={...r.data,[e]:String(o)},i=await X.updateDataMessage(r.id,a);Z((e=>{const t=[...e];return t[n]={...r,id:i,data:a},t})),y.clearPattern(L)}},onEnumChange:async(e,t,o,n)=>{const r=Y[n];if(r){const e=Array.isArray(t)?t[0]:t,a={...r.data,[e]:o},i=await X.updateDataMessage(r.id,a);Z((e=>{const t=[...e];return t[n]={...r,id:i,data:a},t})),y.clearPattern(L)}},onFilteredDataChange:Oe})]}),oe&&!J.trim()&&e("div",{className:ge.loadMoreContainer,children:e(c,{appearance:"primary",size:"medium",onClick:Fe,disabled:re,children:re?fe("Laddar..."):fe("Visa fler")+` (${Y.length} ${fe("laddade")})`})}),e(T,{open:we,onClose:()=>ye(!1),onSave:async e=>{if(Ce){const t=Y[Ce.index];if(t){const o={};for(const t in e){const n=e[t];o[t]=null==n?"":String(n)}const n=await X.updateDataMessage(t.id,o);Z((e=>{const r=[...e];return r[Ce.index]={...t,id:n,data:o},r})),y.clearPattern(L)}}else{const t={};for(const o in e){const n=e[o];t[o]=null==n?"":String(n)}const o={id:await X.createDataMessage(L,t),data:t,createdAt:(new Date).toISOString(),fileId:null,fileIds:[],tags:[L],mentions:[X.codicent]};Z((e=>[o,...e])),y.clearPattern(L)}},columns:xe,initialData:Ce?.data}),e(l,{open:ve,onOpenChange:(e,t)=>!t.open&&He(),children:e(m,{children:t(d,{children:[e(p,{children:fe("Confirm Delete")}),e(u,{children:fe("Are you sure you want to delete this record? This action cannot be undone.")}),t(g,{children:[e(c,{appearance:"secondary",onClick:He,children:fe("Cancel")}),e(c,{appearance:"primary",onClick:async()=>{if(ke)try{await X.deleteDataMessage(ke.id),Z((e=>e.filter(((e,t)=>t!==ke.index)))),y.clearPattern(L)}catch(e){console.error("Failed to delete record:",e)}finally{be(!1),Ae(null)}},children:fe("Delete")})]})]})})})]})})};export{E as ListPage,E as default};
|
package/dist/index.d.ts
CHANGED
|
@@ -880,7 +880,7 @@ interface UserRole {
|
|
|
880
880
|
role: string;
|
|
881
881
|
claims?: string;
|
|
882
882
|
}
|
|
883
|
-
declare const useUserRoles: (service: CodicentService, currentNickname?: string) => {
|
|
883
|
+
declare const useUserRoles: (service: CodicentService, currentNickname?: string, currentCodicent?: string) => {
|
|
884
884
|
userRoles: UserRole[];
|
|
885
885
|
loading: boolean;
|
|
886
886
|
error: string | null;
|