Nav apraksta

index.js 16KB

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