/** * Dialog behavior is an abstraction to reduce the enormous amount of repitition triggi-dialog causes. * Each public function always takes an object with only the necessary fields in there. If they correspond * to a triggi-dialog field they are named exactly the same. * * Please make sure that any callback is bound to the context that it needs before passing it. * Also make sure any string is localized before it is passed! */ // @polymerBehavior DialogBehavior DialogBehavior = { _openDialog: function(dialogData) { dialogData = this.extend({ parent: this, localize: localize }, dialogData); this.fire('iron-signal', { name: 'show-dialog', data: { dialogData: dialogData } }); }, /** START Info dialogs **/ infoDialog: function(data) { var dialogData = { title: data.title, infoTitle: data.infoTitle, infoDetail: data.infoDetail, onClose: data.onClose, closeButton: data.closeButton || localize('OK'), type: 'info' }; this._openDialog(dialogData); }, errorDialog: function(data) { var dialogData = { infoDetail: data.infoDetail, onClose: data.onClose, title: data.title || localize('Error'), infoTitle: data.infoTitle || localize('Something went wrong...'), closeButton: data.closeButton || localize('OK') }; this.infoDialog(dialogData); }, /** END Info dialogs **/ /** START Question dialogs **/ questionDialog: function(data) { var dialogData = { onConfirm: data.onConfirm, onCancel: data.onCancel, title: data.title, subtitle: data.subtitle, cancel: data.cancel, confirm: data.confirm, warning: data.warning, type: 'question' }; this._openDialog(dialogData); }, discardTriggableDialog: function(data) { var dialogData = { onConfirm: data.onConfirm, subtitle: localize("You have unsaved changes in your $1. Going back will discard these changes.", data.discardType), title: localize("Discard changes?"), cancel: localize("Cancel"), confirm: localize("Discard") }; this.questionDialog(dialogData); }, deleteTriggableDialog: function(data) { var dialogData = { onConfirm: data.onConfirm, title: localize("Delete $1", data.deleteType), subtitle: localize("You are about to delete this $1", data.deleteType), warning: this.localize("Are you sure?") + " " + this.localize("This action cannot be undone."), cancel: localize("Cancel"), confirm: localize("Yes delete it") }; this.questionDialog(dialogData); }, /** END Question dialogs **/ /** START Option dialogs **/ optionDialog: function(data) { var dialogData = { onConfirm: data.onConfirm, title: data.title, subtitle: data.subtitle, options: data.options, selected: data.selected, cancel: data.cancel || localize('Cancel'), confirm: data.confirm || localize('Confirm'), type: 'option' }; this._openDialog(dialogData); }, changeLabelDialog: function(data) { var that = this; var defaultCategories = [ 'cool', 'efficient', 'comfortable', 'healthy', 'social', 'sustainable' ].map(function(category) { return { id: category, title: LocalizedBehavior.capitalizeString(LocalizedBehavior.localizedStrings('triggable').categories[category]), color: getTriggiColor(category) }; }); function getOptions(userCategories) { return R.union(userCategories, defaultCategories); } var dialogData = { onConfirm: data.onConfirm, options: getOptions(data.options), selected: data.selected, subtitle: localize("Choose a label for your $1", data.triggableType), addTitle: localize("Or create a new label"), addButton: localize("Add new label"), title: localize("Select label"), cancel: localize("Cancel"), confirm: localize("Confirm"), customFn1: function() { that.nameColorDialog({ onConfirm: function(self, dialog, category, color) { var categoryObject = { id: category.toLowerCase(), title: category, color: color, isNew: true, }; data.options.unshift(categoryObject); data.onConfirm(self, dialog, categoryObject.id, categoryObject.color); }, onCancel: function() { that._openDialog(dialogData); }, current: '#554df2', validate: function(value) { var existing = data.options.find(function(category) { return value.toLowerCase() === category.id; }); return !existing; }, siriAvailable: false, title: localize("Add label"), cancel: localize("Cancel"), confirm: localize("Confirm"), }); }, type: 'option' }; this._openDialog(dialogData); }, /** END Option dialogs **/ /** START name dialogs **/ nameColorDialog: function(data) { var dialogData = { onConfirm: data.onConfirm, onCancel: data.onCancel, title: data.title, subtitle: data.subtitle, oldValue: data.oldValue, current: data.current, options: data.options, siriAvailable: data.siriAvailable !== false && (typeof cordova === "undefined" || (device.platform === "iOS" && Number(device.version.split(".")[0]) >= 12)), button: data.button, validate: data.validate, customFn1: data.onSiriButton, cancel: data.cancel || localize('Cancel'), confirm: data.confirm || localize('Confirm'), type: 'nameColor' }; this._openDialog(dialogData); }, nameDialog: function(data) { var dialogData = { onConfirm: data.onConfirm, onCancel: data.onCancel, title: data.title, subtitle: data.subtitle, oldValue: data.oldValue, cancel: data.cancel || localize('Cancel'), confirm: data.confirm || localize('Confirm'), type: 'textInput' }; this._openDialog(dialogData); }, changeTitleDialog: function(data) { var dialogData = { onConfirm: data.onConfirm, title: localize("Rename $1", data.renameType), subtitle: localize("Choose a new name for your $1", data.renameType), oldValue: data.oldValue, cancel: localize("Cancel"), confirm: localize("Rename") }; this.nameDialog(dialogData); }, /** END name dialogs **/ /** START select dialogs **/ selectDialog: function(data) { var dialogData = { onConfirm: data.onConfirm, onCancel: data.onCancel, title: data.title, subtitle: data.subtitle, oldValue: data.oldValue, current: data.current, options: data.options, attrForSelected: data.attrForSelected || 'name', cancel: localize("Cancel"), confirm: localize("Change"), type: 'select' }; this._openDialog(dialogData); }, /** END select dialogs **/ /** START random crap dialogs **/ deleteChannelDialog: function(data) { var dialogData = { onConfirm: data.onConfirm, channelColor: data.channelColor, channelIcon: data.channelIcon, title: data.title, subtitle: data.subtitle, warning: this.localize("Are you sure?"), cancel: this.localize("Cancel"), confirm: this.localize("Yes delete it"), type: 'deleteChannel' }; this._openDialog(dialogData); }, deleteUnitDialog: function(data) { var dialogData = { onConfirm: data.onConfirm, objectTitle: data.objectTitle, extraText: data.extraText, title: this.localize('Delete $1', data.deleteType), subtitle: this.localize('You are about to delete this $1', data.deleteType), warning: this.localize('Are you sure?') + ' ' + this.localize('This action cannot be undone.'), // For fucking buttons the type is deleteButton?! type: data.type || 'deleteUnit', cancel: localize("Cancel"), confirm: localize("Yes delete it") }; this._openDialog(dialogData); }, deletePhoneDialog: function(data) { var dialogData = { onConfirm: data.onConfirm, phone: data.phone, title: this.localize("Delete $1", this.localize("phone")), subtitle: this.localize("You are about to delete $1", this.localize("this phone")), warning: this.localize("Are you sure?") + " " + this.localize("This action cannot be undone."), type: 'deletePhone', cancel: localize("Cancel"), confirm: localize("Yes delete it") }; this._openDialog(dialogData); }, closeDialog: function() { this.fire('iron-signal', { name: 'close-dialog' }); } /** END random crap dialogs **/ };