@ionic/core 7.5.8-dev.11701806358.1ca1b519 → 7.5.8-dev.11701894917.1c1465bd
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/data.js +1 -1
- package/components/ion-datetime.js +30 -39
- package/components/ion-picker-column-internal.d.ts +11 -0
- package/components/ion-picker-column-internal.js +9 -0
- package/components/ion-picker-column.js +2 -2
- package/components/{ion-picker-legacy.d.ts → ion-picker-internal.d.ts} +4 -4
- package/components/ion-picker-internal.js +9 -0
- package/components/ion-picker.js +309 -1
- package/components/overlays.js +3 -6
- package/components/picker-column-internal.js +390 -0
- package/components/picker-column.js +317 -363
- package/components/{picker.js → picker-internal.js} +16 -16
- package/dist/cjs/{data-e7526b58.js → data-36b9094e.js} +1 -1
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/ion-action-sheet.cjs.entry.js +1 -1
- package/dist/cjs/ion-alert.cjs.entry.js +1 -1
- package/dist/cjs/ion-datetime-button.cjs.entry.js +1 -1
- package/dist/cjs/ion-datetime_3.cjs.entry.js +35 -29
- package/dist/cjs/ion-loading.cjs.entry.js +1 -1
- package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
- package/dist/cjs/ion-modal.cjs.entry.js +1 -1
- package/dist/cjs/{ion-picker-column.cjs.entry.js → ion-picker-column-internal.cjs.entry.js} +72 -105
- package/dist/cjs/{ion-picker.cjs.entry.js → ion-picker-internal.cjs.entry.js} +13 -13
- package/dist/cjs/ion-popover.cjs.entry.js +1 -1
- package/dist/cjs/ion-select_3.cjs.entry.js +1 -1
- package/dist/cjs/ion-toast.cjs.entry.js +1 -1
- package/dist/cjs/ionic.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{overlays-e8e05b0e.js → overlays-2c6b1072.js} +3 -6
- package/dist/collection/collection-manifest.json +6 -7
- package/dist/collection/components/datetime/datetime.ios.css +13 -0
- package/dist/collection/components/datetime/datetime.js +16 -19
- package/dist/collection/components/datetime/datetime.md.css +13 -0
- package/dist/collection/components/datetime/test/datetime.e2e.js +2 -2
- package/dist/collection/components/datetime/test/disabled/datetime.spec.js +4 -4
- package/dist/collection/components/datetime/test/locale/datetime.e2e.js +2 -2
- package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +6 -6
- package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +41 -43
- package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +1 -1
- package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +2 -2
- package/dist/collection/components/datetime/test/values/datetime.e2e.js +12 -15
- package/dist/collection/components/datetime/utils/data.js +1 -1
- package/dist/collection/components/picker/picker.ios.css +205 -100
- package/dist/collection/components/picker/picker.js +743 -461
- package/dist/collection/components/picker/picker.md.css +194 -98
- package/dist/collection/components/picker/test/basic/picker.e2e.js +13 -99
- package/dist/collection/components/{picker-legacy → picker}/test/is-open/picker.e2e.js +4 -4
- package/dist/collection/components/{picker-legacy → picker}/test/picker-id.spec.js +5 -5
- package/dist/collection/components/{picker-legacy → picker}/test/trigger/picker.e2e.js +1 -1
- package/dist/collection/components/picker-column/picker-column.ios.css +160 -120
- package/dist/collection/components/picker-column/picker-column.js +329 -514
- package/dist/collection/components/picker-column/picker-column.md.css +107 -134
- package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-aria.spec.js +3 -3
- package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-dynamic.spec.js +2 -2
- package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column.spec.js +2 -2
- package/dist/collection/components/{picker-legacy-column → picker-column}/test/standalone/picker-column.e2e.js +3 -3
- package/dist/collection/components/{picker-column-option/picker-column-option.md.css → picker-column-internal/picker-column-internal.ios.css} +53 -6
- package/dist/collection/components/picker-column-internal/picker-column-internal.js +565 -0
- package/dist/collection/components/{picker-legacy-column/picker-column.md.css → picker-column-internal/picker-column-internal.md.css} +63 -113
- package/dist/collection/components/{picker-column/test/basic/picker-column.e2e.js → picker-column-internal/test/basic/picker-column-internal.e2e.js} +8 -8
- package/dist/collection/components/picker-column-internal/test/disabled/picker-column-internal.e2e.js +162 -0
- package/dist/collection/components/{picker-legacy/picker.md.css → picker-internal/picker-internal.ios.css} +100 -192
- package/dist/collection/components/picker-internal/picker-internal.js +544 -0
- package/dist/collection/components/{picker-legacy-column/picker-column.ios.css → picker-internal/picker-internal.md.css} +101 -98
- package/dist/collection/components/{picker/test/a11y/picker.e2e.js → picker-internal/test/a11y/picker-internal.e2e.js} +2 -2
- package/dist/collection/components/picker-internal/test/basic/picker-internal.e2e.js +118 -0
- package/dist/collection/components/{picker/test/keyboard-entry/picker.e2e.js → picker-internal/test/keyboard-entry/picker-internal.e2e.js} +22 -23
- package/dist/collection/utils/overlays.js +3 -6
- package/dist/docs.json +23 -487
- package/dist/esm/{data-4b9508c9.js → data-f5c75b4e.js} +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/ion-action-sheet.entry.js +1 -1
- package/dist/esm/ion-alert.entry.js +1 -1
- package/dist/esm/ion-datetime-button.entry.js +1 -1
- package/dist/esm/ion-datetime_3.entry.js +34 -28
- package/dist/esm/ion-loading.entry.js +1 -1
- package/dist/esm/ion-menu_3.entry.js +1 -1
- package/dist/esm/ion-modal.entry.js +1 -1
- package/dist/esm/{ion-picker-column.entry.js → ion-picker-column-internal.entry.js} +72 -105
- package/dist/esm/{ion-picker.entry.js → ion-picker-internal.entry.js} +13 -13
- package/dist/esm/ion-popover.entry.js +1 -1
- package/dist/esm/ion-select_3.entry.js +1 -1
- package/dist/esm/ion-toast.entry.js +1 -1
- package/dist/esm/ionic.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{overlays-fbc5cab5.js → overlays-d23ea6e1.js} +3 -6
- package/dist/esm-es5/index.js +1 -1
- package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
- package/dist/esm-es5/ion-alert.entry.js +1 -1
- package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
- package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
- package/dist/esm-es5/ion-loading.entry.js +1 -1
- package/dist/esm-es5/ion-menu_3.entry.js +1 -1
- package/dist/esm-es5/ion-modal.entry.js +1 -1
- package/dist/esm-es5/ion-picker-column-internal.entry.js +4 -0
- package/dist/esm-es5/ion-picker-internal.entry.js +4 -0
- package/dist/esm-es5/ion-popover.entry.js +1 -1
- package/dist/esm-es5/ion-select_3.entry.js +1 -1
- package/dist/esm-es5/ion-toast.entry.js +1 -1
- package/dist/esm-es5/ionic.js +1 -1
- package/dist/esm-es5/loader.js +1 -1
- package/dist/esm-es5/overlays-d23ea6e1.js +4 -0
- package/dist/html.html-data.json +1 -152
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/{p-846ee227.entry.js → p-1e57bd24.entry.js} +1 -1
- package/dist/ionic/{p-26798a7b.system.entry.js → p-1f620cd4.system.entry.js} +1 -1
- package/dist/ionic/{p-5d42b6b4.entry.js → p-27ea6f4e.entry.js} +1 -1
- package/dist/ionic/{p-6b7c55cd.entry.js → p-2dc43d20.entry.js} +1 -1
- package/dist/ionic/{p-4a36430f.system.entry.js → p-2f2293da.system.entry.js} +1 -1
- package/dist/ionic/{p-21c3515a.entry.js → p-2f300cca.entry.js} +1 -1
- package/dist/ionic/{p-8017aad2.system.entry.js → p-39a335b6.system.entry.js} +1 -1
- package/dist/ionic/{p-4a081ea9.entry.js → p-3b568d18.entry.js} +1 -1
- package/dist/ionic/{p-c18de88a.system.entry.js → p-3e3d06a6.system.entry.js} +1 -1
- package/dist/ionic/{p-96dbbac1.system.entry.js → p-4df97e3c.system.entry.js} +1 -1
- package/dist/ionic/p-60502e3f.system.entry.js +4 -0
- package/dist/ionic/{p-563c41f0.system.entry.js → p-60b386c9.system.entry.js} +1 -1
- package/dist/ionic/p-67da080d.entry.js +4 -0
- package/dist/ionic/p-73ea8f82.system.entry.js +4 -0
- package/dist/ionic/p-80fa068e.entry.js +4 -0
- package/dist/ionic/{p-a8baa23e.entry.js → p-8780cc2a.entry.js} +1 -1
- package/dist/ionic/{p-f910cc73.system.entry.js → p-9eec42cc.system.entry.js} +1 -1
- package/dist/ionic/p-ab11130c.system.js +4 -0
- package/dist/ionic/p-af16fe62.entry.js +4 -0
- package/dist/ionic/{p-73aa7604.entry.js → p-af19a573.entry.js} +1 -1
- package/dist/ionic/p-c14f8ac8.js +4 -0
- package/dist/ionic/p-cce9f61a.system.entry.js +4 -0
- package/dist/ionic/{p-b133e9b4.entry.js → p-ddb30596.entry.js} +1 -1
- package/dist/ionic/{p-27bcbbc7.system.entry.js → p-e1e5afe1.system.entry.js} +1 -1
- package/dist/ionic/p-e3584231.system.js +1 -1
- package/dist/ionic/{p-fbf3a689.system.entry.js → p-e3ad9607.system.entry.js} +1 -1
- package/dist/ionic/{p-73190c5f.entry.js → p-f78efbd1.entry.js} +1 -1
- package/dist/ionic/{p-54dfc9b5.system.js → p-fff7a57e.system.js} +1 -1
- package/dist/types/components/datetime/utils/data.d.ts +2 -2
- package/dist/types/components/picker/picker.d.ts +131 -74
- package/dist/types/components/picker-column/picker-column.d.ts +39 -105
- package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +102 -0
- package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +8 -0
- package/dist/types/components/picker-internal/picker-internal.d.ts +102 -0
- package/dist/types/components.d.ts +122 -163
- package/dist/types/interface.d.ts +1 -1
- package/dist/types/utils/config.d.ts +2 -2
- package/dist/types/utils/overlays.d.ts +2 -5
- package/hydrate/index.js +1151 -1287
- package/package.json +1 -1
- package/components/ion-picker-column-option.d.ts +0 -11
- package/components/ion-picker-column-option.js +0 -9
- package/components/ion-picker-legacy-column.d.ts +0 -11
- package/components/ion-picker-legacy-column.js +0 -9
- package/components/ion-picker-legacy.js +0 -309
- package/components/picker-column-option.js +0 -122
- package/components/picker-column2.js +0 -379
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +0 -104
- package/dist/collection/components/picker-column/test/disabled/picker-column.e2e.js +0 -113
- package/dist/collection/components/picker-column/test/slots/picker-column.e2e.js +0 -39
- package/dist/collection/components/picker-column-option/picker-column-option.ios.css +0 -87
- package/dist/collection/components/picker-column-option/picker-column-option.js +0 -173
- package/dist/collection/components/picker-column-option/test/a11y/picker-column-option.e2e.js +0 -18
- package/dist/collection/components/picker-column-option/test/basic/picker-column-option.e2e.js +0 -37
- package/dist/collection/components/picker-legacy/picker.ios.css +0 -367
- package/dist/collection/components/picker-legacy/picker.js +0 -817
- package/dist/collection/components/picker-legacy/test/basic/picker.e2e.js +0 -25
- package/dist/collection/components/picker-legacy-column/picker-column.js +0 -419
- package/dist/esm/ion-picker-column-option.entry.js +0 -100
- package/dist/esm-es5/ion-picker-column-option.entry.js +0 -4
- package/dist/esm-es5/ion-picker-column.entry.js +0 -4
- package/dist/esm-es5/ion-picker.entry.js +0 -4
- package/dist/esm-es5/overlays-fbc5cab5.js +0 -4
- package/dist/ionic/p-23672c82.system.entry.js +0 -4
- package/dist/ionic/p-8fa6583d.system.js +0 -4
- package/dist/ionic/p-9282b16f.entry.js +0 -4
- package/dist/ionic/p-9ba90516.system.entry.js +0 -4
- package/dist/ionic/p-afcf4620.entry.js +0 -4
- package/dist/ionic/p-c2910c78.entry.js +0 -4
- package/dist/ionic/p-c8f0a036.entry.js +0 -4
- package/dist/ionic/p-ca8938f4.js +0 -4
- package/dist/ionic/p-ca9d1792.system.entry.js +0 -4
- package/dist/ionic/p-ffd5dba4.system.entry.js +0 -4
- package/dist/types/components/picker/picker-interfaces.d.ts +0 -8
- package/dist/types/components/picker-column-option/picker-column-option.d.ts +0 -66
- package/dist/types/components/picker-legacy/picker.d.ts +0 -158
- package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
- /package/dist/collection/components/{picker-legacy → picker}/animations/ios.enter.js +0 -0
- /package/dist/collection/components/{picker-legacy → picker}/animations/ios.leave.js +0 -0
- /package/dist/collection/components/picker/{picker-interfaces.js → picker-interface.js} +0 -0
- /package/dist/collection/components/{picker-legacy-column → picker-column}/test/test.utils.js +0 -0
- /package/dist/collection/components/{picker-column/picker-column-interfaces.js → picker-column-internal/picker-column-internal-interfaces.js} +0 -0
- /package/dist/collection/components/{picker-legacy/picker-interface.js → picker-internal/picker-internal-interfaces.js} +0 -0
- /package/dist/esm-es5/{data-4b9508c9.js → data-f5c75b4e.js} +0 -0
- /package/dist/ionic/{p-368f5215.js → p-2aea8b1e.js} +0 -0
- /package/dist/ionic/{p-f58981c2.system.js → p-82e3d633.system.js} +0 -0
- /package/dist/types/components/{picker-legacy → picker}/animations/ios.enter.d.ts +0 -0
- /package/dist/types/components/{picker-legacy → picker}/animations/ios.leave.d.ts +0 -0
- /package/dist/types/components/{picker-legacy → picker}/picker-interface.d.ts +0 -0
- /package/dist/types/components/{picker-legacy-column → picker-column}/test/test.utils.d.ts +0 -0
- /package/dist/types/components/{picker-column/picker-column-interfaces.d.ts → picker-column-internal/picker-column-internal-interfaces.d.ts} +0 -0
|
@@ -2,412 +2,366 @@
|
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
4
|
import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { c as createColorClasses } from './theme.js';
|
|
5
|
+
import { m as clamp } from './helpers.js';
|
|
6
|
+
import { b as hapticSelectionChanged, h as hapticSelectionEnd, a as hapticSelectionStart } from './haptic.js';
|
|
7
|
+
import { g as getClassMap } from './theme.js';
|
|
8
|
+
import { b as getIonMode } from './ionic-global.js';
|
|
10
9
|
|
|
11
|
-
const pickerColumnIosCss = "
|
|
10
|
+
const pickerColumnIosCss = ".picker-col{display:-ms-flexbox;display:flex;position:relative;-ms-flex:1;flex:1;-ms-flex-pack:center;justify-content:center;height:100%;-webkit-box-sizing:content-box;box-sizing:content-box;contain:content}.picker-opts{position:relative;-ms-flex:1;flex:1;max-width:100%}.picker-opt{top:0;display:block;position:absolute;width:100%;border:0;text-align:center;text-overflow:ellipsis;white-space:nowrap;contain:strict;overflow:hidden;will-change:transform}@supports (inset-inline-start: 0){.picker-opt{inset-inline-start:0}}@supports not (inset-inline-start: 0){.picker-opt{left:0}:host-context([dir=rtl]) .picker-opt{left:unset;right:unset;right:0}[dir=rtl] .picker-opt{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.picker-opt:dir(rtl){left:unset;right:unset;right:0}}}.picker-opt.picker-opt-disabled{pointer-events:none}.picker-opt-disabled{opacity:0}.picker-opts-left{-ms-flex-pack:start;justify-content:flex-start}.picker-opts-right{-ms-flex-pack:end;justify-content:flex-end}.picker-opt:active,.picker-opt:focus{outline:none}.picker-prefix{position:relative;-ms-flex:1;flex:1;text-align:end;white-space:nowrap}.picker-suffix{position:relative;-ms-flex:1;flex:1;text-align:start;white-space:nowrap}.picker-col{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:0;padding-bottom:0;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.picker-prefix,.picker-suffix,.picker-opts{top:77px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;color:inherit;font-size:20px;line-height:42px;pointer-events:none}.picker-opt{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;-webkit-transform-origin:center center;transform-origin:center center;height:46px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out;background:transparent;color:inherit;font-size:20px;line-height:42px;-webkit-backface-visibility:hidden;backface-visibility:hidden;pointer-events:auto}:host-context([dir=rtl]) .picker-opt{-webkit-transform-origin:calc(100% - center) center;transform-origin:calc(100% - center) center}[dir=rtl] .picker-opt{-webkit-transform-origin:calc(100% - center) center;transform-origin:calc(100% - center) center}@supports selector(:dir(rtl)){.picker-opt:dir(rtl){-webkit-transform-origin:calc(100% - center) center;transform-origin:calc(100% - center) center}}";
|
|
12
11
|
|
|
13
|
-
const pickerColumnMdCss = "
|
|
12
|
+
const pickerColumnMdCss = ".picker-col{display:-ms-flexbox;display:flex;position:relative;-ms-flex:1;flex:1;-ms-flex-pack:center;justify-content:center;height:100%;-webkit-box-sizing:content-box;box-sizing:content-box;contain:content}.picker-opts{position:relative;-ms-flex:1;flex:1;max-width:100%}.picker-opt{top:0;display:block;position:absolute;width:100%;border:0;text-align:center;text-overflow:ellipsis;white-space:nowrap;contain:strict;overflow:hidden;will-change:transform}@supports (inset-inline-start: 0){.picker-opt{inset-inline-start:0}}@supports not (inset-inline-start: 0){.picker-opt{left:0}:host-context([dir=rtl]) .picker-opt{left:unset;right:unset;right:0}[dir=rtl] .picker-opt{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.picker-opt:dir(rtl){left:unset;right:unset;right:0}}}.picker-opt.picker-opt-disabled{pointer-events:none}.picker-opt-disabled{opacity:0}.picker-opts-left{-ms-flex-pack:start;justify-content:flex-start}.picker-opts-right{-ms-flex-pack:end;justify-content:flex-end}.picker-opt:active,.picker-opt:focus{outline:none}.picker-prefix{position:relative;-ms-flex:1;flex:1;text-align:end;white-space:nowrap}.picker-suffix{position:relative;-ms-flex:1;flex:1;text-align:start;white-space:nowrap}.picker-col{-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:8px;padding-inline-end:8px;padding-top:0;padding-bottom:0;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.picker-prefix,.picker-suffix,.picker-opts{top:77px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;color:inherit;font-size:22px;line-height:42px;pointer-events:none}.picker-opt{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;height:43px;-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out;background:transparent;color:inherit;font-size:22px;line-height:42px;-webkit-backface-visibility:hidden;backface-visibility:hidden;pointer-events:auto}.picker-prefix,.picker-suffix,.picker-opt.picker-opt-selected{color:var(--ion-color-primary, #3880ff)}";
|
|
14
13
|
|
|
15
|
-
const
|
|
14
|
+
const PickerColumnCmp = /*@__PURE__*/ proxyCustomElement(class PickerColumnCmp extends HTMLElement {
|
|
16
15
|
constructor() {
|
|
17
16
|
super();
|
|
18
17
|
this.__registerHost();
|
|
19
|
-
this.
|
|
20
|
-
this.
|
|
21
|
-
this.
|
|
22
|
-
this.
|
|
23
|
-
this.
|
|
24
|
-
this.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
18
|
+
this.ionPickerColChange = createEvent(this, "ionPickerColChange", 7);
|
|
19
|
+
this.optHeight = 0;
|
|
20
|
+
this.rotateFactor = 0;
|
|
21
|
+
this.scaleFactor = 1;
|
|
22
|
+
this.velocity = 0;
|
|
23
|
+
this.y = 0;
|
|
24
|
+
this.noAnimate = true;
|
|
25
|
+
// `colDidChange` is a flag that gets set when the column is changed
|
|
26
|
+
// dynamically. When this flag is set, the column will refresh
|
|
27
|
+
// after the component re-renders to incorporate the new column data.
|
|
28
|
+
// This is necessary because `this.refresh` queries for the option elements,
|
|
29
|
+
// so it needs to wait for the latest elements to be available in the DOM.
|
|
30
|
+
// Ex: column is created with 3 options. User updates the column data
|
|
31
|
+
// to have 5 options. The column will still think it only has 3 options.
|
|
32
|
+
this.colDidChange = false;
|
|
33
|
+
this.col = undefined;
|
|
34
|
+
}
|
|
35
|
+
colChanged() {
|
|
36
|
+
this.colDidChange = true;
|
|
37
|
+
}
|
|
38
|
+
async connectedCallback() {
|
|
39
|
+
let pickerRotateFactor = 0;
|
|
40
|
+
let pickerScaleFactor = 0.81;
|
|
41
|
+
const mode = getIonMode(this);
|
|
42
|
+
if (mode === 'ios') {
|
|
43
|
+
pickerRotateFactor = -0.46;
|
|
44
|
+
pickerScaleFactor = 1;
|
|
45
|
+
}
|
|
46
|
+
this.rotateFactor = pickerRotateFactor;
|
|
47
|
+
this.scaleFactor = pickerScaleFactor;
|
|
48
|
+
this.gesture = (await import('./index3.js')).createGesture({
|
|
49
|
+
el: this.el,
|
|
50
|
+
gestureName: 'picker-swipe',
|
|
51
|
+
gesturePriority: 100,
|
|
52
|
+
threshold: 0,
|
|
53
|
+
passive: false,
|
|
54
|
+
onStart: (ev) => this.onStart(ev),
|
|
55
|
+
onMove: (ev) => this.onMove(ev),
|
|
56
|
+
onEnd: (ev) => this.onEnd(ev),
|
|
57
|
+
});
|
|
58
|
+
this.gesture.enable();
|
|
59
|
+
// Options have not been initialized yet
|
|
60
|
+
// Animation must be disabled through the `noAnimate` flag
|
|
61
|
+
// Otherwise, the options will render
|
|
62
|
+
// at the top of the column and transition down
|
|
63
|
+
this.tmrId = setTimeout(() => {
|
|
64
|
+
this.noAnimate = false;
|
|
65
|
+
// After initialization, `refresh()` will be called
|
|
66
|
+
// At this point, animation will be enabled. The options will
|
|
67
|
+
// animate as they are being selected.
|
|
68
|
+
this.refresh(true);
|
|
69
|
+
}, 250);
|
|
70
|
+
}
|
|
71
|
+
componentDidLoad() {
|
|
72
|
+
this.onDomChange();
|
|
73
|
+
}
|
|
74
|
+
componentDidUpdate() {
|
|
75
|
+
// Options may have changed since last update.
|
|
76
|
+
if (this.colDidChange) {
|
|
77
|
+
// Animation must be disabled through the `onDomChange` parameter.
|
|
78
|
+
// Otherwise, the recently added options will render
|
|
79
|
+
// at the top of the column and transition down
|
|
80
|
+
this.onDomChange(true, false);
|
|
81
|
+
this.colDidChange = false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
disconnectedCallback() {
|
|
85
|
+
if (this.rafId !== undefined)
|
|
86
|
+
cancelAnimationFrame(this.rafId);
|
|
87
|
+
if (this.tmrId)
|
|
88
|
+
clearTimeout(this.tmrId);
|
|
89
|
+
if (this.gesture) {
|
|
90
|
+
this.gesture.destroy();
|
|
91
|
+
this.gesture = undefined;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
emitColChange() {
|
|
95
|
+
this.ionPickerColChange.emit(this.col);
|
|
96
|
+
}
|
|
97
|
+
setSelected(selectedIndex, duration) {
|
|
98
|
+
// if there is a selected index, then figure out it's y position
|
|
99
|
+
// if there isn't a selected index, then just use the top y position
|
|
100
|
+
const y = selectedIndex > -1 ? -(selectedIndex * this.optHeight) : 0;
|
|
101
|
+
this.velocity = 0;
|
|
102
|
+
// set what y position we're at
|
|
103
|
+
if (this.rafId !== undefined)
|
|
104
|
+
cancelAnimationFrame(this.rafId);
|
|
105
|
+
this.update(y, duration, true);
|
|
106
|
+
this.emitColChange();
|
|
107
|
+
}
|
|
108
|
+
update(y, duration, saveY) {
|
|
109
|
+
if (!this.optsEl) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// ensure we've got a good round number :)
|
|
113
|
+
let translateY = 0;
|
|
114
|
+
let translateZ = 0;
|
|
115
|
+
const { col, rotateFactor } = this;
|
|
116
|
+
const prevSelected = col.selectedIndex;
|
|
117
|
+
const selectedIndex = (col.selectedIndex = this.indexForY(-y));
|
|
118
|
+
const durationStr = duration === 0 ? '' : duration + 'ms';
|
|
119
|
+
const scaleStr = `scale(${this.scaleFactor})`;
|
|
120
|
+
const children = this.optsEl.children;
|
|
121
|
+
for (let i = 0; i < children.length; i++) {
|
|
122
|
+
const button = children[i];
|
|
123
|
+
const opt = col.options[i];
|
|
124
|
+
const optOffset = i * this.optHeight + y;
|
|
125
|
+
let transform = '';
|
|
126
|
+
if (rotateFactor !== 0) {
|
|
127
|
+
const rotateX = optOffset * rotateFactor;
|
|
128
|
+
if (Math.abs(rotateX) <= 90) {
|
|
129
|
+
translateY = 0;
|
|
130
|
+
translateZ = 90;
|
|
131
|
+
transform = `rotateX(${rotateX}deg) `;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
translateY = -9999;
|
|
43
135
|
}
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
this.setPickerItemActiveState = (item, isActive) => {
|
|
47
|
-
if (isActive) {
|
|
48
|
-
item.classList.add(PICKER_ITEM_ACTIVE_CLASS);
|
|
49
|
-
item.part.add(PICKER_ITEM_ACTIVE_PART);
|
|
50
136
|
}
|
|
51
137
|
else {
|
|
52
|
-
|
|
53
|
-
|
|
138
|
+
translateZ = 0;
|
|
139
|
+
translateY = optOffset;
|
|
54
140
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
* for text entry.
|
|
60
|
-
*/
|
|
61
|
-
this.inputModeChange = (ev) => {
|
|
62
|
-
if (!this.numericInput) {
|
|
63
|
-
return;
|
|
141
|
+
const selected = selectedIndex === i;
|
|
142
|
+
transform += `translate3d(0px,${translateY}px,${translateZ}px) `;
|
|
143
|
+
if (this.scaleFactor !== 1 && !selected) {
|
|
144
|
+
transform += scaleStr;
|
|
64
145
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
*/
|
|
70
|
-
const isColumnActive = inputModeColumn === undefined || inputModeColumn === this.el;
|
|
71
|
-
if (!useInputMode || !isColumnActive) {
|
|
72
|
-
this.setInputModeActive(false);
|
|
73
|
-
return;
|
|
146
|
+
// Update transition duration
|
|
147
|
+
if (this.noAnimate) {
|
|
148
|
+
opt.duration = 0;
|
|
149
|
+
button.style.transitionDuration = '';
|
|
74
150
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
* Setting isActive will cause a re-render.
|
|
79
|
-
* As a result, we do not want to cause the
|
|
80
|
-
* re-render mid scroll as this will cause
|
|
81
|
-
* the picker column to jump back to
|
|
82
|
-
* whatever value was selected at the
|
|
83
|
-
* start of the scroll interaction.
|
|
84
|
-
*/
|
|
85
|
-
this.setInputModeActive = (state) => {
|
|
86
|
-
if (this.isScrolling) {
|
|
87
|
-
this.scrollEndCallback = () => {
|
|
88
|
-
this.isActive = state;
|
|
89
|
-
};
|
|
90
|
-
return;
|
|
151
|
+
else if (duration !== opt.duration) {
|
|
152
|
+
opt.duration = duration;
|
|
153
|
+
button.style.transitionDuration = durationStr;
|
|
91
154
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
* in the view and will emit an ionChange with
|
|
98
|
-
* the item object.
|
|
99
|
-
*/
|
|
100
|
-
this.initializeScrollListener = () => {
|
|
101
|
-
/**
|
|
102
|
-
* The haptics for the wheel picker are
|
|
103
|
-
* an iOS-only feature. As a result, they should
|
|
104
|
-
* be disabled on Android.
|
|
105
|
-
*/
|
|
106
|
-
const enableHaptics = isPlatform('ios');
|
|
107
|
-
const { el, scrollEl } = this;
|
|
108
|
-
let timeout;
|
|
109
|
-
let activeEl = this.activeItem;
|
|
110
|
-
const scrollCallback = () => {
|
|
111
|
-
raf(() => {
|
|
112
|
-
if (!scrollEl)
|
|
113
|
-
return;
|
|
114
|
-
if (timeout) {
|
|
115
|
-
clearTimeout(timeout);
|
|
116
|
-
timeout = undefined;
|
|
117
|
-
}
|
|
118
|
-
if (!this.isScrolling) {
|
|
119
|
-
enableHaptics && hapticSelectionStart();
|
|
120
|
-
this.isScrolling = true;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Select item in the center of the column
|
|
124
|
-
* which is the month/year that we want to select
|
|
125
|
-
*/
|
|
126
|
-
const bbox = scrollEl.getBoundingClientRect();
|
|
127
|
-
const centerX = bbox.x + bbox.width / 2;
|
|
128
|
-
const centerY = bbox.y + bbox.height / 2;
|
|
129
|
-
/**
|
|
130
|
-
* elementFromPoint returns the top-most element.
|
|
131
|
-
* This means that if an ion-backdrop is overlaying the
|
|
132
|
-
* picker then the appropriate picker column option will
|
|
133
|
-
* not be selected. To account for this, we use elementsFromPoint
|
|
134
|
-
* and use an Array.find to find the appropriate column option
|
|
135
|
-
* at that point.
|
|
136
|
-
*
|
|
137
|
-
* Additionally, the picker column could be used in the
|
|
138
|
-
* Shadow DOM (i.e. in ion-datetime) so we need to make
|
|
139
|
-
* sure we are choosing the correct host otherwise
|
|
140
|
-
* the elements returns by elementsFromPoint will be
|
|
141
|
-
* retargeted. To account for this, we check to see
|
|
142
|
-
* if the picker column has a parent shadow root. If
|
|
143
|
-
* so, we use that shadow root when doing elementsFromPoint.
|
|
144
|
-
* Otherwise, we just use the document.
|
|
145
|
-
*/
|
|
146
|
-
const rootNode = el.getRootNode();
|
|
147
|
-
const hasParentShadow = rootNode instanceof ShadowRoot;
|
|
148
|
-
const referenceNode = hasParentShadow ? rootNode : doc;
|
|
149
|
-
/**
|
|
150
|
-
* If the reference node is undefined
|
|
151
|
-
* then it's likely that doc is undefined
|
|
152
|
-
* due to being in an SSR environment.
|
|
153
|
-
*/
|
|
154
|
-
if (referenceNode === undefined) {
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
const elementsAtPoint = referenceNode.elementsFromPoint(centerX, centerY);
|
|
158
|
-
/**
|
|
159
|
-
* elementsFromPoint can returns multiple elements
|
|
160
|
-
* so find the relevant picker column option if one exists.
|
|
161
|
-
*/
|
|
162
|
-
const newActiveElement = elementsAtPoint.find((el) => el.tagName === 'ION-PICKER-COLUMN-OPTION');
|
|
163
|
-
if (activeEl !== undefined) {
|
|
164
|
-
this.setPickerItemActiveState(activeEl, false);
|
|
165
|
-
}
|
|
166
|
-
if (newActiveElement === undefined || newActiveElement.disabled) {
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* If we are selecting a new value,
|
|
171
|
-
* we need to run haptics again.
|
|
172
|
-
*/
|
|
173
|
-
if (newActiveElement !== activeEl) {
|
|
174
|
-
enableHaptics && hapticSelectionChanged();
|
|
175
|
-
if (this.canExitInputMode) {
|
|
176
|
-
/**
|
|
177
|
-
* The native iOS wheel picker
|
|
178
|
-
* only dismisses the keyboard
|
|
179
|
-
* once the selected item has changed
|
|
180
|
-
* as a result of a swipe
|
|
181
|
-
* from the user. If `canExitInputMode` is
|
|
182
|
-
* `false` then this means that the
|
|
183
|
-
* scroll is happening as a result of
|
|
184
|
-
* the `value` property programmatically changing
|
|
185
|
-
* either by an application or by the user via the keyboard.
|
|
186
|
-
*/
|
|
187
|
-
this.exitInputMode();
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
activeEl = newActiveElement;
|
|
191
|
-
this.setPickerItemActiveState(newActiveElement, true);
|
|
192
|
-
timeout = setTimeout(() => {
|
|
193
|
-
this.isScrolling = false;
|
|
194
|
-
enableHaptics && hapticSelectionEnd();
|
|
195
|
-
/**
|
|
196
|
-
* Certain tasks (such as those that
|
|
197
|
-
* cause re-renders) should only be done
|
|
198
|
-
* once scrolling has finished, otherwise
|
|
199
|
-
* flickering may occur.
|
|
200
|
-
*/
|
|
201
|
-
const { scrollEndCallback } = this;
|
|
202
|
-
if (scrollEndCallback) {
|
|
203
|
-
scrollEndCallback();
|
|
204
|
-
this.scrollEndCallback = undefined;
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Reset this flag as the
|
|
208
|
-
* next scroll interaction could
|
|
209
|
-
* be a scroll from the user. In this
|
|
210
|
-
* case, we should exit input mode.
|
|
211
|
-
*/
|
|
212
|
-
this.canExitInputMode = true;
|
|
213
|
-
this.setValue(newActiveElement.value);
|
|
214
|
-
}, 250);
|
|
215
|
-
});
|
|
216
|
-
};
|
|
217
|
-
/**
|
|
218
|
-
* Wrap this in an raf so that the scroll callback
|
|
219
|
-
* does not fire when component is initially shown.
|
|
220
|
-
*/
|
|
221
|
-
raf(() => {
|
|
222
|
-
if (!scrollEl)
|
|
223
|
-
return;
|
|
224
|
-
scrollEl.addEventListener('scroll', scrollCallback);
|
|
225
|
-
this.destroyScrollListener = () => {
|
|
226
|
-
scrollEl.removeEventListener('scroll', scrollCallback);
|
|
227
|
-
};
|
|
228
|
-
});
|
|
229
|
-
};
|
|
230
|
-
/**
|
|
231
|
-
* Tells the parent picker to
|
|
232
|
-
* exit text entry mode. This is only called
|
|
233
|
-
* when the selected item changes during scroll, so
|
|
234
|
-
* we know that the user likely wants to scroll
|
|
235
|
-
* instead of type.
|
|
236
|
-
*/
|
|
237
|
-
this.exitInputMode = () => {
|
|
238
|
-
const { parentEl } = this;
|
|
239
|
-
if (parentEl == null)
|
|
240
|
-
return;
|
|
241
|
-
parentEl.exitInputMode();
|
|
242
|
-
/**
|
|
243
|
-
* setInputModeActive only takes
|
|
244
|
-
* effect once scrolling stops to avoid
|
|
245
|
-
* a component re-render while scrolling.
|
|
246
|
-
* However, we want the visual active
|
|
247
|
-
* indicator to go away immediately, so
|
|
248
|
-
* we call classList.remove here.
|
|
249
|
-
*/
|
|
250
|
-
this.el.classList.remove('picker-column-active');
|
|
251
|
-
};
|
|
252
|
-
this.isActive = false;
|
|
253
|
-
this.disabled = false;
|
|
254
|
-
this.items = [];
|
|
255
|
-
this.value = undefined;
|
|
256
|
-
this.color = 'primary';
|
|
257
|
-
this.numericInput = false;
|
|
258
|
-
}
|
|
259
|
-
valueChange() {
|
|
260
|
-
if (this.isColumnVisible) {
|
|
155
|
+
// Update transform
|
|
156
|
+
if (transform !== opt.transform) {
|
|
157
|
+
opt.transform = transform;
|
|
158
|
+
}
|
|
159
|
+
button.style.transform = transform;
|
|
261
160
|
/**
|
|
262
|
-
*
|
|
263
|
-
*
|
|
161
|
+
* Ensure that the select column
|
|
162
|
+
* item has the selected class
|
|
264
163
|
*/
|
|
265
|
-
|
|
164
|
+
opt.selected = selected;
|
|
165
|
+
if (selected) {
|
|
166
|
+
button.classList.add(PICKER_OPT_SELECTED);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
button.classList.remove(PICKER_OPT_SELECTED);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
this.col.prevSelected = prevSelected;
|
|
173
|
+
if (saveY) {
|
|
174
|
+
this.y = y;
|
|
175
|
+
}
|
|
176
|
+
if (this.lastIndex !== selectedIndex) {
|
|
177
|
+
// have not set a last index yet
|
|
178
|
+
hapticSelectionChanged();
|
|
179
|
+
this.lastIndex = selectedIndex;
|
|
266
180
|
}
|
|
267
181
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
this.setPickerItemActiveState(activeItem, true);
|
|
291
|
-
}
|
|
292
|
-
this.initializeScrollListener();
|
|
182
|
+
decelerate() {
|
|
183
|
+
if (this.velocity !== 0) {
|
|
184
|
+
// still decelerating
|
|
185
|
+
this.velocity *= DECELERATION_FRICTION;
|
|
186
|
+
// do not let it go slower than a velocity of 1
|
|
187
|
+
this.velocity = this.velocity > 0 ? Math.max(this.velocity, 1) : Math.min(this.velocity, -1);
|
|
188
|
+
let y = this.y + this.velocity;
|
|
189
|
+
if (y > this.minY) {
|
|
190
|
+
// whoops, it's trying to scroll up farther than the options we have!
|
|
191
|
+
y = this.minY;
|
|
192
|
+
this.velocity = 0;
|
|
193
|
+
}
|
|
194
|
+
else if (y < this.maxY) {
|
|
195
|
+
// gahh, it's trying to scroll down farther than we can!
|
|
196
|
+
y = this.maxY;
|
|
197
|
+
this.velocity = 0;
|
|
198
|
+
}
|
|
199
|
+
this.update(y, 0, true);
|
|
200
|
+
const notLockedIn = Math.round(y) % this.optHeight !== 0 || Math.abs(this.velocity) > 1;
|
|
201
|
+
if (notLockedIn) {
|
|
202
|
+
// isn't locked in yet, keep decelerating until it is
|
|
203
|
+
this.rafId = requestAnimationFrame(() => this.decelerate());
|
|
293
204
|
}
|
|
294
205
|
else {
|
|
295
|
-
this.
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
this.destroyScrollListener = undefined;
|
|
299
|
-
}
|
|
206
|
+
this.velocity = 0;
|
|
207
|
+
this.emitColChange();
|
|
208
|
+
hapticSelectionEnd();
|
|
300
209
|
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
//
|
|
306
|
-
|
|
210
|
+
}
|
|
211
|
+
else if (this.y % this.optHeight !== 0) {
|
|
212
|
+
// needs to still get locked into a position so options line up
|
|
213
|
+
const currentPos = Math.abs(this.y % this.optHeight);
|
|
214
|
+
// create a velocity in the direction it needs to scroll
|
|
215
|
+
this.velocity = currentPos > this.optHeight / 2 ? 1 : -1;
|
|
216
|
+
this.decelerate();
|
|
307
217
|
}
|
|
308
218
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
219
|
+
indexForY(y) {
|
|
220
|
+
return Math.min(Math.max(Math.abs(Math.round(y / this.optHeight)), 0), this.col.options.length - 1);
|
|
221
|
+
}
|
|
222
|
+
onStart(detail) {
|
|
223
|
+
// We have to prevent default in order to block scrolling under the picker
|
|
224
|
+
// but we DO NOT have to stop propagation, since we still want
|
|
225
|
+
// some "click" events to capture
|
|
226
|
+
if (detail.event.cancelable) {
|
|
227
|
+
detail.event.preventDefault();
|
|
228
|
+
}
|
|
229
|
+
detail.event.stopPropagation();
|
|
230
|
+
hapticSelectionStart();
|
|
231
|
+
// reset everything
|
|
232
|
+
if (this.rafId !== undefined)
|
|
233
|
+
cancelAnimationFrame(this.rafId);
|
|
234
|
+
const options = this.col.options;
|
|
235
|
+
let minY = options.length - 1;
|
|
236
|
+
let maxY = 0;
|
|
237
|
+
for (let i = 0; i < options.length; i++) {
|
|
238
|
+
if (!options[i].disabled) {
|
|
239
|
+
minY = Math.min(minY, i);
|
|
240
|
+
maxY = Math.max(maxY, i);
|
|
322
241
|
}
|
|
323
242
|
}
|
|
243
|
+
this.minY = -(minY * this.optHeight);
|
|
244
|
+
this.maxY = -(maxY * this.optHeight);
|
|
324
245
|
}
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
246
|
+
onMove(detail) {
|
|
247
|
+
if (detail.event.cancelable) {
|
|
248
|
+
detail.event.preventDefault();
|
|
249
|
+
}
|
|
250
|
+
detail.event.stopPropagation();
|
|
251
|
+
// update the scroll position relative to pointer start position
|
|
252
|
+
let y = this.y + detail.deltaY;
|
|
253
|
+
if (y > this.minY) {
|
|
254
|
+
// scrolling up higher than scroll area
|
|
255
|
+
y = Math.pow(y, 0.8);
|
|
256
|
+
this.bounceFrom = y;
|
|
257
|
+
}
|
|
258
|
+
else if (y < this.maxY) {
|
|
259
|
+
// scrolling down below scroll area
|
|
260
|
+
y += Math.pow(this.maxY - y, 0.9);
|
|
261
|
+
this.bounceFrom = y;
|
|
330
262
|
}
|
|
263
|
+
else {
|
|
264
|
+
this.bounceFrom = 0;
|
|
265
|
+
}
|
|
266
|
+
this.update(y, 0, false);
|
|
331
267
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
* @internal
|
|
338
|
-
*/
|
|
339
|
-
async setValue(value) {
|
|
340
|
-
if (this.value === value) {
|
|
268
|
+
onEnd(detail) {
|
|
269
|
+
if (this.bounceFrom > 0) {
|
|
270
|
+
// bounce back up
|
|
271
|
+
this.update(this.minY, 100, true);
|
|
272
|
+
this.emitColChange();
|
|
341
273
|
return;
|
|
342
274
|
}
|
|
343
|
-
this.
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
275
|
+
else if (this.bounceFrom < 0) {
|
|
276
|
+
// bounce back down
|
|
277
|
+
this.update(this.maxY, 100, true);
|
|
278
|
+
this.emitColChange();
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
this.velocity = clamp(-MAX_PICKER_SPEED, detail.velocityY * 23, MAX_PICKER_SPEED);
|
|
282
|
+
if (this.velocity === 0 && detail.deltaY === 0) {
|
|
283
|
+
const opt = detail.event.target.closest('.picker-opt');
|
|
284
|
+
if (opt === null || opt === void 0 ? void 0 : opt.hasAttribute('opt-index')) {
|
|
285
|
+
this.setSelected(parseInt(opt.getAttribute('opt-index'), 10), TRANSITION_DURATION);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
this.y += detail.deltaY;
|
|
290
|
+
if (Math.abs(detail.velocityY) < 0.05) {
|
|
291
|
+
const isScrollingUp = detail.deltaY > 0;
|
|
292
|
+
const optHeightFraction = (Math.abs(this.y) % this.optHeight) / this.optHeight;
|
|
293
|
+
if (isScrollingUp && optHeightFraction > 0.5) {
|
|
294
|
+
this.velocity = Math.abs(this.velocity) * -1;
|
|
295
|
+
}
|
|
296
|
+
else if (!isScrollingUp && optHeightFraction <= 0.5) {
|
|
297
|
+
this.velocity = Math.abs(this.velocity);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
this.decelerate();
|
|
353
301
|
}
|
|
354
302
|
}
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
return false;
|
|
303
|
+
refresh(forceRefresh, animated) {
|
|
304
|
+
var _a;
|
|
305
|
+
let min = this.col.options.length - 1;
|
|
306
|
+
let max = 0;
|
|
307
|
+
const options = this.col.options;
|
|
308
|
+
for (let i = 0; i < options.length; i++) {
|
|
309
|
+
if (!options[i].disabled) {
|
|
310
|
+
min = Math.min(min, i);
|
|
311
|
+
max = Math.max(max, i);
|
|
365
312
|
}
|
|
366
|
-
|
|
367
|
-
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Only update selected value if column has a
|
|
316
|
+
* velocity of 0. If it does not, then the
|
|
317
|
+
* column is animating might land on
|
|
318
|
+
* a value different than the value at
|
|
319
|
+
* selectedIndex
|
|
320
|
+
*/
|
|
321
|
+
if (this.velocity !== 0) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
const selectedIndex = clamp(min, (_a = this.col.selectedIndex) !== null && _a !== void 0 ? _a : 0, max);
|
|
325
|
+
if (this.col.prevSelected !== selectedIndex || forceRefresh) {
|
|
326
|
+
const y = selectedIndex * this.optHeight * -1;
|
|
327
|
+
const duration = animated ? TRANSITION_DURATION : 0;
|
|
328
|
+
this.velocity = 0;
|
|
329
|
+
this.update(y, duration, true);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
onDomChange(forceRefresh, animated) {
|
|
333
|
+
const colEl = this.optsEl;
|
|
334
|
+
if (colEl) {
|
|
335
|
+
// DOM READ
|
|
336
|
+
// We perfom a DOM read over a rendered item, this needs to happen after the first render or after the the column has changed
|
|
337
|
+
this.optHeight = colEl.firstElementChild ? colEl.firstElementChild.clientHeight : 0;
|
|
338
|
+
}
|
|
339
|
+
this.refresh(forceRefresh, animated);
|
|
368
340
|
}
|
|
369
341
|
render() {
|
|
370
|
-
const
|
|
342
|
+
const col = this.col;
|
|
371
343
|
const mode = getIonMode(this);
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
* the attribute can be moved to datetime.tsx and set on every
|
|
376
|
-
* instance of ion-picker-column there instead.
|
|
377
|
-
* TODO FW-5580 remove exportparts
|
|
378
|
-
*/
|
|
379
|
-
return (h(Host, { exportparts: `${PICKER_ITEM_PART}, ${PICKER_ITEM_ACTIVE_PART}`, disabled: pickerDisabled, class: createColorClasses(color, {
|
|
380
|
-
[mode]: true,
|
|
381
|
-
['picker-column-active']: isActive,
|
|
382
|
-
['picker-column-numeric-input']: numericInput,
|
|
383
|
-
}) }, h("slot", { name: "prefix" }), h("div", { class: "picker-opts", tabindex: pickerDisabled ? undefined : 0, ref: (el) => {
|
|
384
|
-
this.scrollEl = el;
|
|
385
|
-
} }, h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("slot", null), h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { class: "picker-item picker-item-empty", "aria-hidden": "true" }, "\u00A0")), h("slot", { name: "suffix" })));
|
|
344
|
+
return (h(Host, { class: Object.assign({ [mode]: true, 'picker-col': true, 'picker-opts-left': this.col.align === 'left', 'picker-opts-right': this.col.align === 'right' }, getClassMap(col.cssClass)), style: {
|
|
345
|
+
'max-width': this.col.columnWidth,
|
|
346
|
+
} }, col.prefix && (h("div", { class: "picker-prefix", style: { width: col.prefixWidth } }, col.prefix)), h("div", { class: "picker-opts", style: { maxWidth: col.optionsWidth }, ref: (el) => (this.optsEl = el) }, col.options.map((o, index) => (h("button", { "aria-label": o.ariaLabel, class: { 'picker-opt': true, 'picker-opt-disabled': !!o.disabled }, "opt-index": index }, o.text)))), col.suffix && (h("div", { class: "picker-suffix", style: { width: col.suffixWidth } }, col.suffix))));
|
|
386
347
|
}
|
|
387
348
|
get el() { return this; }
|
|
388
349
|
static get watchers() { return {
|
|
389
|
-
"
|
|
350
|
+
"col": ["colChanged"]
|
|
390
351
|
}; }
|
|
391
352
|
static get style() { return {
|
|
392
353
|
ios: pickerColumnIosCss,
|
|
393
354
|
md: pickerColumnMdCss
|
|
394
355
|
}; }
|
|
395
|
-
}, [
|
|
396
|
-
"
|
|
397
|
-
"items": [16],
|
|
398
|
-
"value": [1032],
|
|
399
|
-
"color": [513],
|
|
400
|
-
"numericInput": [4, "numeric-input"],
|
|
401
|
-
"isActive": [32],
|
|
402
|
-
"scrollActiveItemIntoView": [64],
|
|
403
|
-
"setValue": [64],
|
|
404
|
-
"setFocus": [64]
|
|
356
|
+
}, [32, "ion-picker-column", {
|
|
357
|
+
"col": [16]
|
|
405
358
|
}, undefined, {
|
|
406
|
-
"
|
|
359
|
+
"col": ["colChanged"]
|
|
407
360
|
}]);
|
|
408
|
-
const
|
|
409
|
-
const
|
|
410
|
-
const
|
|
361
|
+
const PICKER_OPT_SELECTED = 'picker-opt-selected';
|
|
362
|
+
const DECELERATION_FRICTION = 0.97;
|
|
363
|
+
const MAX_PICKER_SPEED = 90;
|
|
364
|
+
const TRANSITION_DURATION = 150;
|
|
411
365
|
function defineCustomElement() {
|
|
412
366
|
if (typeof customElements === "undefined") {
|
|
413
367
|
return;
|
|
@@ -416,10 +370,10 @@ function defineCustomElement() {
|
|
|
416
370
|
components.forEach(tagName => { switch (tagName) {
|
|
417
371
|
case "ion-picker-column":
|
|
418
372
|
if (!customElements.get(tagName)) {
|
|
419
|
-
customElements.define(tagName,
|
|
373
|
+
customElements.define(tagName, PickerColumnCmp);
|
|
420
374
|
}
|
|
421
375
|
break;
|
|
422
376
|
} });
|
|
423
377
|
}
|
|
424
378
|
|
|
425
|
-
export {
|
|
379
|
+
export { PickerColumnCmp as P, defineCustomElement as d };
|