UNPKG

@pi0/framework7

Version:

Full featured mobile HTML framework for building iOS & Android apps

138 lines (123 loc) 4.05 kB
import $ from 'dom7'; import Utils from '../../utils/utils'; import Modal from '../modal/modal-class'; class Dialog extends Modal { constructor(app, params) { const extendedParams = Utils.extend({ title: app.params.dialog.title, text: undefined, content: '', buttons: [], verticalButtons: false, onClick: undefined, cssClass: undefined, on: {}, }, params); // Extends with open/close Modal methods; super(app, extendedParams); const dialog = this; const { title, text, content, buttons, verticalButtons, cssClass } = extendedParams; dialog.params = extendedParams; // Find Element let $el; if (!dialog.params.el) { const dialogClasses = ['dialog']; if (buttons.length === 0) dialogClasses.push('dialog-no-buttons'); if (buttons.length > 0) dialogClasses.push(`dialog-buttons-${buttons.length}`); if (verticalButtons) dialogClasses.push('dialog-buttons-vertical'); if (cssClass) dialogClasses.push(cssClass); let buttonsHTML = ''; if (buttons.length > 0) { buttonsHTML = ` <div class="dialog-buttons"> ${buttons.map(button => ` <span class="dialog-button${button.bold ? ' dialog-button-bold' : ''}${button.color ? ` color-${button.color}` : ''}">${button.text}</span> `).join('')} </div> `; } const dialogHtml = ` <div class="${dialogClasses.join(' ')}"> <div class="dialog-inner"> ${title ? `<div class="dialog-title">${title}</div>` : ''} ${text ? `<div class="dialog-text">${text}</div>` : ''} ${content} </div> ${buttonsHTML} </div> `; $el = $(dialogHtml); } else { $el = $(dialog.params.el); } if ($el && $el.length > 0 && $el[0].f7Modal) { return $el[0].f7Modal; } if ($el.length === 0) { return dialog.destroy(); } let $backdropEl = app.root.children('.dialog-backdrop'); if ($backdropEl.length === 0) { $backdropEl = $('<div class="dialog-backdrop"></div>'); app.root.append($backdropEl); } // Assign events function buttonOnClick(e) { const buttonEl = this; const index = $(buttonEl).index(); const button = buttons[index]; if (button.onClick) button.onClick(dialog, e); if (dialog.params.onClick) dialog.params.onClick(dialog, index); if (button.close !== false) dialog.close(); } if (buttons && buttons.length > 0) { $el.find('.dialog-button').each((index, buttonEl) => { $(buttonEl).on('click', buttonOnClick); }); dialog.on('close', () => { $el.find('.dialog-button').each((index, buttonEl) => { $(buttonEl).off('click', buttonOnClick); }); }); } Utils.extend(dialog, { app, $el, el: $el[0], $backdropEl, backdropEl: $backdropEl[0], type: 'dialog', setProgress(progress, duration) { app.progressbar.set($el.find('.progressbar'), progress, duration); return dialog; }, setText(newText) { let $textEl = $el.find('.dialog-text'); if ($textEl.length === 0) { $textEl = $('<div class="dialog-text"></div>'); if (typeof title !== 'undefined') { $textEl.insertAfter($el.find('.dialog-title')); } else { $el.find('.dialog-inner').prepend($textEl); } } $textEl.html(newText); dialog.params.text = newText; return dialog; }, setTitle(newTitle) { let $titleEl = $el.find('.dialog-title'); if ($titleEl.length === 0) { $titleEl = $('<div class="dialog-title"></div>'); $el.find('.dialog-inner').prepend($titleEl); } $titleEl.html(newTitle); dialog.params.title = newTitle; return dialog; }, }); $el[0].f7Modal = dialog; return dialog; } } export default Dialog;