-
Notifications
You must be signed in to change notification settings - Fork 56
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(forms): new component: Quantity Selector (#860)
Co-authored-by: Mewen Le Hô <[email protected]> Co-authored-by: Julien Déramond <[email protected]>
- Loading branch information
1 parent
2f5ab48
commit 1bfc839
Showing
16 changed files
with
709 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
/** | ||
* -------------------------------------------------------------------------- | ||
* Boosted (v5.1.3): quantity-selector.js | ||
* Licensed under MIT (https://github.com/Orange-OpenSource/Orange-Boosted-Bootstrap/blob/main/LICENSE) | ||
* -------------------------------------------------------------------------- | ||
*/ | ||
|
||
import { defineJQueryPlugin } from './util/index' | ||
import EventHandler from './dom/event-handler' | ||
import BaseComponent from './base-component' | ||
import SelectorEngine from './dom/selector-engine' | ||
|
||
/** | ||
* Constants | ||
*/ | ||
|
||
const NAME = 'quantityselector' | ||
const DATA_KEY = 'bs.quantityselector' | ||
const EVENT_KEY = `.${DATA_KEY}` | ||
const DATA_API_KEY = '.data-api' | ||
|
||
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}` | ||
const EVENT_CHANGE_DATA_API = `change${EVENT_KEY}${DATA_API_KEY}` | ||
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` | ||
|
||
const SELECTOR_STEP_UP_BUTTON = '[data-bs-step="up"]' | ||
const SELECTOR_STEP_DOWN_BUTTON = '[data-bs-step="down"]' | ||
const SELECTOR_COUNTER_INPUT = '[data-bs-step="counter"]' | ||
const SELECTOR_INPUT_GROUP = '.input-group' | ||
|
||
/** | ||
* Class definition | ||
*/ | ||
|
||
class QuantitySelector extends BaseComponent { | ||
// Getters | ||
static get NAME() { | ||
return NAME | ||
} | ||
|
||
// Public | ||
ValueOnLoad(element) { | ||
const counterInput = element.querySelector(SELECTOR_COUNTER_INPUT) | ||
const btnUp = element.querySelector(SELECTOR_STEP_UP_BUTTON) | ||
const btnDown = element.querySelector(SELECTOR_STEP_DOWN_BUTTON) | ||
|
||
const min = counterInput.getAttribute('min') | ||
const max = counterInput.getAttribute('max') | ||
const step = Number(counterInput.getAttribute('step')) | ||
|
||
if (Number(counterInput.value) - step < min) { | ||
btnDown.setAttribute('disabled', '') | ||
} | ||
|
||
if (Number(counterInput.value) + step > max) { | ||
btnUp.setAttribute('disabled', '') | ||
} | ||
} | ||
|
||
// Static | ||
static StepUp(event) { | ||
const parent = event.target.closest(SELECTOR_INPUT_GROUP) | ||
const counterInput = parent.querySelector(SELECTOR_COUNTER_INPUT) | ||
|
||
const max = counterInput.getAttribute('max') | ||
const step = Number(counterInput.getAttribute('step')) | ||
const round = Number(counterInput.getAttribute('data-bs-round')) | ||
|
||
const eventChange = new Event('change') | ||
|
||
if (Number(counterInput.value) < max) { | ||
counterInput.value = (Number(counterInput.value) + step).toFixed(round).toString() | ||
} | ||
|
||
counterInput.dispatchEvent(eventChange) | ||
} | ||
|
||
static StepDown(event) { | ||
const parent = event.target.closest(SELECTOR_INPUT_GROUP) | ||
const counterInput = parent.querySelector(SELECTOR_COUNTER_INPUT) | ||
|
||
const min = counterInput.getAttribute('min') | ||
const step = Number(counterInput.getAttribute('step')) | ||
const round = Number(counterInput.getAttribute('data-bs-round')) | ||
|
||
const eventChange = new Event('change') | ||
|
||
if (Number(counterInput.value) > min) { | ||
counterInput.value = (Number(counterInput.value) - step).toFixed(round).toString() | ||
} | ||
|
||
counterInput.dispatchEvent(eventChange) | ||
} | ||
|
||
static CheckIfDisabledOnChange(event) { | ||
const parent = event.target.closest(SELECTOR_INPUT_GROUP) | ||
const counterInput = parent.querySelector(SELECTOR_COUNTER_INPUT) | ||
const btnUp = parent.querySelector(SELECTOR_STEP_UP_BUTTON) | ||
const btnDown = parent.querySelector(SELECTOR_STEP_DOWN_BUTTON) | ||
|
||
const min = counterInput.getAttribute('min') | ||
const max = counterInput.getAttribute('max') | ||
const step = Number(counterInput.getAttribute('step')) | ||
|
||
btnUp.removeAttribute('disabled', '') | ||
btnDown.removeAttribute('disabled', '') | ||
|
||
if (Number(counterInput.value) - step < min) { | ||
btnDown.setAttribute('disabled', '') | ||
} | ||
|
||
if (Number(counterInput.value) + step > max) { | ||
btnUp.setAttribute('disabled', '') | ||
} | ||
} | ||
|
||
static jQueryInterface(config) { | ||
return this.each(function () { | ||
const data = QuantitySelector.getOrCreateInstance(this, config) | ||
|
||
if (typeof config !== 'string') { | ||
return | ||
} | ||
|
||
if (typeof data[config] === 'undefined') { | ||
throw new TypeError(`No method named "${config}"`) | ||
} | ||
|
||
data[config]() | ||
}) | ||
} | ||
} | ||
|
||
/** | ||
* Data API implementation | ||
*/ | ||
|
||
EventHandler.on(document, EVENT_CHANGE_DATA_API, SELECTOR_COUNTER_INPUT, QuantitySelector.CheckIfDisabledOnChange) | ||
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_STEP_UP_BUTTON, QuantitySelector.StepUp) | ||
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_STEP_DOWN_BUTTON, QuantitySelector.StepDown) | ||
|
||
EventHandler.on(window, EVENT_LOAD_DATA_API, () => { | ||
for (const el of SelectorEngine.find(SELECTOR_INPUT_GROUP)) { | ||
QuantitySelector.getOrCreateInstance(el).ValueOnLoad(el) | ||
} | ||
}) | ||
|
||
/** | ||
* jQuery | ||
*/ | ||
|
||
defineJQueryPlugin(QuantitySelector) | ||
|
||
export default QuantitySelector |
Oops, something went wrong.