Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Example for trigger rewrite #3

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# NPM and Webpack
node_modules
mix.webpack.js
assets/js/app.js.LICENSE.txt

# OS files
.DS_Store
Expand Down
1,467 changes: 1,466 additions & 1 deletion assets/css/theme.css

Large diffs are not rendered by default.

6,150 changes: 6,150 additions & 0 deletions assets/js/app.js

Large diffs are not rendered by default.

50 changes: 50 additions & 0 deletions assets/js/src/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import Snowboard from '../../../../../modules/system/assets/js/snowboard/main/Snowboard';
import ProxyHandler from '../../../../../modules/system/assets/js/snowboard/main/ProxyHandler';
import Request from '../../../../../modules/system/assets/js/snowboard/ajax/Request';
import AttributeRequest from '../../../../../modules/system/assets/js/snowboard/ajax/handlers/AttributeRequest';
import AssetLoader from '../../../../../modules/system/assets/js/snowboard/extras/AssetLoader';
import DataConfig from '../../../../../modules/system/assets/js/snowboard/extras/DataConfig';
import StylesheetLoader from '../../../../../modules/system/assets/js/snowboard/extras/StylesheetLoader';
import Transition from '../../../../../modules/system/assets/js/snowboard/extras/Transition';
import Flash from '../../../../../modules/system/assets/js/snowboard/extras/Flash';
import FlashListener from '../../../../../modules/system/assets/js/snowboard/extras/FlashListener';
import FormValidation from '../../../../../modules/system/assets/js/snowboard/extras/FormValidation';
import AttachLoading from '../../../../../modules/system/assets/js/snowboard/extras/AttachLoading';
import StripeLoader from '../../../../../modules/system/assets/js/snowboard/extras/StripeLoader';
import Trigger from '../../../../../modules/system/assets/js/snowboard/extras/Trigger';

((window) => {
const snowboard = new Proxy(
new Snowboard(true, true),
ProxyHandler,
);

// Cover all aliases
window.snowboard = snowboard;
window.Snowboard = snowboard;
window.SnowBoard = snowboard;

snowboard.addPlugin('request', Request);
snowboard.addPlugin('attributeRequest', AttributeRequest);
snowboard.addPlugin('assetLoader', AssetLoader);
snowboard.addPlugin('dataConfig', DataConfig);
snowboard.addPlugin('extrasStyles', StylesheetLoader);
snowboard.addPlugin('transition', Transition);
snowboard.addPlugin('flash', Flash);
snowboard.addPlugin('flashListener', FlashListener);
snowboard.addPlugin('formValidation', FormValidation);
snowboard.addPlugin('attachLoading', AttachLoading);
snowboard.addPlugin('stripeLoader', StripeLoader);
snowboard.addPlugin('trigger', Trigger);

snowboard.on('ready', () => {
// Scan for triggers
Array
.from(document.querySelectorAll('*'))
.filter((element) => [...element.attributes].filter(
({ name }) => name.startsWith("data-trigger-")).length > 0
).forEach((element) => {
snowboard.trigger(element);
});
});
})(window);
279 changes: 279 additions & 0 deletions pages/snowboard/triggers.htm
Original file line number Diff line number Diff line change
@@ -0,0 +1,279 @@
title = "Triggers | Snowboard"
url = "/snowboard/triggers"
layout = "snowboard"
==
<section id="body" class="py-20 flex-grow">
<div class="container max-w-screen-xl">
<div class="block lg:flex lg:flex-row divide-x divide-gray-100">
<div class="flew-grow-0 px-8 lg:w-2/12 xl:pr-0">
{% partial 'snowboard/sections-list' %}
</div>

<div class="flex-grow-0 px-8 mt-16 lg:w-10/12 lg:mt-0">
<h2>Triggers</h2>

<h3>Value / OneOf / AllOf</h3>

<!-- BEGIN Trigger on single value -->
<hr class="mb-8">

<h4 class="mb-0">Trigger on single value</h4>
<p>A message will appear when the field contains "trigger".</p>

