Skip to content

Commit

Permalink
Implement logics for merge configs and reset user config
Browse files Browse the repository at this point in the history
  • Loading branch information
HashidaTKS committed Jan 29, 2025
1 parent ce76641 commit 98228c5
Show file tree
Hide file tree
Showing 5 changed files with 218 additions and 110 deletions.
51 changes: 44 additions & 7 deletions src/web/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ async function getAllData() {
getBccAsync(),
getAttachmentsAsync(),
getMailIdAsync(),
ConfigLoader.load(),
ConfigLoader.loadEffectiveConfig(),
]);
let originalRecipients = {};
if (mailId) {
Expand Down Expand Up @@ -191,11 +191,43 @@ async function openDialog({ url, data, asyncContext, promptBeforeOpen, ...params
Office.context.roamingSettings.set("trustedDomains", config.trustedDomains ?? "");
Office.context.roamingSettings.set("unsafeDomains", config.unsafeDomains ?? "");
Office.context.roamingSettings.set("unsafeFiles", config.unsafeFiles ?? "");
Office.context.roamingSettings.saveAsync();
dialog.close();
resolve({
status: messageFromDialog.status,
asyncContext,
Office.context.roamingSettings.saveAsync((saveResult) => {
// This function should return (resolve) after finishing saveAsync.
// If returing before finishing saveAsync, roamingSettings is not
// updated until refresh the page.
if (saveResult.status === Office.AsyncResultStatus.Succeeded) {
console.debug("Settings saved successfully");
dialog.close();
resolve({
status: messageFromDialog.status,
asyncContext,
});
} else {
console.error("Error saving settings:", saveResult.error.message);
resolve({
status: Office.AsyncResultStatus.Failed,
asyncContext,
});
}
});
} else if (messageFromDialog.status == "resetUserConfig") {
console.debug("reset user config");
Office.context.roamingSettings.remove("common");
Office.context.roamingSettings.remove("trustedDomains");
Office.context.roamingSettings.remove("unsafeDomains");
Office.context.roamingSettings.remove("unsafeFiles");
Office.context.roamingSettings.saveAsync((saveResult) => {
if (saveResult.status === Office.AsyncResultStatus.Succeeded) {
console.debug("Settings saved successfully");
const newData = {
policy : data.policy,
user : ConfigLoader.createEmptyConfig(),
}
const messageToDialog = JSON.stringify(newData);
dialog.messageChild(messageToDialog);
} else {
console.error("Error saving settings:", saveResult.error.message);
}
});
} else {
dialog.close();
Expand Down Expand Up @@ -356,7 +388,12 @@ window.onNewMessageComposeCreated = onNewMessageComposeCreated;

// eslint-disable-next-line @typescript-eslint/no-unused-vars
async function onOpenSettingDialog(event) {
const data = await ConfigLoader.loadAsString();
const policyConfig = await ConfigLoader.loadFileConfig();
const userConfig = await ConfigLoader.loadUserConfig();
const data = {
policy : policyConfig,
user : userConfig,
}
let asyncContext = event;
const { status, asyncContext: updatedAsyncContext } = await openDialog({
url: window.location.origin + "/setting.html",
Expand Down
98 changes: 47 additions & 51 deletions src/web/config-loader.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ export class ConfigLoader {
}

static toArray(str) {
const resultList = [];
if (!str) {
return null;
return resultList;
}
const resultList = [];
str = str.trim();
for (let item of str.split("\n")) {
item = item.trim();
Expand All @@ -65,10 +65,10 @@ export class ConfigLoader {
}

static toDictionary(str, paramDefs) {
const dictionary = {};
if (!str) {
return null;
return dictionary;
}
const dictionary = {};
str = str.trim();
for (let item of str.split("\n")) {
item = item.trim();
Expand Down Expand Up @@ -103,7 +103,16 @@ export class ConfigLoader {
}
}

static async load() {
static async loadEffectiveConfig() {
const [fileConfig, userConfig] = await Promise.all([
this.loadFileConfig(),
this.loadUserConfig()
]);
const effectiveConfig = await this.merge(fileConfig, userConfig);
return effectiveConfig;
}

static async loadFileConfig() {
const [trustedDomainsString, unsafeDomainsString, unsafeFilesString, commonString] = await Promise.all([
this.loadFile("configs/TrustedDomains.txt"),
this.loadFile("configs/UnsafeDomains.txt"),
Expand All @@ -122,21 +131,6 @@ export class ConfigLoader {
};
}

static async loadAsString() {
const [trustedDomains, unsafeDomains, unsafeFiles, common] = await Promise.all([
this.loadFile("configs/TrustedDomains.txt"),
this.loadFile("configs/UnsafeDomains.txt"),
this.loadFile("configs/UnsafeFiles.txt"),
this.loadFile("configs/Common.txt"),
]);
return {
trustedDomains,
unsafeDomains,
unsafeFiles,
common,
};
}

/**
* Load user config from roamingSettings.
* Note tha this function does not work in the dialog context
Expand All @@ -161,53 +155,55 @@ export class ConfigLoader {
}
}

/**
* Load user config from roamingSettings.
* Note tha this function does not work in the dialog context
* because Office.context.roamingSettings does not work in the
* dialog context as its specification.
* @returns user data hash
*/
static async loadUserConfigAsString() {
const trustedDomains = Office.context.roamingSettings.get("trustedDomains") ?? "";
const unsafeDomains = Office.context.roamingSettings.get("unsafeDomains") ?? "";
const unsafeFiles = Office.context.roamingSettings.get("unsafeFiles") ?? "";
const common = Office.context.roamingSettings.get("common") ?? "";
static createDefaultConfig()
{
return {
common,
trustedDomains,
unsafeDomains,
unsafeFiles
common: {
CountEnabled: true,
CountAllowSkip: true,
SafeBccEnabled: true,
MainSkipIfNoExt: false,
SafeNewDomainsEnabled: true,
CountSeconds: 3,
SafeBccThreshold: 4,
},
trustedDomains: [],
unsafeDomains: [],
unsafeFiles: [],
}
}

static merge(left, right) {
if (!left) {
return right;
}
if (!right) {
return left;
static createEmptyConfig()
{
return {
common: {},
trustedDomains: [],
unsafeDomains: [],
unsafeFiles: [],
}
if (right.common.countEnabled != null) {
left.common.countEnabled = right.common.countEnabled;
}

static merge(left, right) {
if (right.common.CountEnabled != null) {
left.common.CountEnabled = right.common.CountEnabled;
}
if (right.common.countAllowSkip != null) {
left.common.countAllowSkip = right.common.countAllowSkip;
if (right.common.CountAllowSkip != null) {
left.common.CountAllowSkip = right.common.CountAllowSkip;
}
if (right.common.SafeBccEnabled != null) {
left.common.safeBccEnabled = right.common.safeBccEnabled;
left.common.SafeBccEnabled = right.common.SafeBccEnabled;
}
if (right.common.MainSkipIfNoExt != null) {
left.common.mainSkipIfNoExt = right.common.mainSkipIfNoExt;
left.common.MainSkipIfNoExt = right.common.MainSkipIfNoExt;
}
if (right.common.SafeNewDomainsEnabled != null) {
left.common.safeNewDomainsEnabled = right.common.safeNewDomainsEnabled;
left.common.SafeNewDomainsEnabled = right.common.SafeNewDomainsEnabled;
}
if (right.common.CountSeconds != null) {
left.common.countSeconds = right.common.countSeconds;
left.common.CountSeconds = right.common.CountSeconds;
}
if (right.common.SafeBccThreshold != null) {
left.common.safeBccThreshold = right.common.safeBccThreshold;
left.common.SafeBccThreshold = right.common.SafeBccThreshold;
}
left.trustedDomains = left.trustedDomains.concat(right.trustedDomains);
left.unsafeDomains = left.unsafeDomains.concat(right.unsafeDomains);
Expand Down
13 changes: 11 additions & 2 deletions src/web/setting.css
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ fluent-tabs {
height: 100%;
}

#cancel-button {
.button-container fluent-button {
margin-left: 10px;
}

Expand All @@ -58,4 +58,13 @@ fluent-text-area::part(control){
#countSeconds {
margin-left: 10px;
margin-right: 10px;
}
}

/* fluent-tab:hover {
background-color: #F5F5F5;
}
fluent-tab:active {
background-color: #FAFAFA;
} */

1 change: 1 addition & 0 deletions src/web/setting.html
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ <h3>FlexConfirmMail</h3>
</div>
<div class="dialog-footer">
<div class="button-container">
<fluent-button id="reset-button" onclick="onReset()" data-l10n-text-content="setting_resetSetting"></fluent-button>
<fluent-button id="save-button" onclick="onSave()" data-l10n-text-content="setting_saveAndQuit"></fluent-button>
<fluent-button id="cancel-button" onclick="onCancel()" data-l10n-text-content="setting_cancel"></fluent-button>
</div>
Expand Down
Loading

0 comments on commit 98228c5

Please sign in to comment.