Skip to content

Commit b71ece1

Browse files
committed
temporary commit
1 parent 4acd462 commit b71ece1

11 files changed

Lines changed: 84 additions & 69 deletions

File tree

TypicalReply.manifest.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@
5959
</Runtimes>
6060
<DesktopFormFactor>
6161
<FunctionFile resid="residUILessFunctionFileUrl" />
62+
<ExtensionPoint xsi:type="LaunchEvent">
63+
<LaunchEvents>
64+
<LaunchEvent Type="OnNewMessageCompose" FunctionName="onNewMessageComposeCreated"/>
65+
</LaunchEvents>
66+
<SourceLocation resid="residUILessFunctionFileUrl"/>
67+
</ExtensionPoint>
6268
<ExtensionPoint xsi:type="MessageReadCommandSurface">
6369
<OfficeTab id="msgReadTabDefault">
6470
<Group id="msgReadCmdGroup">

assets/icon-128.png

4.29 KB
Loading

assets/icon-16.png

1001 Bytes
Loading

assets/icon-32.png

1.49 KB
Loading

assets/icon-64.png

2.45 KB
Loading

assets/icon-80.png

2.94 KB
Loading

assets/logo-filled.png

8.38 KB
Loading

src/web/app.js

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,14 @@ Copyright (c) 2026 ClearCode Inc.
77
*/
88
import { ConfigLoader } from "./config-loader.mjs";
99
import { MailDataCreator } from "./mail-data-creator.mjs";
10+
import { OfficeDataAccessHelper } from "./office-data-access-helper.mjs";
1011

1112
Office.onReady(() => {});
1213

