From 303b72a1601024a670add188cdd4c769f4096e1e Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Mon, 15 Sep 2025 18:32:20 -0400 Subject: [PATCH] LOA UI completed (without integration) --- api/routes/loa.js | 12 ++ api/routes/ranks.js | 8 +- ui/src/components/ui/dialog/Dialog.vue | 18 +++ ui/src/components/ui/dialog/DialogClose.vue | 14 ++ ui/src/components/ui/dialog/DialogContent.vue | 57 ++++++++ .../ui/dialog/DialogDescription.vue | 25 ++++ ui/src/components/ui/dialog/DialogFooter.vue | 18 +++ ui/src/components/ui/dialog/DialogHeader.vue | 16 +++ ui/src/components/ui/dialog/DialogOverlay.vue | 29 +++++ .../ui/dialog/DialogScrollContent.vue | 71 ++++++++++ ui/src/components/ui/dialog/DialogTitle.vue | 25 ++++ ui/src/components/ui/dialog/DialogTrigger.vue | 14 ++ ui/src/components/ui/dialog/index.js | 10 ++ ui/src/components/ui/popover/Popover.vue | 18 +++ .../components/ui/popover/PopoverAnchor.vue | 15 +++ .../components/ui/popover/PopoverContent.vue | 63 +++++++++ .../components/ui/popover/PopoverTrigger.vue | 14 ++ ui/src/components/ui/popover/index.js | 4 + .../ui/range-calendar/RangeCalendar.vue | 107 +++++++++++++++ .../ui/range-calendar/RangeCalendarCell.vue | 31 +++++ .../RangeCalendarCellTrigger.vue | 45 +++++++ .../ui/range-calendar/RangeCalendarGrid.vue | 25 ++++ .../range-calendar/RangeCalendarGridBody.vue | 14 ++ .../range-calendar/RangeCalendarGridHead.vue | 14 ++ .../range-calendar/RangeCalendarGridRow.vue | 25 ++++ .../range-calendar/RangeCalendarHeadCell.vue | 30 +++++ .../ui/range-calendar/RangeCalendarHeader.vue | 27 ++++ .../range-calendar/RangeCalendarHeading.vue | 30 +++++ .../RangeCalendarNextButton.vue | 37 ++++++ .../RangeCalendarPrevButton.vue | 37 ++++++ ui/src/components/ui/range-calendar/index.js | 12 ++ ui/src/pages/LOA.vue | 122 ++++++++++++++++++ ui/src/router/index.js | 4 +- 33 files changed, 984 insertions(+), 7 deletions(-) create mode 100644 api/routes/loa.js create mode 100644 ui/src/components/ui/dialog/Dialog.vue create mode 100644 ui/src/components/ui/dialog/DialogClose.vue create mode 100644 ui/src/components/ui/dialog/DialogContent.vue create mode 100644 ui/src/components/ui/dialog/DialogDescription.vue create mode 100644 ui/src/components/ui/dialog/DialogFooter.vue create mode 100644 ui/src/components/ui/dialog/DialogHeader.vue create mode 100644 ui/src/components/ui/dialog/DialogOverlay.vue create mode 100644 ui/src/components/ui/dialog/DialogScrollContent.vue create mode 100644 ui/src/components/ui/dialog/DialogTitle.vue create mode 100644 ui/src/components/ui/dialog/DialogTrigger.vue create mode 100644 ui/src/components/ui/dialog/index.js create mode 100644 ui/src/components/ui/popover/Popover.vue create mode 100644 ui/src/components/ui/popover/PopoverAnchor.vue create mode 100644 ui/src/components/ui/popover/PopoverContent.vue create mode 100644 ui/src/components/ui/popover/PopoverTrigger.vue create mode 100644 ui/src/components/ui/popover/index.js create mode 100644 ui/src/components/ui/range-calendar/RangeCalendar.vue create mode 100644 ui/src/components/ui/range-calendar/RangeCalendarCell.vue create mode 100644 ui/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue create mode 100644 ui/src/components/ui/range-calendar/RangeCalendarGrid.vue create mode 100644 ui/src/components/ui/range-calendar/RangeCalendarGridBody.vue create mode 100644 ui/src/components/ui/range-calendar/RangeCalendarGridHead.vue create mode 100644 ui/src/components/ui/range-calendar/RangeCalendarGridRow.vue create mode 100644 ui/src/components/ui/range-calendar/RangeCalendarHeadCell.vue create mode 100644 ui/src/components/ui/range-calendar/RangeCalendarHeader.vue create mode 100644 ui/src/components/ui/range-calendar/RangeCalendarHeading.vue create mode 100644 ui/src/components/ui/range-calendar/RangeCalendarNextButton.vue create mode 100644 ui/src/components/ui/range-calendar/RangeCalendarPrevButton.vue create mode 100644 ui/src/components/ui/range-calendar/index.js create mode 100644 ui/src/pages/LOA.vue diff --git a/api/routes/loa.js b/api/routes/loa.js new file mode 100644 index 0000000..f818368 --- /dev/null +++ b/api/routes/loa.js @@ -0,0 +1,12 @@ +const express = require('express'); +const router = express.Router(); + +// DB pool (same as used in api/index.js) +const pool = require('../db'); + +//post a new LOA +router.post("/", async (req, res) => { + +}) + +module.exports = router; diff --git a/api/routes/ranks.js b/api/routes/ranks.js index a674ac0..b26a859 100644 --- a/api/routes/ranks.js +++ b/api/routes/ranks.js @@ -4,12 +4,7 @@ const ur = express.Router(); const pool = require('../db'); -// Placeholder router for rank-related routes. -// Implement rank endpoints here, for example: -// router.get('/', async (req, res) => { /* ... */ }); -// router.post('/change', async (req, res) => { /* ... */ }); - -//insert a new latest role for a user +//insert a new latest rank for a user ur.post('/', async (req, res) => { try { const App = req.body?.App || {}; @@ -33,6 +28,7 @@ ur.post('/', async (req, res) => { } }); +//get all ranks r.get('/', async (req, res) => { try { const result = await pool.query('SELECT id, name, short_name, sort_id FROM ranks;'); diff --git a/ui/src/components/ui/dialog/Dialog.vue b/ui/src/components/ui/dialog/Dialog.vue new file mode 100644 index 0000000..c261c6f --- /dev/null +++ b/ui/src/components/ui/dialog/Dialog.vue @@ -0,0 +1,18 @@ + + + diff --git a/ui/src/components/ui/dialog/DialogClose.vue b/ui/src/components/ui/dialog/DialogClose.vue new file mode 100644 index 0000000..b0058f9 --- /dev/null +++ b/ui/src/components/ui/dialog/DialogClose.vue @@ -0,0 +1,14 @@ + + + diff --git a/ui/src/components/ui/dialog/DialogContent.vue b/ui/src/components/ui/dialog/DialogContent.vue new file mode 100644 index 0000000..9062dd2 --- /dev/null +++ b/ui/src/components/ui/dialog/DialogContent.vue @@ -0,0 +1,57 @@ + + + diff --git a/ui/src/components/ui/dialog/DialogDescription.vue b/ui/src/components/ui/dialog/DialogDescription.vue new file mode 100644 index 0000000..bc80549 --- /dev/null +++ b/ui/src/components/ui/dialog/DialogDescription.vue @@ -0,0 +1,25 @@ + + + diff --git a/ui/src/components/ui/dialog/DialogFooter.vue b/ui/src/components/ui/dialog/DialogFooter.vue new file mode 100644 index 0000000..eee552a --- /dev/null +++ b/ui/src/components/ui/dialog/DialogFooter.vue @@ -0,0 +1,18 @@ + + + diff --git a/ui/src/components/ui/dialog/DialogHeader.vue b/ui/src/components/ui/dialog/DialogHeader.vue new file mode 100644 index 0000000..91194b0 --- /dev/null +++ b/ui/src/components/ui/dialog/DialogHeader.vue @@ -0,0 +1,16 @@ + + + diff --git a/ui/src/components/ui/dialog/DialogOverlay.vue b/ui/src/components/ui/dialog/DialogOverlay.vue new file mode 100644 index 0000000..2f80752 --- /dev/null +++ b/ui/src/components/ui/dialog/DialogOverlay.vue @@ -0,0 +1,29 @@ + + + diff --git a/ui/src/components/ui/dialog/DialogScrollContent.vue b/ui/src/components/ui/dialog/DialogScrollContent.vue new file mode 100644 index 0000000..c9fef6d --- /dev/null +++ b/ui/src/components/ui/dialog/DialogScrollContent.vue @@ -0,0 +1,71 @@ + + + diff --git a/ui/src/components/ui/dialog/DialogTitle.vue b/ui/src/components/ui/dialog/DialogTitle.vue new file mode 100644 index 0000000..ba0c1ab --- /dev/null +++ b/ui/src/components/ui/dialog/DialogTitle.vue @@ -0,0 +1,25 @@ + + + diff --git a/ui/src/components/ui/dialog/DialogTrigger.vue b/ui/src/components/ui/dialog/DialogTrigger.vue new file mode 100644 index 0000000..e276c66 --- /dev/null +++ b/ui/src/components/ui/dialog/DialogTrigger.vue @@ -0,0 +1,14 @@ + + + diff --git a/ui/src/components/ui/dialog/index.js b/ui/src/components/ui/dialog/index.js new file mode 100644 index 0000000..6c411de --- /dev/null +++ b/ui/src/components/ui/dialog/index.js @@ -0,0 +1,10 @@ +export { default as Dialog } from "./Dialog.vue"; +export { default as DialogClose } from "./DialogClose.vue"; +export { default as DialogContent } from "./DialogContent.vue"; +export { default as DialogDescription } from "./DialogDescription.vue"; +export { default as DialogFooter } from "./DialogFooter.vue"; +export { default as DialogHeader } from "./DialogHeader.vue"; +export { default as DialogOverlay } from "./DialogOverlay.vue"; +export { default as DialogScrollContent } from "./DialogScrollContent.vue"; +export { default as DialogTitle } from "./DialogTitle.vue"; +export { default as DialogTrigger } from "./DialogTrigger.vue"; diff --git a/ui/src/components/ui/popover/Popover.vue b/ui/src/components/ui/popover/Popover.vue new file mode 100644 index 0000000..ef3a0d2 --- /dev/null +++ b/ui/src/components/ui/popover/Popover.vue @@ -0,0 +1,18 @@ + + + diff --git a/ui/src/components/ui/popover/PopoverAnchor.vue b/ui/src/components/ui/popover/PopoverAnchor.vue new file mode 100644 index 0000000..9f29554 --- /dev/null +++ b/ui/src/components/ui/popover/PopoverAnchor.vue @@ -0,0 +1,15 @@ + + + diff --git a/ui/src/components/ui/popover/PopoverContent.vue b/ui/src/components/ui/popover/PopoverContent.vue new file mode 100644 index 0000000..20e002f --- /dev/null +++ b/ui/src/components/ui/popover/PopoverContent.vue @@ -0,0 +1,63 @@ + + + diff --git a/ui/src/components/ui/popover/PopoverTrigger.vue b/ui/src/components/ui/popover/PopoverTrigger.vue new file mode 100644 index 0000000..1bd06f0 --- /dev/null +++ b/ui/src/components/ui/popover/PopoverTrigger.vue @@ -0,0 +1,14 @@ + + + diff --git a/ui/src/components/ui/popover/index.js b/ui/src/components/ui/popover/index.js new file mode 100644 index 0000000..94275eb --- /dev/null +++ b/ui/src/components/ui/popover/index.js @@ -0,0 +1,4 @@ +export { default as Popover } from "./Popover.vue"; +export { default as PopoverAnchor } from "./PopoverAnchor.vue"; +export { default as PopoverContent } from "./PopoverContent.vue"; +export { default as PopoverTrigger } from "./PopoverTrigger.vue"; diff --git a/ui/src/components/ui/range-calendar/RangeCalendar.vue b/ui/src/components/ui/range-calendar/RangeCalendar.vue new file mode 100644 index 0000000..a0e3e3c --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendar.vue @@ -0,0 +1,107 @@ + + + diff --git a/ui/src/components/ui/range-calendar/RangeCalendarCell.vue b/ui/src/components/ui/range-calendar/RangeCalendarCell.vue new file mode 100644 index 0000000..a6b5ea6 --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendarCell.vue @@ -0,0 +1,31 @@ + + + diff --git a/ui/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue b/ui/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue new file mode 100644 index 0000000..0e87869 --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendarCellTrigger.vue @@ -0,0 +1,45 @@ + + + diff --git a/ui/src/components/ui/range-calendar/RangeCalendarGrid.vue b/ui/src/components/ui/range-calendar/RangeCalendarGrid.vue new file mode 100644 index 0000000..99d4568 --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendarGrid.vue @@ -0,0 +1,25 @@ + + + diff --git a/ui/src/components/ui/range-calendar/RangeCalendarGridBody.vue b/ui/src/components/ui/range-calendar/RangeCalendarGridBody.vue new file mode 100644 index 0000000..3cad096 --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendarGridBody.vue @@ -0,0 +1,14 @@ + + + diff --git a/ui/src/components/ui/range-calendar/RangeCalendarGridHead.vue b/ui/src/components/ui/range-calendar/RangeCalendarGridHead.vue new file mode 100644 index 0000000..cb2f706 --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendarGridHead.vue @@ -0,0 +1,14 @@ + + + diff --git a/ui/src/components/ui/range-calendar/RangeCalendarGridRow.vue b/ui/src/components/ui/range-calendar/RangeCalendarGridRow.vue new file mode 100644 index 0000000..d1c3068 --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendarGridRow.vue @@ -0,0 +1,25 @@ + + + diff --git a/ui/src/components/ui/range-calendar/RangeCalendarHeadCell.vue b/ui/src/components/ui/range-calendar/RangeCalendarHeadCell.vue new file mode 100644 index 0000000..6416009 --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendarHeadCell.vue @@ -0,0 +1,30 @@ + + + diff --git a/ui/src/components/ui/range-calendar/RangeCalendarHeader.vue b/ui/src/components/ui/range-calendar/RangeCalendarHeader.vue new file mode 100644 index 0000000..03de664 --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendarHeader.vue @@ -0,0 +1,27 @@ + + + diff --git a/ui/src/components/ui/range-calendar/RangeCalendarHeading.vue b/ui/src/components/ui/range-calendar/RangeCalendarHeading.vue new file mode 100644 index 0000000..601e4f5 --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendarHeading.vue @@ -0,0 +1,30 @@ + + + diff --git a/ui/src/components/ui/range-calendar/RangeCalendarNextButton.vue b/ui/src/components/ui/range-calendar/RangeCalendarNextButton.vue new file mode 100644 index 0000000..fe4f94b --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendarNextButton.vue @@ -0,0 +1,37 @@ + + + diff --git a/ui/src/components/ui/range-calendar/RangeCalendarPrevButton.vue b/ui/src/components/ui/range-calendar/RangeCalendarPrevButton.vue new file mode 100644 index 0000000..5af251f --- /dev/null +++ b/ui/src/components/ui/range-calendar/RangeCalendarPrevButton.vue @@ -0,0 +1,37 @@ + + + diff --git a/ui/src/components/ui/range-calendar/index.js b/ui/src/components/ui/range-calendar/index.js new file mode 100644 index 0000000..c7b3c6c --- /dev/null +++ b/ui/src/components/ui/range-calendar/index.js @@ -0,0 +1,12 @@ +export { default as RangeCalendar } from "./RangeCalendar.vue"; +export { default as RangeCalendarCell } from "./RangeCalendarCell.vue"; +export { default as RangeCalendarCellTrigger } from "./RangeCalendarCellTrigger.vue"; +export { default as RangeCalendarGrid } from "./RangeCalendarGrid.vue"; +export { default as RangeCalendarGridBody } from "./RangeCalendarGridBody.vue"; +export { default as RangeCalendarGridHead } from "./RangeCalendarGridHead.vue"; +export { default as RangeCalendarGridRow } from "./RangeCalendarGridRow.vue"; +export { default as RangeCalendarHeadCell } from "./RangeCalendarHeadCell.vue"; +export { default as RangeCalendarHeader } from "./RangeCalendarHeader.vue"; +export { default as RangeCalendarHeading } from "./RangeCalendarHeading.vue"; +export { default as RangeCalendarNextButton } from "./RangeCalendarNextButton.vue"; +export { default as RangeCalendarPrevButton } from "./RangeCalendarPrevButton.vue"; diff --git a/ui/src/pages/LOA.vue b/ui/src/pages/LOA.vue new file mode 100644 index 0000000..2225ab0 --- /dev/null +++ b/ui/src/pages/LOA.vue @@ -0,0 +1,122 @@ + + +