Bug 990009 - Rework imipbar buttons to offer more options to the user. r=philipp
This commit is contained in:
Родитель
bf75e11a65
Коммит
3e50775372
|
@ -216,19 +216,13 @@ cal.itip = {
|
|||
/**
|
||||
* Scope: iTIP message receiver
|
||||
*
|
||||
* Gets localized texts about the message state. This returns a JS object
|
||||
* with the following structure:
|
||||
* Gets localized toolbar label about the message state and triggers buttons to show.
|
||||
* This returns a JS object with the following structure:
|
||||
*
|
||||
* {
|
||||
* label: "This is a desciptive text about the itip item",
|
||||
* button1: {
|
||||
* label: "What to show on the first button, i.e 'Decline'" +
|
||||
* "This can be null if the button is not to be shown"
|
||||
* actionMethod: "The method this triggers, i.e DECLINED",
|
||||
* },
|
||||
* // Same structure for button2/3
|
||||
* button2: { ... }
|
||||
* button3: { ... }
|
||||
* buttons: ["imipXXXButton", ...],
|
||||
* hideMenuItem: ["imipXXXButton_Option", ...]
|
||||
* }
|
||||
*
|
||||
* @see processItipItem This takes the same parameters as its optionFunc.
|
||||
|
@ -244,10 +238,7 @@ cal.itip = {
|
|||
if (itipItem.receivedMethod) {
|
||||
imipLabel = cal.itip.getMethodText(itipItem.receivedMethod);
|
||||
}
|
||||
let data = { label: imipLabel };
|
||||
for each (let btn in ["button1", "button2", "button3"]) {
|
||||
data[btn] = { label: null, actionMethod: "" };
|
||||
}
|
||||
let data = { label: imipLabel, buttons: [], hideMenuItems: [] };
|
||||
|
||||
if (rc == Components.interfaces.calIErrors.CAL_IS_READONLY) {
|
||||
// No writable calendars, tell the user about it
|
||||
|
@ -257,9 +248,8 @@ cal.itip = {
|
|||
// added/updated, we want to tell them that.
|
||||
data.label = _gs("imipBarAlreadyProcessedText");
|
||||
if (foundItems && foundItems.length) {
|
||||
data.button1.label = _gs("imipDetails.label");
|
||||
// Not a real method, but helps us decide
|
||||
data.button1.actionMethod = "X-SHOWDETAILS";
|
||||
data.buttons.push("imipDetailsButton");
|
||||
}
|
||||
} else if (Components.isSuccessCode(rc)) {
|
||||
|
||||
|
@ -270,10 +260,10 @@ cal.itip = {
|
|||
case "PUBLISH:UPDATE":
|
||||
case "REQUEST:UPDATE-MINOR":
|
||||
data.label = _gs("imipBarUpdateText");
|
||||
data.button1.label = _gs("imipUpdate.label");
|
||||
data.buttons.push("imipUpdateButton");
|
||||
break;
|
||||
case "PUBLISH":
|
||||
data.button1.label = _gs("imipAddToCalendar.label");
|
||||
data.buttons.push("imipAddButton");
|
||||
break;
|
||||
case "REQUEST:UPDATE":
|
||||
case "REQUEST:NEEDS-ACTION":
|
||||
|
@ -284,20 +274,42 @@ cal.itip = {
|
|||
data.label = _gs("imipBarProcessedNeedsAction");
|
||||
}
|
||||
|
||||
data.button1.label = _gs("imipAcceptInvitation.label");
|
||||
data.button1.actionMethod = "ACCEPTED";
|
||||
data.button2.label = _gs("imipDeclineInvitation.label");
|
||||
data.button2.actionMethod = "DECLINED";
|
||||
data.button3.label = _gs("imipAcceptTentativeInvitation.label");
|
||||
data.button3.actionMethod = "TENTATIVE";
|
||||
let isRecurringMaster = false;
|
||||
for (let item of itipItem.getItemList({})) {
|
||||
if (item.recurrenceInfo) {
|
||||
isRecurringMaster = true;
|
||||
}
|
||||
}
|
||||
if (itipItem.getItemList({}).length > 1 || isRecurringMaster) {
|
||||
data.buttons.push("imipAcceptRecurrencesButton");
|
||||
data.buttons.push("imipDeclineRecurrencesButton");
|
||||
// if imipMoreButton is used, the following should be removed to not
|
||||
// extend the number of buttons:
|
||||
data.buttons.push("imipTentativeRecurrencesButton");
|
||||
data.hideMenuItems.push("imipAcceptRecurrencesButton_Tentative");
|
||||
} else {
|
||||
data.buttons.push("imipAcceptButton");
|
||||
data.buttons.push("imipDeclineButton");
|
||||
// if imipMoreButton is used, the following should be removed to not
|
||||
// extend the number of buttons:
|
||||
data.buttons.push("imipTentativeButton");
|
||||
data.hideMenuItems.push("imipAcceptButton_Tentative");
|
||||
}
|
||||
// Add here data.buttons.push("imipMoreButton") once additional
|
||||
// options are implemented.
|
||||
// Use data.hideMenuItems.push("idOfMenuItem") to hide specific menuitems
|
||||
// from the dropdown menu of a button. This might be useful to to remove
|
||||
// a generally available option for a specific invitation, because the
|
||||
// respective feature is not available for the calendar, the invitation
|
||||
// is in or the feature is prohibited by the organizer
|
||||
break;
|
||||
}
|
||||
case "CANCEL": {
|
||||
data.button1.label = _gs("imipCancelInvitation.label");
|
||||
data.buttons.push("imipCancelledButton");
|
||||
break;
|
||||
}
|
||||
case "REFRESH": {
|
||||
data.button1.label = _gs("imipSend.label");
|
||||
data.buttons.push("imipReconfirmButton");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
|
@ -47,17 +47,36 @@
|
|||
list-style-image: url(chrome://lightning/skin/mode-switch-icons-inverted.png);
|
||||
}
|
||||
|
||||
.imip-button[action="ACCEPTED"] {
|
||||
.imipAcceptButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip-aero.png);
|
||||
-moz-image-region: rect(0px 16px 16px 0px);
|
||||
}
|
||||
|
||||
.imip-button[action="DECLINED"] {
|
||||
.imipDeclineButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip-aero.png);
|
||||
-moz-image-region: rect(0px 32px 16px 16px);
|
||||
}
|
||||
|
||||
.imip-button[action="TENTATIVE"] {
|
||||
.imipTentativeButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip-aero.png);
|
||||
-moz-image-region: rect(0px 48px 16px 32px);
|
||||
}
|
||||
|
||||
/* These buttons may also deserve an icon:
|
||||
.imipDetailsButton
|
||||
(-> open the event or summary dialog)
|
||||
.imipMoreButton
|
||||
(-> dropdown button to offer more options to the user)
|
||||
.imipAddButton
|
||||
(-> add an event to the calendar)
|
||||
.imipUpdateButton
|
||||
(-> ipdate an event in the calendar)
|
||||
.imipDeleteButton
|
||||
(-> delete an event from the calendar)
|
||||
.imipReconfirmButton
|
||||
(-> re-confirm the own participation status on organizer's request)
|
||||
.imipAcceptRecurrencesButton
|
||||
.imipDeclineRecurrencesButton
|
||||
.imipTentativeRecurrencesButton
|
||||
(-> the same functionality as above, but for recurring events)
|
||||
*/
|
||||
|
|
|
@ -37,21 +37,36 @@
|
|||
}
|
||||
|
||||
/* ::: imip button icons ::: */
|
||||
.imip-button[action="ACCEPTED"] {
|
||||
.imipAcceptButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip.png);
|
||||
-moz-image-region: rect(0px 16px 16px 0px);
|
||||
}
|
||||
|
||||
.imip-button[action="DECLINED"] {
|
||||
.imipDeclineButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip.png);
|
||||
-moz-image-region: rect(0px 32px 16px 16px);
|
||||
}
|
||||
|
||||
.imip-button[action="TENTATIVE"] {
|
||||
.imipTentativeButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip.png);
|
||||
-moz-image-region: rect(0px 48px 16px 32px);
|
||||
}
|
||||
|
||||
.imip-button > .button-box > .button-icon {
|
||||
-moz-margin-end: 2px;
|
||||
}
|
||||
/* These buttons may also deserve an icon:
|
||||
.imipDetailsButton
|
||||
(-> open the event or summary dialog)
|
||||
.imipMoreButton
|
||||
(-> dropdown button to offer more options to the user)
|
||||
.imipAddButton
|
||||
(-> add an event to the calendar)
|
||||
.imipUpdateButton
|
||||
(-> ipdate an event in the calendar)
|
||||
.imipDeleteButton
|
||||
(-> delete an event from the calendar)
|
||||
.imipReconfirmButton
|
||||
(-> re-confirm the own participation status on organizer's request)
|
||||
.imipAcceptRecurrencesButton
|
||||
.imipDeclineRecurrencesButton
|
||||
.imipTentativeRecurrencesButton
|
||||
(-> the same functionality as above, but for recurring events)
|
||||
*/
|
||||
|
|
|
@ -34,15 +34,217 @@
|
|||
collapsed="true"
|
||||
insertbefore="msgHeaderView"
|
||||
label="&lightning.imipbar.description;">
|
||||
<button id="imip-button1"
|
||||
class="imip-button"
|
||||
hidden="true"/>
|
||||
<button id="imip-button2"
|
||||
class="imip-button"
|
||||
hidden="true"/>
|
||||
<button id="imip-button3"
|
||||
class="imip-button"
|
||||
hidden="true"/>
|
||||
|
||||
<!-- Some Toolbox implementation notes:
|
||||
-
|
||||
- css style:
|
||||
- classes within toolbox are making use of existing TB css definitions - as used in
|
||||
- /comm-central/source/mail/base/content/msgHdrViewOverlay.xul, only icon defining
|
||||
- classes like imipAcceptButton are noted separately and OS specific within
|
||||
- skin/lightning.css (resp. the OS-specific theme folders)
|
||||
-
|
||||
- The toolbarbuttons will be adjusted dynamically in imip-bar.js based on their
|
||||
- content of menuitems. To avoid breaking this, the following should be considered
|
||||
- if adding/changing toolbarbutton definitions.
|
||||
- general:
|
||||
- * the toolbarbuttons will appear in order of definition
|
||||
- within the toolbar if visible
|
||||
- * must be hidden by default
|
||||
- * menuitem inside must not be hidden by default
|
||||
- simple button:
|
||||
- * must not have a type attribute
|
||||
- * may have menupopup/menuitem within (not displayed though)
|
||||
- dropdown only:
|
||||
- * must have type=menu
|
||||
- * should have a menupopup with at least one menuitem
|
||||
- smart-dropdown:
|
||||
- * must have type=menu-button
|
||||
- * should have a menupopup with at least one menuitem
|
||||
- * bubbling up of events from menuitems to toolbarbutton must be prevented
|
||||
- by adding a trailing "if (event.target.id == this.id) " to the respective
|
||||
- ltnImipBar.executeAction(...)
|
||||
- * toolbarbutton's oncommand should end with the first menuitem's oncommand
|
||||
- to not break automated conforming
|
||||
- e.g. "if (event.target.id == this.id) ltnImipBar.executeAction('ACCEPTED');"
|
||||
- and "ltnImipBar.executeAction('ACCEPTED');"
|
||||
//-->
|
||||
<toolbox id="imip-view-toolbox"
|
||||
class="inline-toolbox"
|
||||
defaulticonsize="small"
|
||||
minwidth="50px"
|
||||
defaultlabelalign="end"
|
||||
labelalign="end"
|
||||
defaultmode="full"
|
||||
inlinetoolbox="true">
|
||||
<toolbar id="imip-view-toolbar" class="inline-toolbar" align="start"
|
||||
customizable="false" mode="full"
|
||||
defaulticonsize="small" defaultmode="full">
|
||||
|
||||
<!-- show event/invitation details -->
|
||||
<toolbarbutton id="imipDetailsButton"
|
||||
label="&lightning.imipbar.btnDetails.label;"
|
||||
tooltiptext="&lightning.imipbar.btnDetails.tooltiptext;"
|
||||
class="toolbarbutton-1 msgHeaderView-button imipDetailsButton"
|
||||
oncommand="ltnImipBar.executeAction('X-SHOWDETAILS')"
|
||||
hidden="true"/>
|
||||
|
||||
<!-- add published events -->
|
||||
<toolbarbutton id="imipAddButton"
|
||||
label="&lightning.imipbar.btnAdd.label;"
|
||||
tooltiptext="&lightning.imipbar.btnAdd.tooltiptext;"
|
||||
class="toolbarbutton-1 msgHeaderView-button imipAddButton"
|
||||
oncommand="ltnImipBar.executeAction()"
|
||||
hidden="true"/>
|
||||
|
||||
<!-- update published events and invitations -->
|
||||
<toolbarbutton id="imipUpdateButton"
|
||||
label="&lightning.imipbar.btnUpdate.label;"
|
||||
tooltiptext="&lightning.imipbar.btnUpdate.tooltiptext;"
|
||||
class="toolbarbutton-1 msgHeaderView-button imipUpdateButton"
|
||||
oncommand="ltnImipBar.executeAction()"
|
||||
hidden="true"/>
|
||||
|
||||
<!-- delete cancelled events from calendar -->
|
||||
<toolbarbutton id="imipDeleteButton"
|
||||
label="&lightning.imipbar.btnDelete.label;"
|
||||
tooltiptext="&lightning.imipbar.btnDelete.tooltiptext;"
|
||||
class="toolbarbutton-1 msgHeaderView-button imipDeleteButton"
|
||||
oncommand="ltnImipBar.executeAction()"
|
||||
hidden="true"/>
|
||||
|
||||
<!-- re-confirm partstat -->
|
||||
<toolbarbutton id="imipReconfirmButton"
|
||||
label="&lightning.imipbar.btnReconfirm.label;"
|
||||
tooltiptext="&lightning.imipbar.btnReconfirm.tooltiptext;"
|
||||
class="toolbarbutton-1 msgHeaderView-button imipReconfirmButton"
|
||||
oncommand="ltnImipBar.executeAction()"
|
||||
hidden="true"/>
|
||||
|
||||
<!-- accept -->
|
||||
<toolbarbutton id="imipAcceptButton"
|
||||
tooltiptext="&lightning.imipbar.btnAccept.tooltiptext;"
|
||||
label="&lightning.imipbar.btnAccept.label;"
|
||||
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('ACCEPTED');"
|
||||
type="menu-button"
|
||||
class="imip-button toolbarbutton-1 msgHeaderView-button imipAcceptButton"
|
||||
hidden="true">
|
||||
<menupopup id="imipAcceptDropdown">
|
||||
<menuitem id="imipAcceptButton_Accept"
|
||||
tooltiptext="&lightning.imipbar.btnAccept.tooltiptext;"
|
||||
label="&lightning.imipbar.btnAccept.label;"
|
||||
oncommand="ltnImipBar.executeAction('ACCEPTED');"/>
|
||||
<menuitem id="imipAcceptButton_Tentative"
|
||||
tooltiptext="&lightning.imipbar.btnTentative.tooltiptext;"
|
||||
label="&lightning.imipbar.btnTentative.label;"
|
||||
oncommand="ltnImipBar.executeAction('TENTATIVE');"/>
|
||||
<!-- add here more menuitem as needed -->
|
||||
</menupopup>
|
||||
</toolbarbutton>
|
||||
|
||||
<!-- accept recurrences -->
|
||||
<toolbarbutton id="imipAcceptRecurrencesButton"
|
||||
tooltiptext="&lightning.imipbar.btnAcceptRecurrences.tooltiptext;"
|
||||
label="&lightning.imipbar.btnAcceptRecurrences.label;"
|
||||
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('ACCEPTED');"
|
||||
type="menu-button"
|
||||
class="imip-button toolbarbutton-1 msgHeaderView-button imipAcceptRecurrencesButton"
|
||||
hidden="true">
|
||||
<menupopup id="imipAcceptRecurrencesDropdown">
|
||||
<menuitem id="imipAcceptRecurrencesButton_Accept"
|
||||
tooltiptext="&lightning.imipbar.btnAcceptRecurrences.tooltiptext;"
|
||||
label="&lightning.imipbar.btnAcceptRecurrences.label;"
|
||||
oncommand="ltnImipBar.executeAction('ACCEPTED');"/>
|
||||
<menuitem id="imipAcceptRecurrencesButton_Tentative"
|
||||
tooltiptext="&lightning.imipbar.btnTentativeRecurrences.tooltiptext;"
|
||||
label="&lightning.imipbar.btnTentativeRecurrences.label;"
|
||||
oncommand="ltnImipBar.executeAction('TENTATIVE');"/>
|
||||
<!-- add here more menuitem as needed -->
|
||||
</menupopup>
|
||||
</toolbarbutton>
|
||||
|
||||
<!-- tentative; should only be used, if no imipMoreButton is used and
|
||||
- imipDeclineButton/imipAcceptButton have no visible menuitems //-->
|
||||
<toolbarbutton id="imipTentativeButton"
|
||||
label="&lightning.imipbar.btnTentative.label;"
|
||||
tooltiptext="&lightning.imipbar.btnTentative.tooltiptext;"
|
||||
class="toolbarbutton-1 msgHeaderView-button imipTentativeButton"
|
||||
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('TENTATIVE');"
|
||||
type="menu-button"
|
||||
hidden="true">
|
||||
<menupopup id="imipTentativeDropdown">
|
||||
<menuitem id="imipTentativeButton_Tentative"
|
||||
tooltiptext="&lightning.imipbar.btnTentative.tooltiptext;"
|
||||
label="&lightning.imipbar.btnTentative.label;"
|
||||
oncommand="ltnImipBar.executeAction('TENTATIVE');"/>
|
||||
<!-- add here more menuitem as needed -->
|
||||
</menupopup>
|
||||
</toolbarbutton>
|
||||
|
||||
<!-- tentative recurrences; should only be used, if no imipMoreButton is used and
|
||||
- imipDeclineRecurrencesButton/imipAcceptRecurrencesButton have no visible menuitems //-->
|
||||
<toolbarbutton id="imipTentativeRecurrencesButton"
|
||||
label="&lightning.imipbar.btnTentativeRecurrences.label;"
|
||||
tooltiptext="&lightning.imipbar.btnTentativeRecurrences.tooltiptext;"
|
||||
class="toolbarbutton-1 msgHeaderView-button imipTentativeRecurrencesButton"
|
||||
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('TENTATIVE');"
|
||||
type="menu-button"
|
||||
hidden="true">
|
||||
<menupopup id="imipTentativeRecurrencesDropdown">
|
||||
<menuitem id="imipTentativeRecurrencesButton_Tentative"
|
||||
tooltiptext="&lightning.imipbar.btnTentativeRecurrences.tooltiptext;"
|
||||
label="&lightning.imipbar.btnTentativeRecurrences.label;"
|
||||
oncommand="ltnImipBar.executeAction('TENTATIVE');"/>
|
||||
<!-- add here more menuitem as needed -->
|
||||
</menupopup>
|
||||
</toolbarbutton>
|
||||
|
||||
<!-- decline -->
|
||||
<toolbarbutton id="imipDeclineButton"
|
||||
tooltiptext="&lightning.imipbar.btnDecline.tooltiptext;"
|
||||
label="&lightning.imipbar.btnDecline.label;"
|
||||
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('DECLINED');"
|
||||
type="menu-button"
|
||||
class="toolbarbutton-1 msgHeaderView-button imipDeclineButton"
|
||||
hidden="true">
|
||||
<menupopup id="imipDeclineDropdown">
|
||||
<menuitem id="imipDeclineButton_Decline"
|
||||
tooltiptext="&lightning.imipbar.btnDecline.tooltiptext;"
|
||||
label="&lightning.imipbar.btnDecline.label;"
|
||||
oncommand="ltnImipBar.executeAction('DECLINED');"/>
|
||||
<!-- add here more menuitem as needed -->
|
||||
</menupopup>
|
||||
</toolbarbutton>
|
||||
|
||||
<!-- decline recurrences -->
|
||||
<toolbarbutton id="imipDeclineRecurrencesButton"
|
||||
tooltiptext="&lightning.imipbar.btnDeclineRecurrences.tooltiptext;"
|
||||
label="&lightning.imipbar.btnDeclineRecurrences.label;"
|
||||
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('DECLINED');"
|
||||
type="menu-button"
|
||||
class="toolbarbutton-1 msgHeaderView-button imipDeclineRecurrencesButton"
|
||||
hidden="true">
|
||||
<menupopup id="imipDeclineRecurrencesDropdown">
|
||||
<menuitem id="imipDeclineRecurrencesButton_DeclineAll"
|
||||
tooltiptext="&lightning.imipbar.btnDeclineRecurrences.tooltiptext;"
|
||||
label="&lightning.imipbar.btnDeclineRecurrences.label;"
|
||||
oncommand="ltnImipBar.executeAction('DECLINED');"/>
|
||||
<!-- add here more menuitem as needed -->
|
||||
</menupopup>
|
||||
</toolbarbutton>
|
||||
|
||||
<!-- more options -->
|
||||
<toolbarbutton id="imipMoreButton"
|
||||
type="menu"
|
||||
tooltiptext="&lightning.imipbar.btnMore.tooltiptext;"
|
||||
label="&lightning.imipbar.btnMore.label;"
|
||||
class="toolbarbutton-1 msgHeaderView-button imipMoreButton"
|
||||
hidden="true">
|
||||
<menupopup id="imipMoreDropdown">
|
||||
<!-- add here a menuitem as needed -->
|
||||
</menupopup>
|
||||
</toolbarbutton>
|
||||
</toolbar>
|
||||
</toolbox>
|
||||
</lightning-notification-bar>
|
||||
</vbox>
|
||||
</vbox>
|
||||
|
|
|
@ -19,7 +19,7 @@ var ltnImipBar = {
|
|||
* Thunderbird Message listener interface, hide the bar before we begin
|
||||
*/
|
||||
onStartHeaders: function onImipStartHeaders() {
|
||||
ltnImipBar.hideBar();
|
||||
ltnImipBar.resetBar();
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -42,7 +42,7 @@ var ltnImipBar = {
|
|||
// changing folders.
|
||||
ltnImipBar.tbHideMessageHeaderPane = HideMessageHeaderPane;
|
||||
HideMessageHeaderPane = function ltnHideMessageHeaderPane() {
|
||||
ltnImipBar.hideBar();
|
||||
ltnImipBar.resetBar();
|
||||
ltnImipBar.tbHideMessageHeaderPane.apply(null, arguments);
|
||||
};
|
||||
|
||||
|
@ -58,7 +58,7 @@ var ltnImipBar = {
|
|||
removeEventListener("messagepane-loaded", ltnImipBar.load, true);
|
||||
removeEventListener("messagepane-unloaded", ltnImipBar.unload, true);
|
||||
|
||||
ltnImipBar.hideBar();
|
||||
ltnImipBar.resetBar();
|
||||
Services.obs.removeObserver(ltnImipBar, "onItipItemCreation");
|
||||
},
|
||||
|
||||
|
@ -95,17 +95,81 @@ var ltnImipBar = {
|
|||
/**
|
||||
* Hide the imip bar and reset the itip item.
|
||||
*/
|
||||
hideBar: function ltnHideImipBar() {
|
||||
resetBar: function ltnResetImipBar() {
|
||||
document.getElementById("imip-bar").collapsed = true;
|
||||
hideElement("imip-button1");
|
||||
hideElement("imip-button2");
|
||||
hideElement("imip-button3");
|
||||
ltnImipBar.resetButtons();
|
||||
|
||||
// Clear our iMIP/iTIP stuff so it doesn't contain stale information.
|
||||
cal.itip.cleanupItipItem(ltnImipBar.itipItem);
|
||||
ltnImipBar.itipItem = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Resets all buttons and its menuitems, all buttons are hidden thereafter
|
||||
*/
|
||||
resetButtons: function ltnResetImipButtons() {
|
||||
let buttons = ltnImipBar.getButtons();
|
||||
buttons.forEach(hideElement);
|
||||
buttons.forEach(function(aButton) ltnImipBar.getMenuItems(aButton).forEach(showElement));
|
||||
},
|
||||
|
||||
/**
|
||||
* Provides a list of all available buttons
|
||||
*/
|
||||
getButtons: function ltnGetButtons() {
|
||||
let buttons = [];
|
||||
let nl = document.getElementById("imip-view-toolbar")
|
||||
.getElementsByTagName("toolbarbutton");
|
||||
if (nl != null && nl.length > 0) {
|
||||
for (let button of nl) {
|
||||
buttons.push(button);
|
||||
}
|
||||
}
|
||||
return buttons;
|
||||
},
|
||||
|
||||
/**
|
||||
* Provides a list of available menuitems of a button
|
||||
*
|
||||
* @param aButton button node
|
||||
*/
|
||||
getMenuItems: function ltnGetMenuItems(aButton) {
|
||||
let items = [];
|
||||
let mitems = document.getElementById(aButton.id)
|
||||
.getElementsByTagName("menuitem");
|
||||
if (mitems != null && mitems.length > 0) {
|
||||
for (let mitem of mitems) {
|
||||
items.push(mitem);
|
||||
}
|
||||
}
|
||||
return items;
|
||||
},
|
||||
|
||||
/**
|
||||
* Checks and converts button types based on available menuitems of the buttons
|
||||
* to avoid dropdowns which are empty or only replicating the default button action
|
||||
* Should be called once the buttons are set up
|
||||
*/
|
||||
conformButtonType: function ltnConformButtonType() {
|
||||
// check only needed on visible and not simple buttons
|
||||
let buttons = ltnImipBar.getButtons()
|
||||
.filter(function(aElement) aElement.hasAttribute("type") && !aElement.hidden);
|
||||
// change button if appropriate
|
||||
for (let button in buttons) {
|
||||
let items = ltnImipBar.getMenuItems(button).filter(function(aItem) !aItem.hidden);
|
||||
if (button.type == "menu" && items.length == 0) {
|
||||
// hide non functional buttons
|
||||
button.hidden = true;
|
||||
} else if (button.type == "menu-button") {
|
||||
if (items.length == 0 ||
|
||||
(items.length == 1 && button.oncommand.endsWith(items[0].oncommand))) {
|
||||
// convert to simple button
|
||||
button.removeAttribute("type");
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* This is our callback function that is called each time the itip bar UI needs updating.
|
||||
* NOTE: This function is called without a valid this-context!
|
||||
|
@ -127,20 +191,19 @@ var ltnImipBar = {
|
|||
}
|
||||
|
||||
imipBar.setAttribute("label", data.label);
|
||||
for each (let button in ["button1", "button2", "button3"]) {
|
||||
let buttonElement = document.getElementById("imip-" + button);
|
||||
if (data[button].label) {
|
||||
buttonElement.setAttribute("label", data[button].label);
|
||||
buttonElement.setAttribute("oncommand",
|
||||
"ltnImipBar.executeAction('" + data[button].actionMethod + "')");
|
||||
buttonElement.setAttribute("action", data[button].actionMethod);
|
||||
|
||||
showElement(buttonElement);
|
||||
}
|
||||
}
|
||||
// menu items are visible by default, let's hide what's not available
|
||||
data.hideMenuItems.forEach(function(aElementId) hideElement(document.getElementById(aElementId)));
|
||||
// buttons are hidden by default, let's make required buttons visible
|
||||
data.buttons.forEach(function(aElementId) showElement(document.getElementById(aElementId)));
|
||||
// adjust button style if necessary
|
||||
ltnImipBar.conformButtonType();
|
||||
},
|
||||
|
||||
executeAction: function ltnExecAction(partStat) {
|
||||
executeAction: function ltnExecAction(partStat, extendResponse) {
|
||||
if (partStat == null) {
|
||||
partStat = '';
|
||||
}
|
||||
if (partStat == "X-SHOWDETAILS") {
|
||||
let items = ltnImipBar.foundItems;
|
||||
if (items && items.length) {
|
||||
|
@ -148,6 +211,16 @@ var ltnImipBar = {
|
|||
modifyEventWithDialog(item);
|
||||
}
|
||||
} else {
|
||||
if (extendResponse) {
|
||||
// Open an extended response dialog to enable the user to add a comment, make a
|
||||
// counter proposal, delegate the event or interact in another way.
|
||||
// Instead of a dialog, this might be implemented as a separate container inside the
|
||||
// imip-overlay as proposed in bug 458578
|
||||
//
|
||||
// If implemented as a dialog, the OL compatibility decision should be incorporated
|
||||
// therein too and the itipItems's autoResponse set to auto subsequently
|
||||
// to prevent a second popup during imip transport processing.
|
||||
}
|
||||
let delmgr = Components.classes["@mozilla.org/calendar/deleted-items-manager;1"]
|
||||
.getService(Components.interfaces.calIDeletedItems);
|
||||
let items = ltnImipBar.itipItem.getItemList({});
|
||||
|
@ -162,9 +235,7 @@ var ltnImipBar = {
|
|||
|
||||
if (cal.itip.promptCalendar(ltnImipBar.actionFunc.method, ltnImipBar.itipItem, window)) {
|
||||
// hide the buttons now, to disable pressing them twice...
|
||||
hideElement("imip-button1");
|
||||
hideElement("imip-button2");
|
||||
hideElement("imip-button3");
|
||||
ltnImipBar.resetButtons();
|
||||
|
||||
let opListener = {
|
||||
onOperationComplete: function ltnItipActionListener_onOperationComplete(aCalendar,
|
||||
|
|
|
@ -199,17 +199,36 @@ radio[pane=paneLightning] {
|
|||
margin-top: 3px;
|
||||
}
|
||||
|
||||
.imip-button[action="ACCEPTED"] {
|
||||
.imipAcceptButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip.png);
|
||||
-moz-image-region: rect(0px 16px 16px 0px);
|
||||
}
|
||||
|
||||
.imip-button[action="DECLINED"] {
|
||||
.imipDeclineButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip.png);
|
||||
-moz-image-region: rect(0px 32px 16px 16px);
|
||||
}
|
||||
|
||||
.imip-button[action="TENTATIVE"] {
|
||||
.imipTentativeButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip.png);
|
||||
-moz-image-region: rect(0px 48px 16px 32px);
|
||||
}
|
||||
|
||||
/* These buttons may also deserve an icon:
|
||||
.imipDetailsButton
|
||||
(-> open the event or summary dialog)
|
||||
.imipMoreButton
|
||||
(-> dropdown button to offer more options to the user)
|
||||
.imipAddButton
|
||||
(-> add an event to the calendar)
|
||||
.imipUpdateButton
|
||||
(-> ipdate an event in the calendar)
|
||||
.imipDeleteButton
|
||||
(-> delete an event from the calendar)
|
||||
.imipReconfirmButton
|
||||
(-> re-confirm the own participation status on organizer's request)
|
||||
.imipAcceptRecurrencesButton
|
||||
.imipDeclineRecurrencesButton
|
||||
.imipTentativeRecurrencesButton
|
||||
(-> the same functionality as above, but for recurring events)
|
||||
*/
|
||||
|
|
|
@ -205,29 +205,51 @@ radio[pane=paneLightning] {
|
|||
-moz-margin-end: -3px !important;
|
||||
}
|
||||
|
||||
.imip-button[action="ACCEPTED"] {
|
||||
.imipAcceptButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip.png);
|
||||
-moz-image-region: rect(0px 16px 16px 0px);
|
||||
}
|
||||
|
||||
.imip-button[action="ACCEPTED"]:active {
|
||||
.imipAcceptButton:active {
|
||||
-moz-image-region: rect(16px 16px 32px 0px);
|
||||
}
|
||||
|
||||
.imip-button[action="DECLINED"] {
|
||||
.imipDeclineButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip.png);
|
||||
-moz-image-region: rect(0px 32px 16px 16px);
|
||||
}
|
||||
|
||||
.imip-button[action="DECLINED"]:active {
|
||||
.imipDeclineButton:active {
|
||||
-moz-image-region: rect(16px 32px 32px 16px);
|
||||
}
|
||||
|
||||
.imip-button[action="TENTATIVE"] {
|
||||
.imipTentativeButton {
|
||||
list-style-image: url(chrome://lightning/skin/imip.png);
|
||||
-moz-image-region: rect(0px 48px 16px 32px);
|
||||
}
|
||||
|
||||
.imip-button[action="TENTATIVE"]:active {
|
||||
.imipTentativeButton:active {
|
||||
-moz-image-region: rect(16px 48px 32px 32px);
|
||||
}
|
||||
|
||||
/* Are the separate icons for :active state of the imipButtons
|
||||
above still required with the button redesign?
|
||||
|
||||
These buttons may also deserve an icon:
|
||||
.imipDetailsButton
|
||||
(-> open the event or summary dialog)
|
||||
.imipMoreButton
|
||||
(-> dropdown button to offer more options to the user)
|
||||
.imipAddButton
|
||||
(-> add an event to the calendar)
|
||||
.imipUpdateButton
|
||||
(-> ipdate an event in the calendar)
|
||||
.imipDeleteButton
|
||||
(-> delete an event from the calendar)
|
||||
.imipReconfirmButton
|
||||
(-> re-confirm the own participation status on organizer's request)
|
||||
.imipAcceptRecurrencesButton
|
||||
.imipDeclineRecurrencesButton
|
||||
.imipTentativeRecurrencesButton
|
||||
(-> the same functionality as above, but for recurring events)
|
||||
*/
|
||||
|
|
|
@ -40,7 +40,31 @@
|
|||
<!ENTITY lightning.calendarproperties.email.label "E-Mail:">
|
||||
|
||||
<!-- iMIP Bar (meeting support) -->
|
||||
<!ENTITY lightning.imipbar.description "This message contains an invitation to an event.">
|
||||
<!ENTITY lightning.imipbar.btnAccept.label "Accept">
|
||||
<!ENTITY lightning.imipbar.btnAccept.tooltiptext "Accept event participation">
|
||||
<!ENTITY lightning.imipbar.btnAcceptRecurrences.label "Accept all">
|
||||
<!ENTITY lightning.imipbar.btnAcceptRecurrences.tooltiptext "Accept event participation for all recurrences of the event">
|
||||
<!ENTITY lightning.imipbar.btnAdd.label "Add">
|
||||
<!ENTITY lightning.imipbar.btnAdd.tooltiptext "Add the event to the calendar">
|
||||
<!ENTITY lightning.imipbar.btnDecline.label "Decline">
|
||||
<!ENTITY lightning.imipbar.btnDecline.tooltiptext "Decline event participation">
|
||||
<!ENTITY lightning.imipbar.btnDeclineRecurrences.label "Decline all">
|
||||
<!ENTITY lightning.imipbar.btnDeclineRecurrences.tooltiptext "Accept event participation for all recurrences of the event">
|
||||
<!ENTITY lightning.imipbar.btnDelete.label "Delete">
|
||||
<!ENTITY lightning.imipbar.btnDelete.tooltiptext "Delete from calendar">
|
||||
<!ENTITY lightning.imipbar.btnDetails.label "Details…">
|
||||
<!ENTITY lightning.imipbar.btnDetails.tooltiptext "Show event details">
|
||||
<!ENTITY lightning.imipbar.btnMore.label "More">
|
||||
<!ENTITY lightning.imipbar.btnMore.tooltiptext "Click to show more options">
|
||||
<!ENTITY lightning.imipbar.btnReconfirm.label "Send">
|
||||
<!ENTITY lightning.imipbar.btnReconfirm.tooltiptext "Sends a re-confirmation to the organizer">
|
||||
<!ENTITY lightning.imipbar.btnTentative.label "Tentative">
|
||||
<!ENTITY lightning.imipbar.btnTentative.tooltiptext "Accept event participation tentatively">
|
||||
<!ENTITY lightning.imipbar.btnTentativeRecurrences.label "Tentative all">
|
||||
<!ENTITY lightning.imipbar.btnTentativeRecurrences.tooltiptext "Accept event participation tentatively for all recurrences of the event">
|
||||
<!ENTITY lightning.imipbar.btnUpdate.label "Update">
|
||||
<!ENTITY lightning.imipbar.btnUpdate.tooltiptext "Update event in calendar">
|
||||
<!ENTITY lightning.imipbar.description "This message contains an invitation to an event.">
|
||||
|
||||
<!-- Lightning specific keybindings -->
|
||||
<!ENTITY lightning.keys.event.showCalendar.key "C">
|
||||
|
|
|
@ -45,13 +45,6 @@ imipBarReplyText=This message contains a reply to an invitation.
|
|||
imipBarUnsupportedText=This message contains an event that this version of Lightning cannot process.
|
||||
imipBarProcessingFailed=Processing message failed. Status: %1$S.
|
||||
imipBarNotWritable=No writable calendars are configured for invitations, please check the calendar properties.
|
||||
imipAcceptInvitation.label=Accept
|
||||
imipCancelInvitation.label=Delete
|
||||
imipDeclineInvitation.label=Decline
|
||||
imipUpdate.label=Update
|
||||
imipDetails.label=Details…
|
||||
imipAcceptTentativeInvitation.label=Tentative
|
||||
imipSend.label=Send
|
||||
imipSendMail.title=E-Mail Notification
|
||||
imipSendMail.text=Would you like to send out notification E-Mail now?
|
||||
imipSendMail.Outlook2000CompatMode.text=Support Outlook 2000 and Outlook 2002/XP
|
||||
|
|
Загрузка…
Ссылка в новой задаче