<div class="grid grid-cols-2 gap-4 items-center" id="trigger-single-value">
<div>
<input
class="block w-full border border-amber-600 p-4 rounded"
type="text"
name="field"
placeholder="Field"
>
</div>
<div
class="inline-block mt-2 p-2 rounded-md text-white bg-green-800"
data-trigger-show="input[type=text]"
data-trigger-show-closest-parent="#trigger-single-value"
data-trigger-show-when="value[trigger]"
data-trigger-show-action="show"
>
Triggered!
</div>
</div>
<!-- END Trigger on single value -->

<!-- BEGIN Trigger on one of multiple values -->
<hr class="my-8">

<h4 class="mb-0">Trigger on one of multiple values</h4>
<p>A message will appear when the field contains one of the following values: "pizza", "burger", "hot dog".</p>

<div class="grid grid-cols-2 gap-4 items-center" id="trigger-one-of-multiple-values">
<div>
<input
class="block w-full border border-amber-600 p-4 rounded"
type="text"
name="field"
placeholder="Field"
value="pizza"
>
</div>
<div
class="inline-block mt-2 p-2 rounded-md text-white bg-green-800"
data-trigger-show="input[type=text]"
data-trigger-show-closest-parent="#trigger-one-of-multiple-values"
data-trigger-show-when="oneOf:pizza,burger,hot dog"
data-trigger-show-action="show"
>
Yum yum!
</div>
</div>
<!-- END Trigger on one of multiple values -->

<!-- BEGIN Trigger on all of multiple values -->
<hr class="my-8">

<h4 class="mb-0">Trigger on all of multiple values</h4>
<p>A message will when all checkboxes are ticked - each one being a number, and trigger expecting all numbers to be available. This
demonstrates triggers using multiple inputs to determine the success of a condition.</p>

<div class="grid grid-cols-2 gap-4 items-center" id="trigger-all-of-multiple-values">
<div>
<input
type="checkbox"
name="check1"
value="1"
>
<label for="check1">One</label>

<input
type="checkbox"
name="check2"
value="2"
>
<label for="check2">Two</label>

<input
type="checkbox"
name="check3"
value="3"
>
<label for="check3">Three</label>
</div>

<div
class="inline-block mt-2 p-2 rounded-md text-white bg-green-800"
data-trigger-show="input[type=checkbox]"
data-trigger-show-closest-parent="#trigger-all-of-multiple-values"
data-trigger-show-when="allOf:1, 2, 3"
data-trigger-show-action="show"
>
Surprise!
</div>
</div>
<!-- END Trigger on all of multiple values -->

<!-- BEGIN Trigger on all of multiple values (text boxes) -->
<hr class="my-8">

<h4 class="mb-0">Trigger on all of multiple values (text boxes)</h4>
<p>Same trigger test as above, but uses the combined values of a set of text boxes. This will trigger when the text boxes
contain "1", "2" and "3", in any order.</p>

<div class="grid grid-cols-2 gap-4 items-center" id="trigger-all-of-multiple-values-text-boxes">
<div>
<input
class="block w-full border border-amber-600 p-4 rounded"
type="text"
placeholder="Enter 1, 2 or 3"
>
</div>
<div>
<input
class="block w-full border border-amber-600 p-4 rounded"
type="text"
placeholder="Enter 1, 2 or 3"
>
</div>
<div>
<input
class="block w-full border border-amber-600 p-4 rounded"
type="text"
placeholder="Enter 1, 2 or 3"
>
</div>
<div
class="inline-block mt-2 p-2 rounded-md text-white bg-green-800"
data-trigger-show="input[type=text]"
data-trigger-show-closest-parent="#trigger-all-of-multiple-values-text-boxes"
data-trigger-show-when="allOf:1, 2, 3"
data-trigger-show-action="show"
>
Surprise!
</div>
</div>
<!-- END Trigger on all of multiple values (text boxes) -->

<!-- BEGIN Trigger on select value -->
<hr class="my-8">

<h4 class="mb-0">Trigger on select value</h4>
<p>Triggers when you correctly identify the actor who played John Wick. Also tests multiple triggers.</p>