13-
// function createNewMail() {
14-
// try {
15-
// const currentItemId = Office.context.mailbox.item.itemId;
16-
// MailDataCreator.CreateReplyMailData();
17-
// Office.context.mailbox.displayNewMessageFormAsync({
18-
// toRecipients: Office.context.mailbox.item.to, // Copies the To line from current item
19-
// ccRecipients: ["sam@contoso.com"],
20-
// subject: "Outlook add-ins are cool!",
21-
// htmlBody: 'Hello <b>World</b>!<br/><img src="cid:image.png"></i>',
22-
// attachments: [
23-
// {
24-
// name: Office.context.mailbox.item.subject,
25-
// type: Office.MailboxEnums.AttachmentType.Item,
26-
// itemId: currentItemId,
27-
// },
28-
// ],
29-
// });
30-
// } catch (e) {
31-
// console.log("createNewMail Failed:", e);
32-
// }
33-
// }
34-
3514
async function onTypicalReplyButtonClicked(event) {
3615
const actionId = event.source.id;
3716
console.log(actionId);
17+
console.log("conversationId: " + Office.context.mailbox.item.conversationId);
3818
const config = await ConfigLoader.loadConfigForCurrentLanguage(Office.context.displayLanguage);
3919
const originalMailData = {
4020
toRecipients: Office.context.mailbox.item.to,
@@ -45,26 +25,67 @@ async function onTypicalReplyButtonClicked(event) {
4525
subject: Office.context.mailbox.item.subject,
4626
id: Office.context.mailbox.item.itemId,
4727
};
28+
const abc = await OfficeDataAccessHelper.getAllMailData();
29+
// Office.context.mailbox.item.displayReplyAllFormAsync({
30+
// htmlBody:
31+
// });
32+
console.log(Office.context.mailbox.item.itemId);
4833
try {
4934
const waitComplete = false;
5035
for(const buttonConfig of config.ButtonConfigList) {
5136
if (actionId !== buttonConfig.Id) {
5237
continue;
5338
}
54-
const replyMailData = MailDataCreator.CreateReplyMailData({ config: config.ButtonConfigList[0], originalMailData });
55-
Office.context.mailbox.displayNewMessageFormAsync(replyMailData);
39+
const replyMailData = MailDataCreator.CreateDataOnForReplyForm({ config: config.ButtonConfigList[0], originalMailData });
40+
if (!replyMailData) {
41+
return event.completed();
42+
}
43+
Office.context.roamingSettings.set(targetConversationId, Office.context.mailbox.item.conversationId ?? "");
44+
Office.context.roamingSettings.set("buttonConfig", JSON.stringify(config.ButtonConfigList[0]));
45+
Office.context.roamingSettings.saveAsync();
46+
replyMailData.executeMethod({attachments: replyMailData.attachments});
47+
//Office.context.mailbox.displayNewMessageFormAsync(replyMailData,);
5648
// displayNewMessageFormAsync will be canceled if event.completed() is called
5749
// before finishing displayNewMessageFormAsync. The event will be completed
5850
// automatically after displayNewMessageFormAsync is called.
5951
waitComplete = true;
6052
break;
6153
}
62-
if(!waitComplete) {
63-
event.completed();
64-
}
54+
event.completed();
6555
} catch (e) {
6656
console.log("createNewMail Failed:", e);
6757
}
6858
}
6959
window.onTypicalReplyButtonClicked = onTypicalReplyButtonClicked;
60+
61+
async function onNewMessageComposeCreated(event) {
62+
const id = Office.context.mailbox.item.conversationId;
63+
const targetConversationId = Office.context.roamingSettings.get(conversationId)?.trim() ?? "";
64+
if (id !== targetConversationId) {
65+
event.completed();
66+
}
67+
const buttonConfigJson = Office.context.roamingSettings.get("buttonConfig")?.trim() ?? "";
68+
Office.context.roamingSettings.remove(conversationId);
69+
Office.context.roamingSettings.remove("buttonConfig");
70+
Office.context.roamingSettings.saveAsync();
71+
const buttonConfig = JSON.parse(buttonConfigJson);
72+
const currentSubject = await OfficeDataAccessHelper.getSubjectAsync();
73+
const data = MailDataCreator.CreateReplyMailData({config: buttonConfig, currentSubject});
74+
if (data.newToRecipients) {
75+
await OfficeDataAccessHelper.setToAsync(data.newToRecipients);
76+
}
77+
await OfficeDataAccessHelper.setSubjectAsync(data.subject);
78+
let body = "";
79+
if (data.quoteType) {
80+
body = await OfficeDataAccessHelper.getBodyAsync();
81+
}
82+
if (data.bodyHtml) {
83+
body = data.bodyHtml + "\n\n" + body;
84+
}
85+
await OfficeDataAccessHelper.setBodyAsync(body);
86+
event.completed();
87+
}
88+
window.onNewMessageComposeCreated = onNewMessageComposeCreated;
89+
90+
Office.actions.associate("onNewMessageComposeCreated", onNewMessageComposeCreated);
7091
Office.actions.associate("onTypicalReplyButtonClicked", onTypicalReplyButtonClicked);

src/web/config.mjs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,6 @@ export class ButtonConfigEnums {
2626
All: 1,
2727
SpecifiedByUser: 2,
2828
};
29-
30-
static ButtonSize = {
31-
Unknown: 0,
32-
Normal: 1,
33-
Large: 2,
34-
};
3529
}
3630

