From ccc30a8b7a7ddc1efb2b08e31f6e19afdde33bf2 Mon Sep 17 00:00:00 2001 From: James Collins Date: Mon, 20 Feb 2023 10:20:12 +1000 Subject: [PATCH] updates --- app/Filters/FilterAbstract.php | 5 +- app/Filters/UserFilter.php | 5 +- resources/js/components/SMButton.vue | 42 +- resources/js/components/SMCarousel.vue | 4 +- resources/js/components/SMCarouselSlide.vue | 23 +- resources/js/components/SMDialog.vue | 9 + resources/js/components/SMInput.vue | 8 +- resources/js/components/SMNavbar.vue | 4 +- resources/js/components/SMPage.vue | 11 +- resources/js/components/SMPanel.vue | 22 +- .../dialogs/SMDialogChangePassword.vue | 76 +- resources/js/helpers/api.ts | 4 +- resources/js/helpers/api.types.ts | 16 + resources/js/helpers/datetime.ts | 714 ++++++++++-------- resources/js/helpers/form.ts | 8 + resources/js/helpers/image.ts | 14 + resources/js/helpers/string.js | 5 +- resources/js/helpers/validate.ts | 75 +- resources/js/store/UserStore.ts | 20 +- resources/js/tests/datetime.test.ts | 33 + resources/js/tests/string.test.ts | 14 + resources/js/tests/validate.test.ts | 28 + resources/js/views/Home.vue | 44 +- resources/js/views/NewsList.vue | 7 +- resources/js/views/NewsView.vue | 58 +- resources/js/views/WorkshopList.vue | 239 +++--- resources/js/views/WorkshopView.vue | 130 +++- .../js/views/dashboard/DiscordBotLogs.vue | 4 +- resources/js/views/dashboard/EventEdit.vue | 36 +- resources/js/views/dashboard/MediaList.vue | 14 +- 30 files changed, 1026 insertions(+), 646 deletions(-) create mode 100644 resources/js/helpers/api.types.ts create mode 100644 resources/js/helpers/image.ts create mode 100644 resources/js/tests/datetime.test.ts create mode 100644 resources/js/tests/string.test.ts create mode 100644 resources/js/tests/validate.test.ts diff --git a/app/Filters/FilterAbstract.php b/app/Filters/FilterAbstract.php index ee93886..13d9e62 100644 --- a/app/Filters/FilterAbstract.php +++ b/app/Filters/FilterAbstract.php @@ -165,9 +165,10 @@ abstract class FilterAbstract * * @param array $attributes Attributes currently visible. * @param User|null $user Current logged in user or null. + * @param object $modelData Model data if a single object is requested. * @return mixed */ - protected function seeAttributes(array $attributes, mixed $user) + protected function seeAttributes(array $attributes, mixed $user, ?object $modelData = null) { return $attributes; } @@ -224,7 +225,7 @@ abstract class FilterAbstract } /* Run attribute modifiers*/ - $modifiedAttribs = $this->seeAttributes($attributes, $this->request->user()); + $modifiedAttribs = $this->seeAttributes($attributes, $this->request->user(), $model); if (is_array($modifiedAttribs) === true) { $attributes = $modifiedAttribs; } diff --git a/app/Filters/UserFilter.php b/app/Filters/UserFilter.php index 1aa5849..398969d 100644 --- a/app/Filters/UserFilter.php +++ b/app/Filters/UserFilter.php @@ -19,11 +19,12 @@ class UserFilter extends FilterAbstract * * @param array $attributes Attributes currently visible. * @param User|null $user Current logged in user or null. + * @param object $userData User model if single object is requested. * @return mixed */ - protected function seeAttributes(array $attributes, mixed $user) + protected function seeAttributes(array $attributes, mixed $user, ?object $userData = null) { - if ($user?->hasPermission('admin/users') !== true) { + if ($user?->hasPermission('admin/users') !== true && ($user === null || $userData === null || $user?->id !== $userData?->id)) { return ['id', 'username']; } } diff --git a/resources/js/components/SMButton.vue b/resources/js/components/SMButton.vue index 9eeb6dd..aae03c5 100644 --- a/resources/js/components/SMButton.vue +++ b/resources/js/components/SMButton.vue @@ -129,31 +129,31 @@ const handleClickItem = (item: string) => { vertical-align: middle; cursor: pointer; } + + ul { + position: absolute; + z-index: 1; + top: 100%; + left: 0; + list-style: none; + padding: 0; + margin: 0; + background-color: #f9f9f9; + border: 1px solid #ddd; + } + + li { + padding: 12px 16px; + cursor: pointer; + } + + li:hover { + background-color: #f1f1f1; + } } // New content here .dropdown { position: relative; } - -ul { - position: absolute; - z-index: 1; - top: 100%; - left: 0; - list-style: none; - padding: 0; - margin: 0; - background-color: #f9f9f9; - border: 1px solid #ddd; -} - -li { - padding: 12px 16px; - cursor: pointer; -} - -li:hover { - background-color: #f1f1f1; -} diff --git a/resources/js/components/SMCarousel.vue b/resources/js/components/SMCarousel.vue index 05b4e1d..a1a5549 100644 --- a/resources/js/components/SMCarousel.vue +++ b/resources/js/components/SMCarousel.vue @@ -56,7 +56,7 @@ const handleMouseLeave = () => { const handleSlidePrev = () => { if (currentSlide.value == 0) { - currentSlide.value = maxSlide; + currentSlide.value = maxSlide.value; } else { currentSlide.value--; } @@ -165,10 +165,12 @@ const disconnectMutationObserver = () => { .carousel-slide-prev { left: 1rem; + filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 1)); } .carousel-slide-next { right: 1rem; + filter: drop-shadow(0px 0px 2px rgba(0, 0, 0, 1)); } .carousel-slide-indicators { diff --git a/resources/js/components/SMCarouselSlide.vue b/resources/js/components/SMCarouselSlide.vue index 6433c64..5a29c20 100644 --- a/resources/js/components/SMCarouselSlide.vue +++ b/resources/js/components/SMCarouselSlide.vue @@ -22,6 +22,8 @@ @@ -54,6 +59,10 @@ defineProps({ min-width: map-get($spacer, 5) * 12; box-shadow: 4px 4px 20px rgba(0, 0, 0, 0.5); + &.dialog-noshadow { + box-shadow: none !important; + } + & > h1 { margin-top: 0; } diff --git a/resources/js/components/SMInput.vue b/resources/js/components/SMInput.vue index af9a690..ff3dba3 100644 --- a/resources/js/components/SMInput.vue +++ b/resources/js/components/SMInput.vue @@ -17,7 +17,8 @@ type == 'email' || type == 'password' || type == 'email' || - type == 'url' + type == 'url' || + type == 'daterange' " :type="type" :placeholder="placeholder" @@ -130,8 +131,8 @@ const objForm = inject("form", props.form); const objControl = !isEmpty(objForm) && props.control != "" ? objForm[props.control] : null; -const label = ref(""); -const feedbackInvalid = ref(""); +const label = ref(props.label); +const feedbackInvalid = ref(props.feedbackInvalid); watch( () => props.label, @@ -238,6 +239,7 @@ const inline = computed(() => { display: flex; flex-direction: column; margin-bottom: map-get($spacer, 4); + flex: 1; &.sm-input-active { label { diff --git a/resources/js/components/SMNavbar.vue b/resources/js/components/SMNavbar.vue index f18dadd..70528ec 100644 --- a/resources/js/components/SMNavbar.vue +++ b/resources/js/components/SMNavbar.vue @@ -73,7 +73,7 @@ const menuItems = [ name: "workshops", label: "Workshops", to: "/workshops", - icon: "shapes-outline", + icon: "library-outline", }, // { // name: "courses", @@ -107,7 +107,7 @@ const menuItems = [ name: "dashboard", label: "Dashboard", to: "/dashboard", - icon: "apps-outline", + icon: "grid-outline", show: () => userStore.id, inNav: false, }, diff --git a/resources/js/components/SMPage.vue b/resources/js/components/SMPage.vue index 82e00f4..53c22df 100644 --- a/resources/js/components/SMPage.vue +++ b/resources/js/components/SMPage.vue @@ -13,18 +13,23 @@ class="sm-page" :style="styleObject"> + @@ -168,6 +170,7 @@ onMounted(async () => { flex-direction: column; border: 1px solid $border-color; border-radius: 12px; + overflow: hidden; box-shadow: 0 0 28px rgba(0, 0, 0, 0.05); max-width: 21rem; width: 100%; @@ -227,6 +230,7 @@ onMounted(async () => { flex-direction: column; flex: 1; padding: 0 map-get($spacer, 3) map-get($spacer, 3) map-get($spacer, 3); + background-color: #fff; } .panel-title { @@ -241,7 +245,7 @@ onMounted(async () => { font-size: 80%; margin-bottom: 0.4rem; - svg { + ion-icon { flex: 0 1 1rem; margin-right: map-get($spacer, 1); padding-top: 0.1rem; diff --git a/resources/js/components/dialogs/SMDialogChangePassword.vue b/resources/js/components/dialogs/SMDialogChangePassword.vue index ecd8f2f..c49427e 100644 --- a/resources/js/components/dialogs/SMDialogChangePassword.vue +++ b/resources/js/components/dialogs/SMDialogChangePassword.vue @@ -2,36 +2,39 @@

Change Password

- - - - - - + + + + + + + +
diff --git a/resources/js/views/WorkshopView.vue b/resources/js/views/WorkshopView.vue index 6e70863..1c832df 100644 --- a/resources/js/views/WorkshopView.vue +++ b/resources/js/views/WorkshopView.vue @@ -1,14 +1,9 @@