<div class="grid grid-cols-2 gap-4 items-center" id="trigger-on-select-value">
<div>
<select
class="block w-full border border-amber-600 p-4 rounded"
>
<option value="" selected>Select an actor</option>
<option value="arnold">Arnold Schwarzenegger</option>
<option value="lady">Lady Gaga</option>
<option value="keanu">Keanu Reeves</option>
</select>
</div>
<div
class="inline-block mt-2 p-2 rounded-md text-white bg-red-800"
data-trigger-hide="select"
data-trigger-hide-closest-parent="#trigger-on-select-value"
data-trigger-hide-when="empty"
data-trigger-hide-action="hide"
data-trigger-show="select"
data-trigger-show-closest-parent="#trigger-on-select-value"
data-trigger-show-when="value[arnold, lady]"
data-trigger-show-action="show"
>
Wrong
</div>
<div
class="inline-block mt-2 p-2 rounded-md text-white bg-green-800"
data-trigger-hide="select"
data-trigger-hide-closest-parent="#trigger-on-select-value"
data-trigger-hide-when="empty"
data-trigger-hide-action="hide"
data-trigger-show="select"
data-trigger-show-closest-parent="#trigger-on-select-value"
data-trigger-show-when="value[keanu]"
data-trigger-show-action="show"
>
Correct
</div>
</div>
<!-- END Trigger on all of multiple values (text boxes) -->

<hr class="my-8">

<h3>Empty</h3>

<!-- BEGIN Trigger when empty -->
<hr class="mb-8">

<h4 class="mb-0">Trigger when empty</h4>
<p>A message will appear when the field below is empty.</p>

<div class="grid grid-cols-2 gap-4 items-center" id="trigger-when-empty">
<div>
<input
class="block w-full border border-amber-600 p-4 rounded"
type="text"
name="field"
placeholder="Field"
value="Not empty!"
>
</div>
<div
class="inline-block mt-2 p-2 rounded-md text-white bg-red-800"
data-trigger-show="input[type=text]"
data-trigger-show-closest-parent="#trigger-when-empty"
data-trigger-show-when="empty"
data-trigger-show-action="show"
>
Oi, you!
</div>
</div>
<!-- END Trigger when empty -->

<!-- BEGIN Trigger when empty -->
<hr class="my-8">

<h4 class="mb-0">Trigger when empty (checkboxes)</h4>
<p>A message will appear when none of the checkboxes are ticked.</p>

<div class="grid grid-cols-2 gap-4 items-center" id="trigger-when-empty-checkboxes">
<div>
<input
type="checkbox"
name="check1"
value="1"
checked
>
<label for="check1">One</label>

<input
type="checkbox"
name="check2"
value="2"
checked
>
<label for="check2">Two</label>

<input
type="checkbox"
name="check3"
value="3"
>
<label for="check3">Three</label>
</div>
<div
class="inline-block mt-2 p-2 rounded-md text-white bg-green-800"
data-trigger-show="input[type=checkbox]"
data-trigger-show-closest-parent="#trigger-when-empty-checkboxes"
data-trigger-show-when="empty"
data-trigger-show-action="show"
>
This is a no-check zone
</div>
</div>
<!-- END Trigger on single value -->
</div>
</div>
</div>
</section>
2 changes: 1 addition & 1 deletion partials/html/foot.htm
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
</p>
</footer>

{% snowboard all %}
<script src="{{ 'assets/js/app.js'|theme }}"></script>
{% scripts %}

</body>
Expand Down
3 changes: 3 additions & 0 deletions partials/snowboard/sections-list.htm
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ <h3 class="text-amber-600">Sections</h3>
<a href="{{ 'snowboard/attr-requests'|page }}" class="block w-full py-3 pl-0 pr-4">
HTML Data Attribute Requests
</a>
<a href="{{ 'snowboard/triggers'|page }}" class="block w-full py-3 pl-0 pr-4">
Triggers
</a>
<a href="{{ 'snowboard/extras'|page }}" class="block w-full py-3 pl-0 pr-4">
Extra Features
</a>
Expand Down
2 changes: 2 additions & 0 deletions winter.mix.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ mix.postCss('assets/css/base.css', 'assets/css/theme.css', [
require('tailwindcss'),
require('autoprefixer')
]);

mix.js('assets/js/src/app.js', 'assets/js/app.js');