Без опису

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. import _toConsumableArray from 'babel-runtime/helpers/toConsumableArray';
  2. import _Object$getPrototypeOf from 'babel-runtime/core-js/object/get-prototype-of';
  3. import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
  4. import _createClass from 'babel-runtime/helpers/createClass';
  5. import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
  6. import _get from 'babel-runtime/helpers/get';
  7. import _inherits from 'babel-runtime/helpers/inherits';
  8. /*
  9. Copyright 2013-2015 ASIAL CORPORATION
  10. Licensed under the Apache License, Version 2.0 (the "License");
  11. you may not use this file except in compliance with the License.
  12. You may obtain a copy of the License at
  13. http://www.apache.org/licenses/LICENSE-2.0
  14. Unless required by applicable law or agreed to in writing, software
  15. distributed under the License is distributed on an "AS IS" BASIS,
  16. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17. See the License for the specific language governing permissions and
  18. limitations under the License.
  19. */
  20. import onsElements from '../../ons/elements';
  21. import util from '../../ons/util';
  22. import autoStyle from '../../ons/autostyle';
  23. import ModifierUtil from '../../ons/internal/modifier-util';
  24. import AnimatorFactory from '../../ons/internal/animator-factory';
  25. import { ActionSheetAnimator, IOSActionSheetAnimator, MDActionSheetAnimator } from './animator';
  26. import platform from '../../ons/platform';
  27. import BaseDialogElement from '../base/base-dialog';
  28. import contentReady from '../../ons/content-ready';
  29. var scheme = {
  30. '.action-sheet': 'action-sheet--*',
  31. '.action-sheet-mask': 'action-sheet-mask--*',
  32. '.action-sheet-title': 'action-sheet-title--*'
  33. };
  34. var _animatorDict = {
  35. 'default': function _default() {
  36. return platform.isAndroid() ? MDActionSheetAnimator : IOSActionSheetAnimator;
  37. },
  38. 'none': ActionSheetAnimator
  39. };
  40. /**
  41. * @element ons-action-sheet
  42. * @category dialog
  43. * @description
  44. * [en]
  45. * Action/bottom sheet that is displayed on top of current screen.
  46. *
  47. * This element can either be attached directly to the `<body>` or dynamically created from a template using the `ons.createElement(template, { append: true })` utility function and the `<template>` tag.
  48. *
  49. * The action sheet is useful for displaying a list of options and asking the user to make a decision. A `ons-action-sheet-button` is provided for this purpose, although it can contain any type of content.
  50. *
  51. * It will automatically be displayed as Material Design (bottom sheet) when running on an Android device.
  52. * [/en]
  53. * [ja]
  54. * アクションシート、もしくはボトムシートを現在のスクリーン上に表示します。
  55. *
  56. * この要素は、`<body>`要素に直接アタッチされるか、もしくは`ons.createElement(template, { append: true })`と`<template>`タグを使ってテンプレートから動的に生成されます。
  57. *
  58. * アクションシートは、選択肢のリストを表示してユーザーに尋ねるのに便利です。`ons-action-sheet-button`は、この要素の中に置くために提供されていますが、それ以外にも他のどのような要素を含むことができます。
  59. *
  60. * Androidデバイスで実行されるときには、自動的にマテリアルデザイン(ボトムシート)として表示されます。
  61. * [/ja]
  62. * @modifier material
  63. * [en]Display a Material Design bottom sheet.[/en]
  64. * [ja]マテリアルデザインのボトムシートを表示します。[/ja]
  65. * @tutorial vanilla/reference/action-sheet
  66. * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
  67. * @seealso ons-popover
  68. * [en]`<ons-popover>` component[/en]
  69. * [ja]ons-popoverコンポーネント[/ja]
  70. * @seealso ons-modal
  71. * [en]`<ons-modal>` component[/en]
  72. * [ja]ons-modalコンポーネント[/ja]
  73. * @example
  74. * <ons-action-sheet id="sheet">
  75. * <ons-action-sheet-button>Label</ons-action-sheet-button>
  76. * <ons-action-sheet-button>Label</ons-action-sheet-button>
  77. * </ons-action-sheet>
  78. *
  79. * <script>
  80. * document.getElementById('sheet').show();
  81. * </script>
  82. */
  83. var ActionSheetElement = function (_BaseDialogElement) {
  84. _inherits(ActionSheetElement, _BaseDialogElement);
  85. /**
  86. * @event preshow
  87. * @description
  88. * [en]Fired just before the action sheet is displayed.[/en]
  89. * [ja]ダイアログが表示される直前に発火します。[/ja]
  90. * @param {Object} event [en]Event object.[/en]
  91. * @param {Object} event.actionSheet
  92. * [en]Component object.[/en]
  93. * [ja]コンポーネントのオブジェクト。[/ja]
  94. * @param {Function} event.cancel
  95. * [en]Execute this function to stop the action sheet from being shown.[/en]
  96. * [ja]この関数を実行すると、ダイアログの表示がキャンセルされます。[/ja]
  97. */
  98. /**
  99. * @event postshow
  100. * @description
  101. * [en]Fired just after the action sheet is displayed.[/en]
  102. * [ja]ダイアログが表示された直後に発火します。[/ja]
  103. * @param {Object} event [en]Event object.[/en]
  104. * @param {Object} event.actionSheet
  105. * [en]Component object.[/en]
  106. * [ja]コンポーネントのオブジェクト。[/ja]
  107. */
  108. /**
  109. * @event prehide
  110. * @description
  111. * [en]Fired just before the action sheet is hidden.[/en]
  112. * [ja]ダイアログが隠れる直前に発火します。[/ja]
  113. * @param {Object} event [en]Event object.[/en]
  114. * @param {Object} event.actionSheet
  115. * [en]Component object.[/en]
  116. * [ja]コンポーネントのオブジェクト。[/ja]
  117. * @param {Function} event.cancel
  118. * [en]Execute this function to stop the action sheet from being hidden.[/en]
  119. * [ja]この関数を実行すると、ダイアログの非表示がキャンセルされます。[/ja]
  120. */
  121. /**
  122. * @event posthide
  123. * @description
  124. * [en]Fired just after the action sheet is hidden.[/en]
  125. * [ja]ダイアログが隠れた後に発火します。[/ja]
  126. * @param {Object} event [en]Event object.[/en]
  127. * @param {Object} event.actionSheet
  128. * [en]Component object.[/en]
  129. * [ja]コンポーネントのオブジェクト。[/ja]
  130. */
  131. /**
  132. * @attribute title
  133. * @type {String}
  134. * @description
  135. * [en]Optional title of the action sheet. A new element will be created containing this string.[/en]
  136. * [ja]アクションシートのタイトルを指定します。ここで指定した文字列を含む新しい要素が作成されます。[/ja]
  137. */
  138. /**
  139. * @attribute modifier
  140. * @type {String}
  141. * @description
  142. * [en]The appearance of the action sheet.[/en]
  143. * [ja]ダイアログの表現を指定します。[/ja]
  144. */
  145. /**
  146. * @attribute cancelable
  147. * @description
  148. * [en]If this attribute is set the action sheet can be closed by tapping the background or by pressing the back button on Android devices.[/en]
  149. * [ja]この属性が設定されると、アクションシートの背景やAndroidデバイスのバックボタンを推すことでアクションシートが閉じるようになります。[/ja]
  150. */
  151. /**
  152. * @attribute disabled
  153. * @description
  154. * [en]If this attribute is set the action sheet is disabled.[/en]
  155. * [ja]この属性がある時、ダイアログはdisabled状態になります。[/ja]
  156. */
  157. /**
  158. * @attribute animation
  159. * @type {String}
  160. * @default default
  161. * @description
  162. * [en]The animation used when showing and hiding the action sheet. Can be either `"none"` or `"default"`.[/en]
  163. * [ja]ダイアログを表示する際のアニメーション名を指定します。"none"もしくは"default"を指定できます。[/ja]
  164. */
  165. /**
  166. * @attribute animation-options
  167. * @type {Expression}
  168. * @description
  169. * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
  170. * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
  171. */
  172. /**
  173. * @attribute mask-color
  174. * @type {String}
  175. * @default rgba(0, 0, 0, 0.2)
  176. * @description
  177. * [en]Color of the background mask. Default is `"rgba(0, 0, 0, 0.2)"`.[/en]
  178. * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
  179. */
  180. function ActionSheetElement() {
  181. _classCallCheck(this, ActionSheetElement);
  182. var _this = _possibleConstructorReturn(this, (ActionSheetElement.__proto__ || _Object$getPrototypeOf(ActionSheetElement)).call(this));
  183. contentReady(_this, function () {
  184. return _this._compile();
  185. });
  186. return _this;
  187. }
  188. _createClass(ActionSheetElement, [{
  189. key: '_updateAnimatorFactory',
  190. value: function _updateAnimatorFactory() {
  191. return new AnimatorFactory({
  192. animators: _animatorDict,
  193. baseClass: ActionSheetAnimator,
  194. baseClassName: 'ActionSheetAnimator',
  195. defaultAnimation: this.getAttribute('animation')
  196. });
  197. }
  198. }, {
  199. key: '_compile',
  200. value: function _compile() {
  201. autoStyle.prepare(this);
  202. this.style.display = 'none';
  203. this.style.zIndex = 10001;
  204. /* Expected result:
  205. * <ons-action-sheet>
  206. * <div class="action-sheet-mask"></div>
  207. * <div class="action-sheet">
  208. * <div class="action-sheet-title></div>
  209. * ...
  210. * </div>
  211. * </ons-action-sheet>
  212. */
  213. if (!this._sheet) {
  214. var sheet = document.createElement('div');
  215. sheet.classList.add('action-sheet');
  216. while (this.firstChild) {
  217. sheet.appendChild(this.firstChild);
  218. }
  219. this.appendChild(sheet);
  220. }
  221. if (!this._title && this.hasAttribute('title')) {
  222. var title = document.createElement('div');
  223. title.innerHTML = this.getAttribute('title');
  224. title.classList.add('action-sheet-title');
  225. this._sheet.insertBefore(title, this._sheet.firstChild);
  226. }
  227. if (!this._mask) {
  228. var mask = document.createElement('div');
  229. mask.classList.add('action-sheet-mask');
  230. this.insertBefore(mask, this.firstChild);
  231. }
  232. this._sheet.style.zIndex = 20001;
  233. this._mask.style.zIndex = 20000;
  234. ModifierUtil.initModifier(this, this._scheme);
  235. }
  236. }, {
  237. key: '_updateTitle',
  238. value: function _updateTitle() {
  239. if (this._title) {
  240. this._title.innerHTML = this.getAttribute('title');
  241. }
  242. }
  243. /**
  244. * @property onDeviceBackButton
  245. * @type {Object}
  246. * @description
  247. * [en]Back-button handler.[/en]
  248. * [ja]バックボタンハンドラ。[/ja]
  249. */
  250. /**
  251. * @method show
  252. * @signature show([options])
  253. * @param {Object} [options]
  254. * [en]Parameter object.[/en]
  255. * [ja]オプションを指定するオブジェクト。[/ja]
  256. * @param {String} [options.animation]
  257. * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
  258. * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定します。[/ja]
  259. * @param {String} [options.animationOptions]
  260. * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
  261. * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
  262. * @param {Function} [options.callback]
  263. * [en]This function is called after the action sheet has been revealed.[/en]
  264. * [ja]ダイアログが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
  265. * @description
  266. * [en]Show the action sheet.[/en]
  267. * [ja]ダイアログを開きます。[/ja]
  268. * @return {Promise} Resolves to the displayed element.
  269. */
  270. /**
  271. * @method hide
  272. * @signature hide([options])
  273. * @param {Object} [options]
  274. * [en]Parameter object.[/en]
  275. * [ja]オプションを指定するオブジェクト。[/ja]
  276. * @param {String} [options.animation]
  277. * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
  278. * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定できます。[/ja]
  279. * @param {String} [options.animationOptions]
  280. * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
  281. * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/ja]
  282. * @param {Function} [options.callback]
  283. * [en]This functions is called after the action sheet has been hidden.[/en]
  284. * [ja]ダイアログが隠れた後に呼び出される関数オブジェクトを指定します。[/ja]
  285. * @description
  286. * [en]Hide the action sheet.[/en]
  287. * [ja]ダイアログを閉じます。[/ja]
  288. * @return {Promise}
  289. * [en]Resolves to the hidden element[/en]
  290. * [ja]隠れた要素を解決します。[/ja]
  291. */
  292. /**
  293. * @property visible
  294. * @readonly
  295. * @type {Boolean}
  296. * @description
  297. * [en]Whether the action sheet is visible or not.[/en]
  298. * [ja]要素が見える場合に`true`。[/ja]
  299. */
  300. /**
  301. * @property disabled
  302. * @type {Boolean}
  303. * @description
  304. * [en]Whether the action sheet is disabled or not.[/en]
  305. * [ja]無効化されている場合に`true`。[/ja]
  306. */
  307. /**
  308. * @property cancelable
  309. * @type {Boolean}
  310. * @description
  311. * [en]Whether the action sheet is cancelable or not. A cancelable action sheet can be closed by tapping the background or by pressing the back button on Android devices.[/en]
  312. * [ja]アクションシートがキャンセル可能かどうかを設定します。キャンセル可能なアクションシートは、背景をタップしたりAndroidデバイスのバックボタンを推すことで閉じるようになります。[/ja]
  313. */
  314. }, {
  315. key: 'attributeChangedCallback',
  316. value: function attributeChangedCallback(name, last, current) {
  317. if (name === 'title') {
  318. this._updateTitle();
  319. } else {
  320. _get(ActionSheetElement.prototype.__proto__ || _Object$getPrototypeOf(ActionSheetElement.prototype), 'attributeChangedCallback', this).call(this, name, last, current);
  321. }
  322. }
  323. /**
  324. * @param {String} name
  325. * @param {ActionSheetAnimator} Animator
  326. */
  327. }, {
  328. key: '_scheme',
  329. get: function get() {
  330. return scheme;
  331. }
  332. }, {
  333. key: '_mask',
  334. get: function get() {
  335. return util.findChild(this, '.action-sheet-mask');
  336. }
  337. }, {
  338. key: '_sheet',
  339. get: function get() {
  340. return util.findChild(this, '.action-sheet');
  341. }
  342. }, {
  343. key: '_title',
  344. get: function get() {
  345. return this.querySelector('.action-sheet-title');
  346. }
  347. }], [{
  348. key: 'registerAnimator',
  349. value: function registerAnimator(name, Animator) {
  350. if (!(Animator.prototype instanceof ActionSheetAnimator)) {
  351. util.throwAnimator('ActionSheet');
  352. }
  353. _animatorDict[name] = Animator;
  354. }
  355. }, {
  356. key: 'observedAttributes',
  357. get: function get() {
  358. return [].concat(_toConsumableArray(_get(ActionSheetElement.__proto__ || _Object$getPrototypeOf(ActionSheetElement), 'observedAttributes', this)), ['title']);
  359. }
  360. }, {
  361. key: 'animators',
  362. get: function get() {
  363. return _animatorDict;
  364. }
  365. }, {
  366. key: 'ActionSheetAnimator',
  367. get: function get() {
  368. return ActionSheetAnimator;
  369. }
  370. }]);
  371. return ActionSheetElement;
  372. }(BaseDialogElement);
  373. export default ActionSheetElement;
  374. onsElements.ActionSheet = ActionSheetElement;
  375. customElements.define('ons-action-sheet', ActionSheetElement);