3731
export class ButtonConfig {
@@ -47,7 +41,6 @@ export class ButtonConfig {
4741
LoweredAllowedDomains;
4842
AllowedDomainsType;
4943
ForwardType;
50-
Size;
5144
Image;
5245

5346
constructor({
@@ -60,7 +53,6 @@ export class ButtonConfig {
6053
QuoteType,
6154
AllowedDomains,
6255
ForwardType,
63-
Size,
6456
Image,
6557
}) {
6658
this.Id = Id ?? "";
@@ -72,7 +64,6 @@ export class ButtonConfig {
7264
this.QuoteType = QuoteType ?? false;
7365
this.AllowedDomains = AllowedDomains ?? [];
7466
this.ForwardType = ForwardType ?? ButtonConfigEnums.ForwardType.Unknown;
75-
this.Size = Size ?? ButtonConfigEnums.ButtonSize.Unknown;
7667
this.Image = Image ?? "logo.png";
7768

7869
if (!Recipients || Recipients.length == 0) {
@@ -100,24 +91,15 @@ export class ButtonConfig {
10091
export class Config {
10192
Culture;
10293
GroupLabel;
103-
TabMailInsertAfterMso;
104-
TabReadInsertAfterMso;
105-
ContextMenuInsertAfterMso;
10694
ButtonConfigList;
10795

10896
constructor({
10997
Culture,
11098
GroupLabel,
111-
TabMailInsertAfterMso,
112-
TabReadInsertAfterMso,
113-
ContextMenuInsertAfterMso,
11499
ButtonConfigList,
115100
}) {
116101
this.Culture = Culture ?? "en-US";
117102
this.GroupLabel = GroupLabel ?? "Typical Reply";
118-
this.TabMailInsertAfterMso = TabMailInsertAfterMso ?? "GroupMailRespond";
119-
this.TabReadInsertAfterMso = TabReadInsertAfterMso ?? "GroupRespond";
120-
this.ContextMenuInsertAfterMso = ContextMenuInsertAfterMso ?? "Forward";
121103
this.ButtonConfigList = [];
122104
if (ButtonConfigList) {
123105
for (const buttonConfig of ButtonConfigList) {

src/web/mail-data-creator.mjs

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,26 @@ import { ButtonConfigEnums } from "./config.mjs";
99
import * as RecipientParser from "./recipient-parser.mjs";
1010

1111
export class MailDataCreator {
12-
static CreateReplyMailData({ config, originalMailData }) {
12+
static CreateDataOnForReplyForm({ config, originalMailData }) {
1313
const mailItemToReply = {};
1414
switch (config.RecipientsType) {
1515
case ButtonConfigEnums.RecipientsType.All:
16+
mailItemToReply.executeMethod = Office.context.mailbox.item.displayReplyAllFormAsync;
1617
mailItemToReply.toRecipients = originalMailData.toRecipients;
1718
mailItemToReply.ccRecipients = originalMailData.ccRecipients;
1819
mailItemToReply.bccRecipients = originalMailData.bccRecipients;
1920
break;
2021
case ButtonConfigEnums.RecipientsType.Sender:
22+
mailItemToReply.executeMethod = Office.context.mailbox.item.displayReplyFormAsync;
2123
mailItemToReply.toRecipients = originalMailData.sender;
2224
break;
2325
case ButtonConfigEnums.RecipientsType.SpecifiedByUser:
26+
mailItemToReply.executeMethod = Office.context.mailbox.item.displayReplyFormAsync;
2427
mailItemToReply.toRecipients = config.Recipients;
2528
break;
2629
default:
27-
break;
30+
break;
2831
}
29-
3032
if (config.AllowedDomainsType == ButtonConfigEnums.AllowedDomainsType.SpecifiedByUser) {
3133
const loweredAllowedDomains = config.AllowedDomains.toLowerCase();
3234
for (const recipient of [
@@ -42,27 +44,6 @@ export class MailDataCreator {
4244
return null;
4345
}
4446
}
45-
46-
if (config.Subject) {
47-
mailItemToReply.subject = config.Subject;
48-
}
49-
50-
if (config.SubjectPrefix) {
51-
mailItemToReply.subject = `${config.SubjectPrefix} ${mailItemToReply.subject}`;
52-
}
53-
54-
const replyMessage = "";
55-
56-
// The quote function is not supported yet.
57-
// if (config.QuoteType && !selectedMailItem.Body)
58-
// {
59-
// }
60-
61-
mailItemToReply.bodyHtml = config.Body ?? "";
62-
if (replyMessage) {
63-
mailItemToReply.bodyHtml += replyMessage;
64-
}
65-
6647
switch (config.ForwardType) {
6748
case ButtonConfigEnums.ForwardType.Attachment:
6849
mailItemToReply.attachments = [
@@ -83,7 +64,31 @@ export class MailDataCreator {
8364
];
8465
break;
8566
}
67+
return mailItemToReply;
68+
}
69+
static CreateReplyMailData({ config, originalSuject }) {
70+
const mailItemToReply = {};
71+
switch (config.RecipientsType) {
72+
case ButtonConfigEnums.RecipientsType.SpecifiedByUser:
73+
mailItemToReply.newToRecipients = config.Recipients;
74+
break;
75+
default:
76+
break;
77+
}
78+
79+
if (config.Subject) {
80+
mailItemToReply.subject = config.Subject;
81+
}
82+
else {
83+
mailItemToReply.subject = originalSuject;
84+
}
8685

86+
if (config.SubjectPrefix) {
87+
mailItemToReply.subject = `${config.SubjectPrefix} ${mailItemToReply.subject ?? ""}`;
88+
}
89+
90+
mailItemToReply.bodyHtml = config.Body ?? "";
91+
mailItemToReply.quoteType = config.QuoteType
8792
return mailItemToReply;
8893
}
8994
}

0 commit comments

Comments
 (0)