-- helper methods def get_state_value(state, which) if not state return null end call get_var_from_state(state, which) then return it end def _set_sort_text(raw_value) call #sorteren-op.text(raw_value.trim()) end def initial_order() set order to input('order') if order set option_elt to data('order', {value: order})[0] call _set_sort_text(option_elt.text) add .is-active to option_elt else add .is-active to .default in #order-dropdown end end -- let op! behaviour != behavior! behavior LikeButton(item_id) on click set state to closest .edwh-state call get_state_value(state, "likes") then set like_setting to it if like_setting == "disabled" halt end set like_btn to .edwh-like-btn in me if like_btn.classList[0].contains('thumbs-UP') then set my toggle's value to 0 else set my toggle's value to 1 end send ew:submit -- ew:submit wordt 3x getriggerd om een of andere reden? om dubbele requests te voorkomen, maak de hx-trigger dus 'ew:submit throttle:500ms' end on htmx:afterRequest set like_btn to .edwh-like-btn in me set like_count to .edwh-like-count in me if detail.xhr.status == 200 then toggle .thumbs-UP on like_btn if like_btn.classList[0].contains('thumbs-UP') then increment like_count.innerText else decrement like_count.innerText end send ew:sent_like(id: item_id) to closest .edwh-messagebus else error 'something went wrong!' end end end behavior Auth on click -- custom: geen auth op slimfit -- todo: popup met 'liken kan op delen.meteddie.nl' halt end end behavior KvK on change set org to my value set kvk to 's @data-kvk set #input-kvk's value to kvk[0] end end behavior StateMachine(stickers) on ew:search_by_sticker from closest .edwh-messagebus set tag to event.detail.id if stickers is 'same' send ew:change_state(tag: tag, page: 1, options: {tag: 'add'}) end if stickers is 'new' call input("GHOST_BASE") -- open new tab with the url defined in -- and the sticker tag -- so e.g. https://delen.meteddie.nl/?tags=%5B"4cc54bf2-b7c8-415d-8938-7a47d9207439"%5D -- for the LOF sticker then call window.open(`${it}?tags=["${tag}"]`) end if no stickers or stickers is 'none' debug 'search by sticker ignored' end -- else: invalid arg for stickers, ignore return false end -- gebruik dit ew:change_state event om verschillende onderdelen van de state aan te passen, -- en daarna de tiles te herladen (m.b.v. ew:state_changed waar #tiles naar luistert). -- het kan de volgende opties aan: -- page: int, search: str, tag: gid, tags: list[gids], quick_filter: gid, order: str on ew:change_state from closest .edwh-messagebus set state to closest .edwh-state set bus to closest .edwh-messagebus if event.detail.page set my page.value to event.detail.page end if event.detail.quickfilter != undefined send ew:change_qf(tag: event.detail.quickfilter) to bus end set tag to event.detail.tag if tag != undefined -- change_state(tag: gid) is used to toggle 1 tag call toggle_tag(tag, id of state, event.detail.options.tag) then if it is false -- removed tag set qf to my qf's value if qf is tag -- qf removed from tags -> deselect send ew:change_qf(tag: '') to bus end end end if event.detail.tags != undefined -- change_state(tags: list[gid]) is used to replace the tags call JSON.stringify(event.detail.tags) then set state's tags.value to it end if event.detail.order != undefined send ew:change_order(order: event.detail.order) to bus end if event.detail.search != undefined send ew:search_entered(q: event.detail.search) to bus -- reset qf/filters: send ew:change_qf(tag: '') to bus end send ew:state_changed to bus end end behavior StateToURL on ew:state_changed from closest .edwh-messagebus -- sla de nieuwe state op in de URL zodat reload hetzelfde resultaat oplevert als de user nu ziet call state_to_url(closest .edwh-state to me) end end behavior TriggerCheck -- als er niet binnen 1 seconde na de state_changed een beforeRequest -- is aangemaakt, is de hx-trigger dus niet goed ontvangen. -- in dat geval sturen we een nieuw event (na een timeoutje) om hopelijk de trigger wel werkend te krijgen. on htmx:beforeRequest set me@data-success to true end on ew:state_changed from closest .edwh-messagebus wait 500ms -- wait is nodig voor twee redenen: -- 1. heel soms wordt beforeRequest vlak na state_changed verstuurd, dus daar willen we op wachten -- 2. anders kunnen we geen nieuw event versturen (want die wordt dan ook genegeerd) if me@data-success then -- geen enkel probleem, beforeRequest is afgegaan halt else -- geen before request -> hx-trigger is kapot -- try again: send ew:state_changed to closest .edwh-messagebus end set me@data-success to false end end behavior CloseModal on click call modal(closest .modal) end end behavior Sticker(id) on click halt the event send ew:search_by_sticker(id: id) to closest .edwh-messagebus end end def change_page(pagebutton, page_num) if pagebutton@disabled == null -- if disabled is null, the attribute does not exist -> it is enabled -- called from the loaded fragment's forward and backward buttons -- go to the top of (closest .edwh-state to pagebutton) go to top of #scroll-to-top -- <- customized, default is 'body' send ew:change_state(page: page_num) to closest .edwh-messagebus to pagebutton end end behavior Search(default) init if no default set the default to "" end on submit halt the event set query to my q.value if #state -- 1 state -> search on that page. Multiple (#state-1, #state-2, ...)/no states -> search on default then send ew:change_state(page: 1, search: query) to closest .edwh-messagebus else set location.href to `/${default}?q=${query}` end end end behavior SearchInput on ew:search_entered from closest .edwh-messagebus set my value to event.detail.q -- update input -- this input is the hidden state field, it is entered by the user somewhere else (#qform_q) end end behavior Filters -- zodra ew:filters_changed wordt geraised worden de juiste dropdown-keuzes active gemaakt op basis van de huidige state on ew:filters_changed from closest .edwh-messagebus call activate_filters(id of closest .edwh-state) -- zodra dit element ingeladen is wordt de juiste 'sorteren op' en de juiste filters op is-active gezet -- moet nog los van state_changed want dat kan gebeuren voor dit element is ingeladen! on htmx:afterSettle send ew:filters_changed to closest .edwh-messagebus call initial_order() end -- na tiles reload, zet ook de juiste filters op active on ew:state_changed from closest .edwh-messagebus send ew:filters_changed to closest .edwh-messagebus end end behavior OrderInput on ew:change_order from closest .edwh-messagebus set my value to event.detail.order send ew:order_changed(order: event.detail.order) to closest .edwh-messagebus end -- on ew:history_recovered_for_order from closest .edwh-messagebus -- call initial_order(event.detail.value) -- end end behavior QuickFilterButton on click -- stuur quick filter event naar de messagebus, om later te herbruiken -- hergebruik is hieronder bij de toggle .is-active bijvoorbeeld send ew:change_state(quickfilter: me@data-tag-gid, page: 1) to closest .edwh-messagebus end on ew:state_changed from closest .edwh-messagebus set taggid to me@data-tag-gid set state to closest .edwh-state if state's qf.value is taggid add .is-active to me else remove .is-active from me end end end behavior QuickFilterInput on ew:change_qf from closest .edwh-messagebus set state to closest .edwh-state set taggid to event.detail.tag -- verwijder de oude quick filter uit de tags en zet de nieuwe er in call toggle_qf(state's qf.value, taggid) then set state's tags.value to it -- update de state form (en dus URL) met de nieuwe quick filter set my value to taggid end end behavior PasswordConfirm(password_feedback_element, not_required) on change set p_one to my password's value set p_two to my _password's value if p_one and p_two and p_one != p_two then set password_feedback_element's innerText to 'Wachtwoorden verschillen!' set my passwordsmatch.checked to false else if p_one and p_two and p_one == p_two then set password_feedback_element's innerText to '' set my passwordsmatch.checked to true else if not_required and p_one and not p_two then set password_feedback_element's innerText to '' set my passwordsmatch.checked to false end -- else if end -- else if end -- if end -- on end -- behavior -- ja man leuke taal, handmatig 'end' goed moeten afsluiten omdat de volgende behaviors anders niet werken -.- behavior ToggleIcon(before, after) on click call toggle_classes(first (.edwh-fa in me), before, after) end end -- handig om te kijken of er een behavior hier boven stuk is gegaan: behavior Test init debug 'test debug' log 'test log' info 'test info' warn 'test warn' error 'test error' end end -- bijv _("install Test") behavior ScrollListener on scroll from document debounced at 250ms set n to document.documentElement.scrollTop if n > 1000 set dh to document.body.clientHeight -- set localStorage.px to n -- set localStorage.h to dh set base to window.location.pathname call localStorage.setItem('lastpage', base) call localStorage.setItem(`pxh::${base}`, n/dh) -- werkt niet: -- set localStorage[:key] to (n/dh) end end end -- behavior behavior versieCheck init set :target to #versiemodal if sessionStorage['versie'] == 'docenten' set my @href to '/docenten' set .themamenu's @href to '/docenten/#wat%20kun%20jij%20doen' else if sessionStorage['versie'] == 'schoolleiders' set my @href to '/schoolleiders' set .themamenu's @href to '/schoolleiders/#wat%20kun%20jij%20doen' else send ew:versie_check_open end -- elseif end -- else end on ew:versie_check_open add .is-clipped to
remove .is-hidden from the first in :target add .is-active to :target end on ew:versie_check_close remove .is-clipped from