diff --git a/app/Conductors/Conductor.php b/app/Conductors/Conductor.php index d6798da..4159a82 100644 --- a/app/Conductors/Conductor.php +++ b/app/Conductors/Conductor.php @@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Str; class Conductor @@ -552,19 +553,35 @@ class Conductor } else { $limitFields = array_map('strtolower', $limitFields); } - $tokens = preg_split('/([()]|,OR,|,AND,|,)/', $filterString, -1, (PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)); $glued = []; $glueToken = ''; foreach ($tokens as $item) { if ($glueToken === '') { - if (preg_match('/(? 0) { + $glueToken = $matches[0][0][0]; + if ($amount === 1) { + $item = substr($item, 0, $matches[0][1]) . substr($item, ($matches[0][1] + 1)); + $item = str_replace("\\$glueToken", $glueToken, $item); + $glued[] = $item; + } else { + $lastPos = 0; + $newStr = ''; + foreach ($matches[0] as $pos) { + $matchLen = strlen($glueToken); + $startPos = ($pos[1] - $lastPos); + $newStr .= substr($item, $lastPos, $startPos); + $lastPos = ($pos[1] + $matchLen); + } + $newStr .= substr($item, $lastPos); + $newStr = str_replace("\\$glueToken", $glueToken, $newStr); + $glued[] = $newStr; + $glueToken = ''; + } + } else { + $glued[] = $item; + }//end if } else { // search for ending glue token if (preg_match('/(?query->toSql()); } /** diff --git a/app/Conductors/EventConductor.php b/app/Conductors/EventConductor.php index 0b77877..c5a2666 100644 --- a/app/Conductors/EventConductor.php +++ b/app/Conductors/EventConductor.php @@ -24,7 +24,6 @@ class EventConductor extends Conductor /** * The included fields - * * @var string[] */ protected $includes = ['attachments']; @@ -101,7 +100,7 @@ class EventConductor extends Conductor /** * Include Attachments Field. - * + * * @param Model $model Them model. * @return mixed The model result. */ @@ -114,7 +113,7 @@ class EventConductor extends Conductor /** * Transform the Hero field. - * + * * @param mixed $value The current value. * @return array The new value. */ diff --git a/resources/js/components/SMInput.vue b/resources/js/components/SMInput.vue index f2ee6fa..ddd05c5 100644 --- a/resources/js/components/SMInput.vue +++ b/resources/js/components/SMInput.vue @@ -48,6 +48,19 @@ @input="handleInput" @keyup="handleKeyup"> + + + + + {{ option[1] }} + + + { padding: 15px 30px; width: auto; } + + .select-dropdown-icon { + position: absolute; + top: 50%; + right: 0; + transform: translate(-50%, -50%); + font-size: 110%; + } + + .select-input-control { + appearance: none; + width: 100%; + padding: 22px 16px 8px 16px; + border: 1px solid var(--base-color-darker); + border-radius: 8px; + background-color: var(--base-color-light); + height: 52px; + } } } @@ -466,10 +502,4 @@ const handleChange = (event) => { } } } - -@media only screen and (max-width: 768px) { - .control-group.control-type-input { - // width: 100%; - } -} diff --git a/resources/js/helpers/api.types.ts b/resources/js/helpers/api.types.ts index 8d8079b..339fa2c 100644 --- a/resources/js/helpers/api.types.ts +++ b/resources/js/helpers/api.types.ts @@ -14,6 +14,8 @@ export interface Event { price: string; ages: string; attachments: Array; + created_at: string; + updated_at: string; } export interface EventResponse { diff --git a/resources/js/views/Workshops.vue b/resources/js/views/Workshops.vue index fb96ffe..6f0bbdd 100644 --- a/resources/js/views/Workshops.vue +++ b/resources/js/views/Workshops.vue @@ -5,17 +5,20 @@ + @blur="handleFilter" + @keyup.enter="handleFilter" /> + @blur="handleFilter" + @keyup.enter="handleFilter" /> + @blur="handleFilter" + @keyup.enter="handleFilter" /> { (title:""cats, dogs", mice",OR,content:"\"cats, dogs\", mice") */ + query["filter"] = []; if (filterKeywords.value && filterKeywords.value.length > 0) { let value = filterKeywords.value.replace(/"/g, '\\"'); - query["filter"] = `(title:"${value}",OR,content:"${value}")`; + query["filter"].push(`(title:"${value}",OR,content:"${value}")`); } if (filterLocation.value && filterLocation.value.length > 0) { - query["location"] = filterLocation.value; + let value = filterLocation.value.replace(/"/g, '\\"'); + + query["filter"].push(`(location:"${value}",OR,address:"${value}")`); } if (filterDateRange.value && filterDateRange.value.length > 0) { let error = false; @@ -167,6 +173,12 @@ const handleLoad = async () => { formMessage.value = ""; events = []; + if (query["filter"].length > 0) { + query["filter"] = query["filter"].join(",AND,"); + } else { + delete query["filter"]; + } + if (Object.keys(query).length == 0) { const now = new Date(); const startingDate = new Date(now.setDate(now.getDate() - 14)); @@ -181,6 +193,8 @@ const handleLoad = async () => { query["limit"] = postsPerPage; query["page"] = postsPage.value; + console.log(query); + let result = await api.get({ url: "/events", params: query, @@ -330,6 +344,10 @@ const computedAges = (ages: string): string => { const trimmed = ages.trim(); const regex = /^(\d+)(\s*\+?\s*|\s*-\s*\d+\s*)?$/; + if (trimmed.length === 0) { + return "All ages"; + } + if (regex.test(trimmed)) { return `Ages ${trimmed}`; } diff --git a/resources/js/views/dashboard/EventEdit.vue b/resources/js/views/dashboard/EventEdit.vue index b811549..c5d8da4 100644 --- a/resources/js/views/dashboard/EventEdit.vue +++ b/resources/js/views/dashboard/EventEdit.vue @@ -1,11 +1,13 @@ - - - {{ page_title }} + + + + @@ -122,7 +124,7 @@ - + @@ -149,11 +151,16 @@ import SMInputAttachments from "../../components/SMInputAttachments.vue"; import SMForm from "../../components/SMForm.vue"; import { EventResponse } from "../../helpers/api.types"; import { useToastStore } from "../../store/ToastStore"; +import SMMastHead from "../../components/SMMastHead.vue"; +import SMLoading from "../../components/SMLoading.vue"; const route = useRoute(); const router = useRouter(); -const page_title = route.params.id ? "Edit Event" : "Create New Event"; + const pageError = ref(200); +const pageLoading = ref(true); +const pageHeading = route.params.id ? "Edit Event" : "Create Event"; + const attachments = ref([]); const address_data = computed(() => { @@ -259,7 +266,7 @@ let form = reactive( const loadData = async () => { if (route.params.id) { try { - form.loading(true); + pageLoading.value = true; const result = await api.get({ url: "/events/{id}", @@ -308,7 +315,7 @@ const loadData = async () => { } catch (err) { pageError.value = err.response.status; } finally { - form.loading(false); + pageLoading.value = false; } } }; @@ -380,8 +387,11 @@ const handleSubmit = async () => { router.push({ name: "dashboard-event-list" }); } catch (error) { - handleFailValidation(); - form.apiErrors(error); + useToastStore().addToast({ + title: "Server error", + content: "An error occurred saving the media.", + type: "danger", + }); } }; diff --git a/resources/js/views/dashboard/EventList.vue b/resources/js/views/dashboard/EventList.vue index a56447b..1545038 100644 --- a/resources/js/views/dashboard/EventList.vue +++ b/resources/js/views/dashboard/EventList.vue @@ -1,145 +1,156 @@ - - - - + + + - - - - - - + + + + + + - - - - - - - {{ item.title }} - - - + + + + + + {{ parseEventLocation(item) }} + + - - - - + size="medium" + @click=" + handleActionButton(item, $event) + "> + + + + - + diff --git a/resources/js/views/dashboard/MediaEdit.vue b/resources/js/views/dashboard/MediaEdit.vue index d750254..eb51d8f 100644 --- a/resources/js/views/dashboard/MediaEdit.vue +++ b/resources/js/views/dashboard/MediaEdit.vue @@ -6,7 +6,11 @@ back-title="Back to Media" /> - + @@ -226,7 +230,6 @@ const handleSubmit = async () => { router.push({ name: "dashboard-media-list" }); } catch (error) { - console.log(error); useToastStore().addToast({ title: "Server error", content: "An error occurred saving the media.", @@ -237,6 +240,15 @@ const handleSubmit = async () => { } }; +const handleFailValidation = () => { + useToastStore().addToast({ + title: "Save Error", + content: + "There are some errors in the form. Fix these before continuing.", + type: "danger", + }); +}; + const handleDelete = async () => { let result = await openDialog(DialogConfirm, { title: "Delete File?", diff --git a/resources/js/views/dashboard/MediaList.vue b/resources/js/views/dashboard/MediaList.vue index f785787..e6dad97 100644 --- a/resources/js/views/dashboard/MediaList.vue +++ b/resources/js/views/dashboard/MediaList.vue @@ -1,62 +1,66 @@ - - - - - - - - - - - - - - - - - {{ bytesReadable(item.size) }} - - {{ item.title }}({{ item.name }}) - - - - - - + + + + + + + + + + + + + + + + + + {{ bytesReadable(item.size) }} + + {{ item.title }}({{ item.name }}) + + + + + + +