Add a nicer interface for prompts
This commit is contained in:
parent
197d8d1f3b
commit
9b938f2236
1 changed files with 87 additions and 0 deletions
87
chrome/content/zotero/xpcom/prompt.js
Normal file
87
chrome/content/zotero/xpcom/prompt.js
Normal file
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
***** BEGIN LICENSE BLOCK *****
|
||||
|
||||
Copyright © 2022 Corporation for Digital Scholarship
|
||||
Vienna, Virginia, USA
|
||||
http://zotero.org
|
||||
|
||||
This file is part of Zotero.
|
||||
|
||||
Zotero is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Zotero is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
***** END LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
Zotero.Prompt = {
|
||||
BUTTON_TITLE_OK: Services.prompt.BUTTON_TITLE_OK,
|
||||
BUTTON_TITLE_CANCEL: Services.prompt.BUTTON_TITLE_CANCEL,
|
||||
BUTTON_TITLE_YES: Services.prompt.BUTTON_TITLE_YES,
|
||||
BUTTON_TITLE_NO: Services.prompt.BUTTON_TITLE_NO,
|
||||
BUTTON_TITLE_SAVE: Services.prompt.BUTTON_TITLE_SAVE,
|
||||
BUTTON_TITLE_DONT_SAVE: Services.prompt.BUTTON_TITLE_DONT_SAVE,
|
||||
BUTTON_TITLE_REVERT: Services.prompt.BUTTON_TITLE_REVERT,
|
||||
|
||||
/**
|
||||
* A wrapper around XPCOM's Services.prompt.confirmEx()
|
||||
* but with a friendlier interface.
|
||||
*
|
||||
* Button text can use special static variables from
|
||||
* Zotero.Prompt
|
||||
*
|
||||
* @param options
|
||||
* - {mozIDOMWindowProxy} window - The parent window or null.
|
||||
* - {String} title - Text to appear in the title of the dialog.
|
||||
* - {String} text - Text to appear in the body of the dialog.
|
||||
* - {String|Number} button0 - Button 0 text
|
||||
* - {String|Number} button1 - Button 1 text
|
||||
* - {String|Number} button2 - Button 2 text
|
||||
* - {String} checkLabel - Text to appear with the checkbox.
|
||||
* - {Object} checkbox - Contains the initial checked state of the
|
||||
* checkbox when this method is called and the final checked
|
||||
* state after this method returns. Either {} or { value: true/false }.
|
||||
* - {Number} defaultButton - The index of default button. 0 by default
|
||||
* - {Boolean} delayButtons - Make the buttons initially disabled and enable them after some period
|
||||
* so that the user doesn't click through the dialog without reading it.
|
||||
* @returns {Number} The index of the button pressed.
|
||||
*/
|
||||
confirm(options = {}) {
|
||||
let { window: win, title, text, button0, button1, button2, checkLabel, checkbox, defaultButton, delayButtons } = options;
|
||||
if (!win) win = null;
|
||||
if (!title) throw new Error('`title` is required');
|
||||
if (!text) throw new Error('`text` is required');
|
||||
if (!button0 && !button1 && !button2) {
|
||||
throw new Error('At least one button is required');
|
||||
}
|
||||
if (checkLabel && (!checkbox || typeof checkbox != 'object')) {
|
||||
throw new Error('`checkLabel` provided without `checkbox` option');
|
||||
}
|
||||
let flags = delayButtons ? Services.prompt.BUTTON_DELAY_ENABLE : 0;
|
||||
if (typeof button0 == 'number') flags += Services.prompt.BUTTON_POS_0 * button0;
|
||||
else if (typeof button0 == 'string') flags += Services.prompt.BUTTON_POS_0 * Services.prompt.BUTTON_TITLE_IS_STRING;
|
||||
if (typeof button1 == 'number') flags += Services.prompt.BUTTON_POS_1 * button1;
|
||||
else if (typeof button1 == 'string') flags += Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_IS_STRING;
|
||||
if (typeof button2 == 'number') flags += Services.prompt.BUTTON_POS_2 * button2;
|
||||
else if (typeof button2 == 'string') flags += Services.prompt.BUTTON_POS_2 * Services.prompt.BUTTON_TITLE_IS_STRING;
|
||||
if (defaultButton) flags += defaultButton == 1 ? Services.prompt.BUTTON_POS_1_DEFAULT : Services.prompt.BUTTON_POS_2_DEFAULT;
|
||||
return Services.prompt.confirmEx(
|
||||
win, title, text, flags,
|
||||
typeof button0 == 'number' ? null : button0,
|
||||
typeof button1 == 'number' ? null : button1,
|
||||
typeof button2 == 'number' ? null : button2,
|
||||
checkLabel, checkbox
|
||||
);
|
||||
}
|
||||
};
|
Loading…
Reference in a new issue