redis-smq-web-ui 9.0.0-next.2 → 9.0.0-next.4

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/CHANGELOG.md CHANGED
@@ -3,6 +3,36 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [9.0.0-next.4](https://github.com/weyoss/redis-smq/compare/v9.0.0-next.3...v9.0.0-next.4) (2025-10-09)
7
+
8
+ ### ✨ Features
9
+
10
+ - **redis-smq-web-ui:** add exchange management system ([c33650c](https://github.com/weyoss/redis-smq/commit/c33650c01a3c4fcd4663b08668642f7aea394fce))
11
+
12
+ ### 🐛 Bug Fixes
13
+
14
+ - **redis-smq-web-ui:** fix error message reference ([8e6fb43](https://github.com/weyoss/redis-smq/commit/8e6fb4379976a7a3d26036f22f235f0271da79a0))
15
+ - **redis-smq-web-ui:** initialize RedisSMQ before starting API server ([22887fa](https://github.com/weyoss/redis-smq/commit/22887faf0abc8939de9f90e8abfb18d7c8e93d02))
16
+ - **redis-smq-web-ui:** update branding ([2bd50ce](https://github.com/weyoss/redis-smq/commit/2bd50ce8ef75bdca9c5602ddc8bc6d36cdb8342f))
17
+
18
+ ### 📝 Documentation
19
+
20
+ - **redis-smq-web-ui:** improve README formatting ([e0d3399](https://github.com/weyoss/redis-smq/commit/e0d33990886f934df31e65fa831b87f7a761e3b0))
21
+
22
+ ### ♻️ Code Refactoring
23
+
24
+ - **redis-smq-web-ui:** standardize HTML formatting ([b290044](https://github.com/weyoss/redis-smq/commit/b290044c861014cda393467dd3b7af52f5507679))
25
+
26
+ ## [9.0.0-next.3](https://github.com/weyoss/redis-smq/compare/v9.0.0-next.2...v9.0.0-next.3) (2025-09-09)
27
+
28
+ ### 🐛 Bug Fixes
29
+
30
+ - **redis-smq-web-ui:** move redis-smq-rest-api from peer to dev deps ([573829e](https://github.com/weyoss/redis-smq/commit/573829e862355c33deb4b830a6c89c708d387c6f))
31
+
32
+ ### 📝 Documentation
33
+
34
+ - **redis-smq-web-ui:** include Priority Queues support ([ce6d143](https://github.com/weyoss/redis-smq/commit/ce6d1436ea0015e66d736e7a01f1e2982254a0c2))
35
+
6
36
  ## [9.0.0-next.2](https://github.com/weyoss/redis-smq/compare/v9.0.0-next.1...v9.0.0-next.2) (2025-09-07)
7
37
 
8
38
  ### 📝 Documentation
package/README.md CHANGED
@@ -12,13 +12,14 @@ A Single Page Application for monitoring and managing RedisSMQ: inspect queues,
12
12
 
13
13
  - Dashboard to overview queues, consumers, and message stats
14
14
  - Queue/message browsers with filters and actions (ack, retry, delete, etc.)
15
- - Support for FIFO/LIFO and multiple delivery models
15
+ - Support for FIFO/LIFO/Priority Queues and multiple delivery models
16
16
  - Integrated documentation via Swagger UI (when served with the REST API)
17
17
  - Type-safe OpenAPI client (generated)
18
18
 
19
19
  ## Version compatibility
20
20
 
21
21
  Always install matching versions of RedisSMQ packages. See the root docs for Version Compatibility. Use the same major/minor across:
22
+
22
23
  - redis-smq
23
24
  - redis-smq-common
24
25
  - redis-smq-rest-api
@@ -32,13 +33,14 @@ Always install matching versions of RedisSMQ packages. See the root docs for Ver
32
33
  Use redis-smq-web-server to host the UI and API in one place, or proxy the API to an external service.
33
34
 
34
35
  - In-process API:
35
- - UI at http://localhost:8080/
36
- - API at http://localhost:8080/api
36
+ - UI at http://localhost:8080/
37
+ - API at http://localhost:8080/api
37
38
  - Proxy to an external REST API:
38
- - UI is still served locally
39
- - API/docs/assets are forwarded to the upstream API
39
+ - UI is still served locally
40
+ - API/docs/assets are forwarded to the upstream API
40
41
 
41
42
  See [RedisSMQ Web Server](../redis-smq-web-server/README.md) for CLI options such as:
43
+
42
44
  - --port
43
45
  - --base-path
44
46
  - --api-proxy-target
@@ -46,6 +48,7 @@ See [RedisSMQ Web Server](../redis-smq-web-server/README.md) for CLI options suc
46
48
  ### Development
47
49
 
48
50
  Prerequisites:
51
+
49
52
  - Node.js >= 20
50
53
  - PNPM (recommended)
51
54
 
@@ -53,7 +56,7 @@ From the monorepo root:
53
56
 
54
57
  ```bash
55
58
  pnpm install
56
- pnpm -w -C packages/redis-smq-web-ui dev
59
+ pnpm -F redis-smq-web-ui dev
57
60
  ```
58
61
 
59
62
  #### OpenAPI client generation
@@ -61,7 +64,7 @@ pnpm -w -C packages/redis-smq-web-ui dev
61
64
  The UI uses a generated OpenAPI client. To regenerate:
62
65
 
63
66
  ```shell
64
- pnpm -w -C packages/redis-smq-web-ui generate-openapi-client
67
+ pnpm -F redis-smq-web-ui generate-openapi-client
65
68
  ```
66
69
 
67
70
  Make sure redis-smq-rest-api (with OpenAPI endpoint) is reachable as configured by the generation script.
@@ -69,7 +72,7 @@ Make sure redis-smq-rest-api (with OpenAPI endpoint) is reachable as configured
69
72
  #### Running the dev Server
70
73
 
71
74
  ```bash
72
- pnpm -w -C packages/redis-smq-web-ui dev
75
+ pnpm -F redis-smq-web-ui dev
73
76
  ```
74
77
 
75
78
  The dev script typically runs:
@@ -78,16 +81,16 @@ The dev script typically runs:
78
81
  - A local REST API dev server for convenience
79
82
 
80
83
  - Open the printed local URL to access the UI during development.
81
-
84
+
82
85
  #### Building
83
-
86
+
84
87
  From the monorepo root:
85
88
 
86
89
  ```shell
87
- pnpm -w -C packages/redis-smq-web-ui build
90
+ pnpm -F redis-smq-web-ui build
88
91
  ```
89
92
 
90
- Artifacts are output to the package’s dist directory.
93
+ Artifacts are output to the package’s dist directory.
91
94
  Serve the built assets with [RedisSMQ Web Server](../redis-smq-web-server/README.md) for correct routing and API integration.
92
95
 
93
96
  #### Configuration and routing
@@ -1 +1 @@
1
- import{d as I,u as R,a as j,b as G,c as K,e as Y,f as w,r as p,w as S,o as z,g as J,h as f,i as E,j as _,k as y,l as O,P as U,m as t,n as g,C as W,D as X,p as i,q as n,s as D,t as m,F as Z,v as ee,Q as te,x as ae,_ as se}from"./index-Bawna6Se.js";const ue={key:0,class:"alert alert-warning alert-dismissible fade show mb-4",role:"alert"},le={key:1,class:"alert alert-warning alert-dismissible fade show mb-4",role:"alert"},ne={class:"queues-list-container"},re={class:"queues-list-header"},ie={class:"queues-count"},oe={class:"queues-list"},ce="Queues",de="Manage all available message queues",ve=I({__name:"QueuesView",setup(be){const k=ae(),s=R(),M=j(),{sortedQueues:c,isLoadingQueues:d,queuesError:C,refetchQueues:v}=G(),{createQueue:x,isCreatingQueue:Q,createQueueError:b,createQueueMutation:$}=K(async()=>{await v()}),{deleteQueue:F,isDeletingQueue:L,deleteQueueError:q,deleteQueueMutation:N}=Y(async()=>{await v()}),P=w(()=>c.value.length>0),u=p(!1),l=p(!1),o=p(null),T=w(()=>[{id:"refresh-queues",label:"Refresh",icon:"bi bi-arrow-clockwise",variant:"secondary",disabled:d.value,loading:d.value,handler:()=>v()},{id:"create-queue",label:"Create Queue",icon:"bi bi-plus-circle",variant:"primary",disabled:Q.value,loading:Q.value,handler:()=>u.value=!0}]);function V(a,e){k.push({name:"Queue",params:{ns:a,queue:e}})}async function B(a){try{const e={queue:{ns:a.ns,name:a.name},queueType:a.type,queueDeliveryModel:a.deliveryModel};await x({data:e}),u.value=!1}catch(e){console.error("Failed to create queue:",e)}}function A(a,e){o.value={ns:a,name:e},l.value=!0}async function H(){if(o.value)try{await F(o.value),l.value=!1}catch(a){console.error("Failed to delete queue:",a)}}return S(()=>{s.setPageHeader({title:ce,subtitle:de,icon:"bi bi-card-list"}),s.setPageActions(T.value),s.setLoadingState(d.value),C.value?(s.setErrorState(g(C.value)),s.setEmptyState(!1)):!d.value&&!P.value?(s.setErrorState(null),s.setEmptyState(!0,{icon:"bi bi-plus-square-dotted",title:"No Queues Found",message:"Get started by creating your first message queue.",actionLabel:"Create Your First Queue",actionHandler:()=>u.value=!0})):(s.setErrorState(null),s.setEmptyState(!1))}),S(()=>{M.clearSelectedQueue()}),z(()=>{v()}),J([{isVisible:u,onEscape:()=>u.value=!1},{isVisible:l,onEscape:()=>l.value=!1}]),(a,e)=>{var h;return i(),f("div",null,[E(U,null,{default:O(()=>[t(b)&&!u.value?(i(),f("div",ue,[e[4]||(e[4]=n("i",{class:"bi bi-exclamation-triangle-fill me-2"},null,-1)),D(" "+m(t(g)(t(b)))+" ",1),n("button",{type:"button",class:"btn-close","aria-label":"Close",onClick:e[0]||(e[0]=r=>t($).reset())})])):y("",!0),t(q)&&!l.value?(i(),f("div",le,[e[5]||(e[5]=n("i",{class:"bi bi-exclamation-triangle-fill me-2"},null,-1)),D(" "+m(t(g)(t(q)))+" ",1),n("button",{type:"button",class:"btn-close","aria-label":"Close",onClick:e[1]||(e[1]=r=>t(N).reset())})])):y("",!0),n("div",ne,[n("div",re,[n("h5",ie,m(t(c).length)+" Queue"+m(t(c).length!==1?"s":""),1)]),n("div",oe,[(i(!0),f(Z,null,ee(t(c),r=>(i(),_(te,{key:`${r.ns}-${r.name}`,queue:r,onSelect:V,onDelete:A},null,8,["queue"]))),128))])])]),_:1}),E(W,{"is-visible":u.value,"is-creating":t(Q),"create-error":t(b)?`${(h=t(g)(t(b)))==null?void 0:h.message}`:"",onClose:e[2]||(e[2]=r=>u.value=!1),onCreate:B},null,8,["is-visible","is-creating","create-error"]),l.value&&o.value?(i(),_(X,{key:0,"is-visible":l.value,"is-deleting":t(L),queue:o.value,onCancel:e[3]||(e[3]=r=>l.value=!1),onConfirm:H},null,8,["is-visible","is-deleting","queue"])):y("",!0)])}}}),ge=se(ve,[["__scopeId","data-v-f3ec936e"]]);export{ge as default};
1
+ import{d as I,u as R,a as j,b as G,c as K,e as Y,f as w,r as p,w as S,o as z,g as J,h as f,i as E,j as _,k as y,l as O,P as U,m as t,n as g,C as W,D as X,p as i,q as n,s as D,t as m,F as Z,v as ee,Q as te,x as ae,_ as se}from"./index-CRTYBxrI.js";const ue={key:0,class:"alert alert-warning alert-dismissible fade show mb-4",role:"alert"},le={key:1,class:"alert alert-warning alert-dismissible fade show mb-4",role:"alert"},ne={class:"queues-list-container"},re={class:"queues-list-header"},ie={class:"queues-count"},oe={class:"queues-list"},ce="Queues",de="Manage all available message queues",ve=I({__name:"QueuesView",setup(be){const k=ae(),s=R(),M=j(),{sortedQueues:c,isLoadingQueues:d,queuesError:C,refetchQueues:v}=G(),{createQueue:x,isCreatingQueue:Q,createQueueError:b,createQueueMutation:$}=K(async()=>{await v()}),{deleteQueue:F,isDeletingQueue:L,deleteQueueError:q,deleteQueueMutation:N}=Y(async()=>{await v()}),P=w(()=>c.value.length>0),u=p(!1),l=p(!1),o=p(null),T=w(()=>[{id:"refresh-queues",label:"Refresh",icon:"bi bi-arrow-clockwise",variant:"secondary",disabled:d.value,loading:d.value,handler:()=>v()},{id:"create-queue",label:"Create Queue",icon:"bi bi-plus-circle",variant:"primary",disabled:Q.value,loading:Q.value,handler:()=>u.value=!0}]);function V(a,e){k.push({name:"Queue",params:{ns:a,queue:e}})}async function B(a){try{const e={queue:{ns:a.ns,name:a.name},queueType:a.type,queueDeliveryModel:a.deliveryModel};await x({data:e}),u.value=!1}catch(e){console.error("Failed to create queue:",e)}}function A(a,e){o.value={ns:a,name:e},l.value=!0}async function H(){if(o.value)try{await F(o.value),l.value=!1}catch(a){console.error("Failed to delete queue:",a)}}return S(()=>{s.setPageHeader({title:ce,subtitle:de,icon:"bi bi-card-list"}),s.setPageActions(T.value),s.setLoadingState(d.value),C.value?(s.setErrorState(g(C.value)),s.setEmptyState(!1)):!d.value&&!P.value?(s.setErrorState(null),s.setEmptyState(!0,{icon:"bi bi-plus-square-dotted",title:"No Queues Found",message:"Get started by creating your first message queue.",actionLabel:"Create Your First Queue",actionHandler:()=>u.value=!0})):(s.setErrorState(null),s.setEmptyState(!1))}),S(()=>{M.clearSelectedQueue()}),z(()=>{v()}),J([{isVisible:u,onEscape:()=>u.value=!1},{isVisible:l,onEscape:()=>l.value=!1}]),(a,e)=>{var h;return i(),f("div",null,[E(U,null,{default:O(()=>[t(b)&&!u.value?(i(),f("div",ue,[e[4]||(e[4]=n("i",{class:"bi bi-exclamation-triangle-fill me-2"},null,-1)),D(" "+m(t(g)(t(b)))+" ",1),n("button",{type:"button",class:"btn-close","aria-label":"Close",onClick:e[0]||(e[0]=r=>t($).reset())})])):y("",!0),t(q)&&!l.value?(i(),f("div",le,[e[5]||(e[5]=n("i",{class:"bi bi-exclamation-triangle-fill me-2"},null,-1)),D(" "+m(t(g)(t(q)))+" ",1),n("button",{type:"button",class:"btn-close","aria-label":"Close",onClick:e[1]||(e[1]=r=>t(N).reset())})])):y("",!0),n("div",ne,[n("div",re,[n("h5",ie,m(t(c).length)+" Queue"+m(t(c).length!==1?"s":""),1)]),n("div",oe,[(i(!0),f(Z,null,ee(t(c),r=>(i(),_(te,{key:`${r.ns}-${r.name}`,queue:r,onSelect:V,onDelete:A},null,8,["queue"]))),128))])])]),_:1}),E(W,{"is-visible":u.value,"is-creating":t(Q),"create-error":t(b)?`${(h=t(g)(t(b)))==null?void 0:h.message}`:"",onClose:e[2]||(e[2]=r=>u.value=!1),onCreate:B},null,8,["is-visible","is-creating","create-error"]),l.value&&o.value?(i(),_(X,{key:0,"is-visible":l.value,"is-deleting":t(L),queue:o.value,onCancel:e[3]||(e[3]=r=>l.value=!1),onConfirm:H},null,8,["is-visible","is-deleting","queue"])):y("",!0)])}}}),ge=se(ve,[["__scopeId","data-v-f3ec936e"]]);export{ge as default};