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 @@ + + + + + + + + + + + Close + + + + 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 @@ + + + + + + { + const originalEvent = event.detail.originalEvent; + const target = originalEvent.target; + if ( + originalEvent.offsetX > target.clientWidth || + originalEvent.offsetY > target.clientHeight + ) { + event.preventDefault(); + } + } + " + > + + + + + Close + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + {{ day }} + + + + + + + + + + + + + + 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 @@ + + + + + + {{ headingValue }} + + + 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 @@ + + + + + + + + LOA Policy + + + Policy goes here. + + + + + + + + + + + + No results + + + + {{ member.member_name }} + + + + + + + + + + + + + + + {{ df.format(value.start.toDate(getLocalTimeZone())) }} - {{ + df.format(value.end.toDate(getLocalTimeZone())) }} + + + {{ df.format(value.start.toDate(getLocalTimeZone())) }} + + + + Pick a date + + + + + value.start = startDate" /> + + + + + + Submit + + + + \ No newline at end of file diff --git a/ui/src/router/index.js b/ui/src/router/index.js index 86493cd..272915b 100644 --- a/ui/src/router/index.js +++ b/ui/src/router/index.js @@ -3,6 +3,7 @@ import ManageApplications from '@/pages/ManageApplications.vue' import Application from '@/pages/Application.vue' import RankChange from '@/pages/RankChange.vue' import MemberList from '@/pages/memberList.vue' +import LOA from '@/pages/LOA.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -10,7 +11,8 @@ const router = createRouter({ { path: '/applications', component: ManageApplications }, { path: '/applications/:id', component: Application }, { path: '/changeRank', component: RankChange }, - { path: '/members', component: MemberList} + { path: '/members', component: MemberList}, + { path: '/loa', component: LOA} ] })
+ LOA Policy +
+ Policy goes here. +