{"version":3,"file":"Code.min.js","sources":["EncompassWebServices/includes/DashboardItemTypes/Code.js"],"sourcesContent":["\"use strict\";\r\n\r\nconst DashboardDocumentType = {\r\n 0: \"HTML\",\r\n 1: \"Javascript\",\r\n 2: \"CSS\",\r\n 3: \"ConvertedJs\",\r\n 4: \"TestScript\",\r\n 5: \"Markdown\",\r\n 6: \"CompiledJavascript\",\r\n 7: \"CompiledCss\",\r\n HTML: 0,\r\n Javascript: 1,\r\n CSS: 2,\r\n ConvertedJs: 3,\r\n TestScript: 4,\r\n Markdown: 5,\r\n CompiledJavascript: 6,\r\n CompiledCss: 7\r\n};\r\n\r\n(function () {\r\n const Deferred = function () {\r\n const deferred = {};\r\n const promise = new Promise(((resolve, reject) => {\r\n deferred.resolve = resolve;\r\n deferred.reject = reject;\r\n }));\r\n\r\n deferred.then = function (onFulfilled, onRejected) {\r\n promise.then(onFulfilled, onRejected);\r\n };\r\n\r\n return deferred;\r\n };\r\n\r\n let args;\r\n\r\n const runTestFunction = (resolve, reject) => {\r\n ECP.Dialog.ShowLoading(\"Testing......\", args.loadingCover ? args.loadingCover : \"\");\r\n\r\n const iFrames = document.querySelectorAll(\".test-code-iframe\");\r\n\r\n for (let index = 0; index < iFrames.length; index++) {\r\n document.body.removeChild(iFrames[index]);\r\n }\r\n\r\n const iframe = document.createElement(\"frame\");\r\n\r\n iframe.classList.add(\"test-code-iframe\");\r\n iframe.style.display = \"none\";\r\n iframe.style.height = \"100%\";\r\n iframe.style.width = \"100%\";\r\n\r\n iframe.onload = function () {\r\n iframe.contentWindow.onbeforeunload = function () {\r\n if (iframe.contentWindow.__coverage__ && iframe.contentWindow.ProcessTestScriptResult) {\r\n iframe.contentWindow.ProcessTestScriptResult(iframe.contentWindow.__coverage__, iframe.contentWindow.document, true);\r\n } else {\r\n clearInterval(timer);\r\n\r\n const errorDialog = ECP.Dialog.ShowDialog(\"Test Scripts Failed\", \"
The test script run failed because the test page has been unload (often through a 'location.href = ___' call).

Please fix your code and/or test cases
before saving as released.
\", {\r\n confirmButtonTitle: \"OK\"\r\n });\r\n errorDialog.querySelector(\".ecp-dialog-content\").style.fontSize = \"15px\";\r\n }\r\n\r\n iframe.contentWindow.MochaTested = true;\r\n };\r\n\r\n const timer = setInterval(() => {\r\n if (!iframe || !iframe.contentWindow || !iframe.contentWindow.document) {\r\n clearInterval(timer);\r\n return;\r\n }\r\n\r\n const iframeDocument = iframe.contentWindow.document;\r\n const mochaDom = iframeDocument.getElementById(\"mocha\");\r\n\r\n if (mochaDom && iframe.contentWindow.MochaTested) {\r\n ECP.Dialog.HideLoading();\r\n\r\n mochaDom.style.width = \"100%\";\r\n\r\n const titleLink = mochaDom.querySelector(\".suite h1 a\");\r\n\r\n if (titleLink && args.dashboardItemID) {\r\n titleLink.textContent = `Dashboard Item ${args.dashboardItemID}`;\r\n }\r\n\r\n const mochaLinks = mochaDom.querySelectorAll(\"a\");\r\n\r\n for (let i = 0; i < mochaLinks.length; i++) {\r\n mochaLinks[i].setAttribute(\"href\", \"#\");\r\n }\r\n\r\n const replayElements = mochaDom.getElementsByClassName(\"replay\");\r\n\r\n for (let i = 0; i < replayElements.length; i++) {\r\n replayElements[i].setAttribute(\"href\", \"#\");\r\n }\r\n\r\n clearInterval(timer);\r\n\r\n let success = true;\r\n\r\n if (parseInt(mochaDom.querySelector(\".failures em\").textContent, 10) > 0) {\r\n success = false;\r\n }\r\n\r\n if (mochaDom.querySelector(\".code-warning\")) {\r\n success = false;\r\n }\r\n\r\n const codeCoverage = mochaDom.querySelector(\".code-coverage\");\r\n\r\n if (codeCoverage) {\r\n const codeCoverageNum = codeCoverage.getAttribute(\"statement-coverage\");\r\n\r\n if (EC_Fmt.isNumber(codeCoverageNum) && parseFloat(codeCoverageNum).toFixed(2) * 100 < 80) {\r\n success = false;\r\n\r\n codeCoverage.style.color = \"red\";\r\n }\r\n } else {\r\n success = false;\r\n }\r\n\r\n if (success) {\r\n resolve();\r\n } else {\r\n reject();\r\n }\r\n\r\n const dialog = ECP.Dialog.ShowDialog(\"Test Result\", mochaDom, {\r\n width: 750,\r\n height: 450,\r\n confirmButtonTitle: success && args.confirmButtonTitle ? args.confirmButtonTitle : \"OK\",\r\n confirmButtonAction: success ? args.confirmButtonAction : undefined\r\n });\r\n\r\n if (args.loadingCover && args.loadingCover.style) {\r\n dialog.style.zIndex = parseInt(args.loadingCover.style.zIndex, 10) + 10;\r\n }\r\n\r\n if (args.tabCodeEditor && iframe.contentWindow.__coverage__[1]) {\r\n const coverage = iframe.contentWindow.__coverage__[1];\r\n const statementKeys = Object.keys(coverage.s);\r\n const newDecorations = [];\r\n\r\n for (let i = 0; i < statementKeys.length; i++) {\r\n const statementResult = coverage.s[statementKeys[i]];\r\n const statementMap = coverage.statementMap[i];\r\n const className = statementResult > 0 ? \"TestedLineDecoration\" : \"ErrorLineDecoration\";\r\n\r\n newDecorations.push({\r\n range: new args.tabCodeEditor.CodeEditors.jsEditor.editor.monaco.Range(statementMap.start.line, 1, statementMap.end.line, 1),\r\n options: {\r\n isWholeLine: false,\r\n linesDecorationsClassName: className,\r\n overviewRuler: statementResult === 0 ? { color: \"rgba(255, 0, 0, 1)\", position: 2 } : null\r\n }\r\n });\r\n }\r\n\r\n window.decorations = args.tabCodeEditor.CodeEditors.jsEditor.editor.monacoEditor.deltaDecorations(window.decorations || [], newDecorations);\r\n }\r\n }\r\n }, 100);\r\n };\r\n\r\n iframe.onerror = function () {\r\n reject();\r\n };\r\n\r\n // Task 1090882: System error: BC_GlobalDocument: Can not create a new Global Document, FileName in BC_GlobalDocument is empty\r\n iframe.src = `Home?RunCodeItemTest=True&EmbededDialog=True&CodeType=Code&HtmlDocumentID=${args.GlobalHtmlDocumentID}&CssDocumentID=${args.GlobalCssDocumentID}&JsDocumentID=${args.GlobalJsDocumentID}&ConvertedJsDocumentID=${EC_Fmt.Null2EmptyStr(args.GlobalConvertedJsDocumentID)}&TestDocuemntID=${args.GlobalTestDocumentID}&CompiledJsDocumentID=${args.GlobalCompiledJsDocumentID}&CompiledCssDocumentID=${args.GlobalCompiledCssDocumentID}`;\r\n\r\n document.body.appendChild(iframe);\r\n };\r\n\r\n const generateAITestScript = async (GlobalHtmlDocumentID, GlobalCssDocumentID, GlobalJsDocumentID, JavaScriptConnect) => {\r\n const myRequest = new ECP.EC_Request(\"GenerateAITestScript\");\r\n myRequest.SetReturnType(ECP.EC_ReturnType.Json);\r\n myRequest.AddRequestVariable(\"CSS\", GlobalCssDocumentID);\r\n myRequest.AddRequestVariable(\"HTML\", GlobalHtmlDocumentID);\r\n myRequest.AddRequestVariable(\"Javascript\", GlobalJsDocumentID);\r\n myRequest.AddRequestVariable(\"JavaScriptConnect\", JavaScriptConnect, ECP.EC_Verb.Post);\r\n const result = await myRequest.Submit();\r\n return result.code;\r\n };\r\n\r\n class TabCodeEditor {\r\n constructor() {\r\n this.EditorContainer = null;\r\n this.CodeEditors = {};\r\n this.Options = {};\r\n this.isSplitMove = false;\r\n this.linterDef = null;\r\n this.Markdown = null;\r\n this.SDK = null;\r\n this.NeedClearCDN = false;\r\n this.SaveDashboardCode = false;\r\n this.addNewItem = false;\r\n }\r\n\r\n InitEditors(dashboardItem, addNewItem) {\r\n const me = this;\r\n\r\n if (addNewItem) {\r\n me.addNewItem = true;\r\n }\r\n\r\n ECP.Dialog.ShowLoading(\"Loading Editor......\");\r\n\r\n return new Promise(async (resolve, reject) => {\r\n if (EC_Fmt.isMobile) {\r\n ECP.Dialog.HideLoading();\r\n ECP.Dialog.Alert(\"The Code Block Editor is not supported on mobile devices.\");\r\n\r\n reject();\r\n } else if (!me.EditorContainer) {\r\n // Task 669407: If another person has a code block open and is working on it, warn subsequent users when they open the code block to avoid changes over-writing eachother\r\n let CodeBlockAlreadyOpenBy = { OpenBy_AuthenticationID: null };\r\n if (dashboardItem && EC_Fmt.isInteger(dashboardItem.id)) {\r\n CodeBlockAlreadyOpenBy = await fetch(`api?APICommand=Dashboard_MarkCodeBlockOpen&DashboardItemID=${dashboardItem.id}`, { credentials: \"same-origin\" });\r\n CodeBlockAlreadyOpenBy = JSON.parse(await CodeBlockAlreadyOpenBy.text());\r\n }\r\n\r\n if (CodeBlockAlreadyOpenBy.OpenBy_AuthenticationID !== null) {\r\n ECP.Dialog.HideLoading();\r\n ECP.Dialog.ShowDialog(\"Confirm\", `
This Code Block is already open and being edited by:
${CodeBlockAlreadyOpenBy.OpenBy_FullName}

Editing will override their pending changes.`, {\r\n width: 450,\r\n cancelButtonTitle: \"Cancel\",\r\n confirmButtonTitle: \"Override\",\r\n cancelButtonAction() {\r\n reject();\r\n },\r\n confirmButtonAction(dialog) {\r\n ECP.Dialog.CloseDialog(dialog);\r\n ECP.Dialog.ShowLoading(\"Loading Editor......\");\r\n me.LoadEditor(dashboardItem, resolve);\r\n }\r\n });\r\n } else {\r\n me.LoadEditor(dashboardItem, resolve);\r\n }\r\n } else {\r\n ECP.Dialog.HideLoading();\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n LoadEditor(dashboardItem, resolve) {\r\n const me = this;\r\n const html = `
`\r\n + `
`\r\n + `
Code Block
`\r\n + `
`\r\n + `
`\r\n + ` Save Changes`\r\n + ` Run Test`\r\n + ` Commit w/ Message`\r\n + ` View History`\r\n + ` Generate AI Test Script`\r\n + ` Cancel`\r\n + `
`\r\n + `
`\r\n + ` Refresh Preview`\r\n + ` Open Preview`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + ` `\r\n + ` HTML`\r\n + `
`\r\n + `
`\r\n + ` `\r\n + ` CSS`\r\n + `
`\r\n + `
`\r\n + ` `\r\n + ` Javascript`\r\n + `
`\r\n + `
`\r\n + ` `\r\n + ` Test Script`\r\n + `
`\r\n + `
`\r\n + ` `\r\n + ` Documentation`\r\n + `
`\r\n + `
`\r\n + ` SDK`\r\n + ` `\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
${EC_Fmt.Null2EmptyStr(Settings.EnableBeta) === \"true\" ? \"

Editing Beta

\" : \"\"}
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + ` `\r\n + `
`\r\n + `
`\r\n + `
div.dashboard-item-dashboarditemid {
`\r\n + `
`\r\n + ` `\r\n + `
`\r\n + `
}
`\r\n + `
`\r\n + `
`\r\n + `
\"use strict\";
`\r\n + `
function CodeItemJsDashboardItemID(dashboardItem) {
`\r\n + `
`\r\n + ` `\r\n + `
`\r\n + `
}
`\r\n + `
`\r\n + `
`\r\n + `
\"use strict\";
`\r\n + `
describe(\"Test Dashboard Item {DashboardItemID}\", function () {
`\r\n + `
`\r\n + ` `\r\n + `
`\r\n + `
}
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
Markdown Guide
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + ` `\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n // Task 954694: Make the UI Kit available in the SDK tab of Code Blocks\r\n + ` `\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n\r\n + `
`\r\n + ``\r\n + `

Test Scripts

`\r\n + `

Test Scripts are required to release any Dashboard with a Code Block that contains JavaScript.

`\r\n + `

Test Scripts must hit a minimum of 80% Statement coverage.

`\r\n + `

Things to Know

`\r\n + `
    `\r\n + `
  • Put the corresponding code in the correct code tab`\r\n + `
      `\r\n + `
    • i.e. Don't put JavaScript in a <script> tag in the HTML tab
    • `\r\n + `
    `\r\n + `
  • `\r\n + `
  • The HTML tab contents do NOT have access to the JavaScript file directly`\r\n + ``\r\n + `
  • `\r\n + `
  • The test scripts use the Chai Assert APIs and the Mocha testing framework
  • `\r\n + `
  • Tests run sequentially, in the order they are written
  • `\r\n + `
  • You cannot debug test scripts`\r\n + `
      `\r\n + `
    • If a test script is failing for an unknown reason try using console.log to see data during the test (make sure to remove once done)
    • `\r\n + `
    • console.log can only be used in the Test Script tab, it cannot be in the JavaScript tab otherwise the test won't run due to an error
    • `\r\n + `
    `\r\n + `
  • `\r\n + `
  • Test scripts will fail if the page is unloaded for some reason (redirect on click for example)`\r\n + `
      `\r\n + `
    • Make sure the actual redirect is not run during the test
    • `\r\n + `
    `\r\n + `
  • `\r\n + `
  • Use EC_Fmt.TriggerEvent to trigger specific events on elements during testing`\r\n + `
      `\r\n + `
    • Most commonly used for UI based tests
    • `\r\n + `
    `\r\n + `
  • `\r\n + `
`\r\n + `

Best Practices

`\r\n + `
    `\r\n + `
  • Write test cases for as much code as possible`\r\n + `
      `\r\n + `
    • 80% is the minimum allowed but should not be the goal
    • `\r\n + `
    `\r\n + `
  • `\r\n + `
  • Don't write test scripts without at least 1 assert call`\r\n + `
      `\r\n + `
    • This may require some refactoring of JavaScript tab code to return data to check against
    • `\r\n + `
    • Check DOM changes when testing UI
    • `\r\n + `
    • Async tests with done are an exception
    • `\r\n + `
    `\r\n + `
  • `\r\n + `
  • Avoid calling APIs, downloading files, prompting to print, etc. in test scripts`\r\n + `
      `\r\n + `
    • APIs take more time to run and typically the result is all that is needed
    • `\r\n + `
    • Create test results and put those in the test scripts to feed into tests
    • `\r\n + `
    • Use a \"is testing\" variable to know when tests are running; if running don't call the APIs (example below)
    • `\r\n + `
    `\r\n + `
  • `\r\n + `
  • Keep test cases simple and focused`\r\n + `
      `\r\n + `
    • Don't test multiple things in a single test
    • `\r\n + `
    `\r\n + `
  • `\r\n + `
  • If using manual delays in test scripts, modify the test's expected slow time to avoid timeouts and false flags of slowness`\r\n + ``\r\n + `
  • `\r\n + `
  • If testing UI changes (dialog opening, text changing, etc.) query the DOM for the effected elements and assert the changes you expect those elements to have
  • `\r\n + `
`\r\n + `

Definitions

`\r\n + `
    `\r\n + `
  • describe - Function called to describe a set of test scripts`\r\n + `
      `\r\n + `
    • Could be a specific function or a workflow
    • `\r\n + `
    • Dictates how the final test results are grouped
    • `\r\n + `
    `\r\n + `
  • `\r\n + `
  • it - Function called to perform a particular test`\r\n + `
      `\r\n + `
    • Typically nested inside describe calls but can be by themselves
    • `\r\n + `
    `\r\n + `
  • `\r\n + `
  • assert - Used to confirm test script values are expected`\r\n + `
      `\r\n + `
    • Will fail a test script if the assert fails
    • `\r\n + `
    `\r\n + `
  • `\r\n + `
`\r\n + `

Templates/Examples

`\r\n + `

Basic

`\r\n + `
const assert = chai.assert;
`\r\n                + `
`\r\n                + `describe(\"Some Function\", () => {
`\r\n                + `    it(\"will do this\", () => {
`\r\n                + `        const TestData = {
`\r\n                + `            Test: \"abc\"
`\r\n                + `        };
`\r\n                + `
`\r\n                + `        const result = SomeFunction(TestData);
`\r\n                + `
`\r\n                + `        assert.equal(result, \"cba\", \"result should be reversed\");
`\r\n                + `    });
`\r\n                + `});
`\r\n                + `;
`\r\n                + `

Debug Variable

`\r\n + `

JavaScript tab

`\r\n + `
// At the top
`\r\n                + `let TestsAreRunning = false;
`\r\n                + `
`\r\n                + `function Enable_Testing() {
`\r\n                + `    TestsAreRunning = true;
`\r\n                + `}
`\r\n                + `
`\r\n                + `[...]
`\r\n                + `
`\r\n                + `// inside a function that redirects or calls an API
`\r\n                + `const myRequest = new EC_Request(\"SomeAPICommand\")
`\r\n                + `
`\r\n                + `if (!TestsAreRunning) {
`\r\n                + `    myRequest.submit()
`\r\n                + `}
`\r\n                + `

Test Script tab

`\r\n + `
const assert = chai.assert;
`\r\n                + `
`\r\n                + `before(() => {
`\r\n                + `    Enable_Testing();
`\r\n                + `});
`\r\n                + `
`\r\n                + `describe(\"Some Function\", () => {
`\r\n                + `    it(\"will do this\", () => {
`\r\n                + `        const TestData = {
`\r\n                + `            Test: \"abc\"
`\r\n                + `        };
`\r\n                + `
`\r\n                + `        const result = SomeFunction(TestData);
`\r\n                + `
`\r\n                + `        assert.equal(result, \"cba\", \"result should be reversed\");
`\r\n                + `    });
`\r\n                + `});
`\r\n                + `
`\r\n                + `

Manual Delay

`\r\n + `

This is typically used when waiting for a UI action to occur and checking results of that action

`\r\n + `
const assert = chai.assert;
`\r\n                + `
`\r\n                + `describe(\"Some Function\", () => {
`\r\n                + `    it(\"will open a dialog\", async () => {
`\r\n                + `        // FAST = slow/2
`\r\n                + `        // We are waiting 1 seconds always, default is 75ms
`\r\n                + `        this.slow(2075);
`\r\n                + `
`\r\n                + `        const TestData = {
`\r\n                + `            Test: \"abc\"
`\r\n                + `        };
`\r\n                + `
`\r\n                + `        SomeFunction(TestData);
`\r\n                + `        
`\r\n                + `        // Wait 1 second to make sure dialog has time to popup
`\r\n                + `        await delay(1000);
`\r\n                + `
`\r\n                + `        assert.isTrue(Dialog_IsShowing(), \"dialog should be showing\");
`\r\n                + `        assert.equal(Get_OnScreen_Dialog_Title(), TestData.Test, \"dialog title should match passed in data\");
`\r\n                + `    });
`\r\n                + `
`\r\n                + `    after(() => {
`\r\n                + `        // Cleanup any open dialogs after the test
`\r\n                + `        Click_CloseButton_On_ShowingDialogs();
`\r\n                + `    })
`\r\n                + `});
`\r\n                + `

UI Test

`\r\n + `
const assert = chai.assert;
`\r\n                + `
`\r\n                + `describe(\"Clicking the open dialog button\", () => {
`\r\n                + `    it(\"will open a dialog when valid data set\", async () => {
`\r\n                + `        // FAST = slow/2
`\r\n                + `        // We are waiting 1 seconds always, default is 75ms
`\r\n                + `        this.slow(2075);
`\r\n                + `
`\r\n                + `        const ValidData = {
`\r\n                + `            Test: \"abc\"
`\r\n                + `        };
`\r\n                + `
`\r\n                + `        UpdateFormData(ValidData);
`\r\n                + `
`\r\n                + `        EC_Fmt.TriggerEvent(document.getElementById(\"my-button\"), \"click\", { bubbles: true });
`\r\n                + `        
`\r\n                + `        // Wait 1 second to make sure dialog has time to popup
`\r\n                + `        await delay(1000);
`\r\n                + `
`\r\n                + `        assert.isTrue(Dialog_IsShowing(), \"dialog should be showing\");
`\r\n                + `        assert.equal(Get_OnScreen_Dialog_Title(), ValidData.Test, \"dialog title should match passed in data\");
`\r\n                + `    });
`\r\n                + `
`\r\n                + `    it(\"will not open a dialog with inputs when valid data set\", async () => {
`\r\n                + `        // FAST = slow/2
`\r\n                + `        // We are waiting 1 seconds always, default is 75ms
`\r\n                + `        this.slow(2075);
`\r\n                + `
`\r\n                + `        const InvalidData;
`\r\n                + `
`\r\n                + `        UpdateFormData(InvalidData);
`\r\n                + `
`\r\n                + `        EC_Fmt.TriggerEvent(document.getElementById(\"my-button\"), \"click\", { bubbles: true });
`\r\n                + `        
`\r\n                + `        // Wait 1 second to make sure dialog has time to popup
`\r\n                + `        await delay(1000);
`\r\n                + `
`\r\n                + `        assert.isFalse(Dialog_IsShowing(), \"dialog should not be showing\");
`\r\n                + `        assert.isTrue(document.querySelector(\"input[name=my-input]\").hasAttribute(\"error\"), \"input should be in error\");
`\r\n                + `    });
`\r\n                + `
`\r\n                + `    after(() => {
`\r\n                + `        // Cleanup any open dialogs after the test
`\r\n                + `        Click_CloseButton_On_ShowingDialogs();
`\r\n                + `    })
`\r\n                + `});;
`\r\n                + `

Asynchronous Tests

`\r\n + `

See Mocha's Asynchronous Code for more information about done

`\r\n + `
const assert = chai.assert;
`\r\n                + `
`\r\n                + `describe(\"Async Functions\", () => {
`\r\n                + `    // passing in a callback
`\r\n                + `    // testing will wait until done() is called
`\r\n                + `    it(\"will work without failing\", (done) => {
`\r\n                + `        SomeFunction((error) => {
`\r\n                + `            if (error) {
`\r\n                + `                done(error);
`\r\n                + `            } else {
`\r\n                + `                done();
`\r\n                + `            }
`\r\n                + `        });
`\r\n                + `    });
`\r\n                + `
`\r\n                + `    // Asserting with a returned Promise
`\r\n                + `    it(\"will return a promise with the correct results\", (done) => {
`\r\n                + `        return SomeFunction().then((data) => {
`\r\n                + `            assert.equal(data.value, \"1234\", \"function returns 1234\");
`\r\n                + `        });
`\r\n                + `    });
`\r\n                + `
`\r\n                + `    // Awaiting a promise
`\r\n                + `    it(\"will return correct results\", async (done) => {
`\r\n                + `        const Data = await SomeFunction();
`\r\n                + `
`\r\n                + `        assert.equal(Data.value, \"1234\", \"function returns 1234\");
`\r\n                + `    });
`\r\n                + `});
`\r\n                + `
`\r\n                + `

Helpful Functions

`\r\n + `

delay(milliseconds)

`\r\n + `

Halts execution for the specified milliseconds

`\r\n + `
    `\r\n + `
  • milliseconds: number Number of milliseconds to wait for
  • `\r\n + `
`\r\n + `
function delay(milliseconds) {
`\r\n                + `    return new Promise(res => setTimeout(res, milliseconds));
`\r\n                + `};
`\r\n                + `

Example

`\r\n + `
// wait for 1 second
`\r\n                + `await delay(1000);
`\r\n                + `

Click_ConfirmButton_On_ShowingDialogs()

`\r\n + `

Click the confirm button on all showing dialogs

`\r\n + `
function Click_ConfirmButton_On_ShowingDialogs() {
`\r\n                + `    const dialogs = document.querySelectorAll(\".ecp-dialog\");
`\r\n                + `    for (let i = 0; i < dialogs.length; ++i) {
`\r\n                + `        // Find dialogs that are still showing
`\r\n                + `        if (dialogs[i].style.display !== \"none\") {
`\r\n                + `            EC_Fmt.TriggerEvent(dialogs[i].querySelector(\".ecp-dialog-confirm-button\"), \"click\", { bubbles: true });
`\r\n                + `        }
`\r\n                + `    }
`\r\n                + `}
`\r\n                + `

Example

`\r\n + `
SomeFunctionThatOpenDialog();
`\r\n                + `// wait for the dialog to show up
`\r\n                + `await delay(1000);
`\r\n                + `
`\r\n                + `// Click confirm to test the confirm action on a dialog
`\r\n                + `Click_ConfirmButton_On_ShowingDialogs();`\r\n                + `

Click_CloseButton_On_ShowingDialogs()

`\r\n + `

Click the close button (top-right X button) on all showing dialogs

`\r\n + `
function Click_CloseButton_On_ShowingDialogs() {
`\r\n                + `    const Dialogs = document.querySelectorAll(\".ecp-dialog\");
`\r\n                + `
`\r\n                + `    for (let i = 0; i < Dialogs.length; ++i) {
`\r\n                + `        // Find dialogs that are still showing
`\r\n                + `        if (Dialogs[i].style.display !== \"none\") {
`\r\n                + `            EC_Fmt.TriggerEvent(Dialogs[i].querySelector(\".ecp-dialog-close\"), \"click\", { bubbles: true });
`\r\n                + `        }
`\r\n                + `    }
`\r\n                + `}`\r\n                + `

Example

`\r\n + `
// close all opened dialogs after test cases run before the next set
`\r\n                + `after(() => {
`\r\n                + `    // Click confirm to test the confirm action on a dialog
`\r\n                + `    Click_CloseButton_On_ShowingDialogs();
`\r\n                + `});`\r\n                + `

Dialog_IsShowing()

`\r\n + `

Determines if there is a dialog currently displayed during tests

`\r\n + `
    `\r\n + `
  • Returns: boolean true if a dialog is on screen, false if no dialog is showing
  • `\r\n + `
`\r\n + `
function Dialog_IsShowing() {
`\r\n                + `    const dialogs = document.querySelectorAll(\".ecp-dialog\");
`\r\n                + `    for (let i = 0; i < dialogs.length; ++i) {
`\r\n                + `        // Find dialogs that are still showing
`\r\n                + `        if (dialogs[i].style.display !== \"none\") {
`\r\n                + `            return true;
`\r\n                + `        }
`\r\n                + `    }
`\r\n                + `    return false;
`\r\n                + `}`\r\n                + `

Example

`\r\n + `
SomeFunctionThatOpenDialog();
`\r\n                + `// wait for the dialog to show up
`\r\n                + `await delay(1000);
`\r\n                + `
`\r\n                + `assert.isTrue(Dialog_IsShowing(), \"dialog should be showing\");`\r\n                + `

Get_OnScreen_Dialog()

`\r\n + `

Gets the first showing dialog and returns the whole Element

`\r\n + `
    `\r\n + `
  • Returns: Element The first showing dialog element, containing header, contents, and buttons; null otherwise
  • `\r\n + `
`\r\n + `
function Get_OnScreen_Dialog() {
`\r\n                + `    const dialogs = document.querySelectorAll(\".ecp-dialog\");
`\r\n                + `    for (let i = 0; i < dialogs.length; ++i) {
`\r\n                + `        // Find dialogs that are still showing
`\r\n                + `        if (dialogs[i].style.display !== \"none\") {
`\r\n                + `            return dialogs[i];
`\r\n                + `        }
`\r\n                + `    }
`\r\n                + `    return null;
`\r\n                + `}`\r\n                + `

Example

`\r\n + `
SomeFunctionThatOpenDialog();
`\r\n                + `// wait for the dialog to show up
`\r\n                + `await delay(1000);
`\r\n                + `
`\r\n                + `const OpenDialog = Get_OnScreen_Dialog();
`\r\n                + `
`\r\n                + `assert.exists(OpenDialog.querySelector(\"[name=SomeName]\"), \"dialog should be open\");`\r\n                + `

Get_OnScreen_Dialog_Title()

`\r\n + `

Returns the title string of the first showing dialog

`\r\n + `
    `\r\n + `
  • Returns: string The title of first found open dialog; \"\" (empty string) returned if no Dialog found
  • `\r\n + `
`\r\n + `
function Get_OnScreen_Dialog_Title() {
`\r\n                + `    const dialogs = document.querySelectorAll(\".ecp-dialog\");
`\r\n                + `    for (let i = 0; i < dialogs.length; ++i) {
`\r\n                + `        // Find dialogs that are still showing
`\r\n                + `        if (dialogs[i].style.display !== \"none\") {
`\r\n                + `            return dialogs[i].querySelector(\".ecp-dialog-title\").innerText;
`\r\n                + `        }
`\r\n                + `    }
`\r\n                + `    return \"\";
`\r\n                + `}
`\r\n                + ``\r\n                + `

Example

`\r\n + `
SomeFunctionThatOpenDialog();
`\r\n                + `// wait for the dialog to show up
`\r\n                + `await delay(1000);
`\r\n                + `
`\r\n                + `assert.equal(Get_OnScreen_Dialog_Title(), \"My Dialog Title\", \"title should match\");`\r\n                + `

Get_OnScreen_Dialog_Content()

`\r\n + `

Returns the innerHTML string of the content of the first open dialog
`\r\n + `Used for simple dialog content checking

`\r\n + `
    `\r\n + `
  • Returns: string The innerHTML of the found dialog
  • `\r\n + `
`\r\n + `
function Get_OnScreen_Dialog_Content() {
`\r\n                + `    const dialogs = document.querySelectorAll(\".ecp-dialog\");
`\r\n                + `    for (let i = 0; i < dialogs.length; ++i) {
`\r\n                + `        // Find dialogs that are still showing
`\r\n                + `        if (dialogs[i].style.display !== \"none\") {
`\r\n                + `            return dialogs[i].querySelector(\".ecp-dialog-content div\").innerHTML;
`\r\n                + `        }
`\r\n                + `    }
`\r\n                + `    return \"\";
`\r\n                + `}`\r\n                + `

Example

`\r\n + `
SomeFunctionThatOpenDialog();
`\r\n                + `// wait for the dialog to show up
`\r\n                + `await delay(1000);
`\r\n                + `
`\r\n                + `assert.equal(Get_OnScreen_Dialog_Content(), \"Are you sure you want to do this action?\", \"contents should match\");`\r\n                + `
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
`\r\n + `
`;\r\n\r\n const tempDiv = document.createElement(\"div\");\r\n tempDiv.innerHTML = html;\r\n\r\n me.EditorContainer = tempDiv.firstChild;\r\n document.body.appendChild(me.EditorContainer);\r\n\r\n // Close\r\n me.EditorContainer.querySelector(\"#ews-code-cancel-button\").addEventListener(\"click\", () => {\r\n // Task 669407: If another person has a code block open and is working on it, warn subsequent users when they open the code block to avoid changes over-writing eachother\r\n if (dashboardItem && EC_Fmt.isInteger(dashboardItem.id)) {\r\n fetch(`api?APICommand=Dashboard_MarkCodeBlockClosed&DashboardItemID=${dashboardItem.id}`, { credentials: \"same-origin\" });\r\n }\r\n me.CloseEditor();\r\n });\r\n\r\n // Open/Close Preview\r\n me.EditorContainer.querySelector(\"#ews-code-preview-button\").addEventListener(\"click\", function () {\r\n me.TogglePreview(this);\r\n });\r\n\r\n // Split\r\n me.EditorContainer.addEventListener(\"mousemove\", (mouseEvent) => {\r\n if (me.isSplitMove) {\r\n const previewWidth = mouseEvent.pageX / parseInt(getComputedStyle(me.EditorContainer).width.replace(\"px\", \"\"), 10);\r\n me.EditorContainer.querySelector(\".ews-code-autofix\").style.right = `${(1 - previewWidth) * 100}%`;\r\n me.EditorContainer.querySelector(\".ews-code-editors\").style.right = `${(1 - previewWidth) * 100}%`;\r\n me.EditorContainer.querySelector(\".ews-code-preview\").style.left = `${previewWidth * 100}%`;\r\n me.EditorContainer.querySelector(\".ews-code-editor-split\").style.left = `${previewWidth * 100}%`;\r\n }\r\n });\r\n\r\n me.EditorContainer.querySelector(\".ews-code-editor-split\").addEventListener(\"mousedown\", () => {\r\n me.isSplitMove = true;\r\n const iFrames = me.EditorContainer.querySelectorAll(\"iframe\");\r\n for (let i = 0; i < iFrames.length; i++) {\r\n iFrames[i].style.pointerEvents = \"none\";\r\n }\r\n });\r\n\r\n document.addEventListener(\"mouseup\", () => {\r\n me.isSplitMove = false;\r\n const iFrames = me.EditorContainer.querySelectorAll(\"iframe\");\r\n for (let i = 0; i < iFrames.length; i++) {\r\n iFrames[i].style.pointerEvents = \"auto\";\r\n }\r\n });\r\n\r\n // Refresh Preview\r\n me.EditorContainer.querySelector(\"#ews-code-refresh-button\").addEventListener(\"click\", () => {\r\n // Task 939222: Refresh the session whenever clicking refresh preview in the code block\r\n EWS.VerifySession(() => {\r\n me.RefreshPreview();\r\n });\r\n });\r\n\r\n // Save Code\r\n me.EditorContainer.querySelector(\"#ews-code-save-button\").addEventListener(\"click\", () => {\r\n // Task 669407: If another person has a code block open and is working on it, warn subsequent users when they open the code block to avoid changes over-writing eachother\r\n if (dashboardItem && EC_Fmt.isInteger(dashboardItem.id)) {\r\n fetch(`api?APICommand=Dashboard_MarkCodeBlockClosed&DashboardItemID=${dashboardItem.id}`, { credentials: \"same-origin\" });\r\n }\r\n me.SaveCode({\r\n closeEditor: true,\r\n callCallback: true\r\n });\r\n });\r\n\r\n // Test Code\r\n me.EditorContainer.querySelector(\"#ews-code-runtest-button\").addEventListener(\"click\", () => {\r\n if (!me.ValidateTestCode()) {\r\n return;\r\n }\r\n\r\n // Task 946448: Prevent developers from using window.console.log() to by-pass the 80% code coverage requirement\r\n // Check ESLint Error\r\n const {\r\n errors\r\n } = me.CodeEditors.jsEditor;\r\n\r\n if (errors?.length > 0) {\r\n ECP.Dialog.ShowDialog(\"Javascript Code Error\", `
The javascript code has ${errors.length} error${errors.length > 1 ? \"s\" : \"\"}. Please correct the code first.
`, {\r\n confirmButtonTitle: \"OK\"\r\n });\r\n\r\n return;\r\n }\r\n\r\n const def = Deferred();\r\n\r\n me.SaveCode({\r\n deferred: def\r\n });\r\n\r\n def.then(() => {\r\n TabCodeEditor.RunTest(Object.assign({}, me.Options.itemFields, {\r\n isGlobal: me.Options.isGlobal,\r\n loadingCover: \".ews-code-container\",\r\n tabCodeEditor: me\r\n })).catch(() => {\r\n // this is the testing script, catch test errors here\r\n });\r\n });\r\n });\r\n\r\n // Generate AI Test Script\r\n const generateTestScriptBtn = me.EditorContainer.querySelector(\"#ews-code-generateAITestScript-button\");\r\n let countDown = 0;\r\n function ensureSecondLine(text) {\r\n const requiredLines = [\"/* eslint-disable */\", \"var assert = chai.assert;\"];\r\n const lines = text.split(\"\\n\");\r\n requiredLines.forEach((line, index) => {\r\n if (lines[index] !== line) {\r\n lines.splice(index, 0, line);\r\n }\r\n });\r\n return lines.join(\"\\n\");\r\n }\r\n generateTestScriptBtn.addEventListener(\"click\", async () => {\r\n const myJSEditors = me.CodeEditors.jsEditor.editor.monacoEditor;\r\n const selection = myJSEditors.getSelection();\r\n const jsSelectedText = myJSEditors.getModel().getValueInRange(selection);\r\n if (EC_Fmt.isNull(jsSelectedText)) {\r\n ECP.Dialog.ShowDialog(\r\n \"Generate AI Test Script Error\",\r\n \"
Please select the snippet containing the Javascript code.
\",\r\n {\r\n confirmButtonTitle: \"OK\"\r\n }\r\n );\r\n return;\r\n }\r\n if (EC_Fmt.isNull(me.CodeEditors.testEditor.code) && !me.CodeEditors.testEditor.code.startsWith(\"/* eslint-disable */\")) {\r\n me.CodeEditors.testEditor.code = ensureSecondLine(me.CodeEditors.testEditor.code);\r\n }\r\n const { errors } = me.CodeEditors.jsEditor;\r\n\r\n if (errors?.length > 0) {\r\n ECP.Dialog.ShowDialog(\r\n \"Javascript Code Error\",\r\n `
The javascript code has ${errors.length\r\n } error${errors.length > 1 ? \"s\" : \"\"\r\n }. Please correct the code first.
`,\r\n {\r\n confirmButtonTitle: \"OK\"\r\n }\r\n );\r\n return;\r\n }\r\n if (countDown === 0) {\r\n me.EditorContainer.querySelector(`.ews-code-tabs .ews-code-tab[data-type='test'] span`).click();\r\n ECP.Dialog.ShowDialog(\r\n \"Generate AI Test Script\",\r\n \"This code was generated by an AI and may contain errors or inefficiencies. Please thoroughly review and test it before use.\",\r\n {\r\n confirmButtonTitle: \"Confirm\",\r\n cancelButtonTitle: \"Cancel\",\r\n confirmButtonAction: async () => {\r\n ECP.Dialog.ShowLoading(\"Generating...\", \".ews-code-container\");\r\n try {\r\n const result = await generateAITestScript(\r\n me.Options.itemFields.GlobalHtmlDocumentID,\r\n me.Options.itemFields.GlobalCssDocumentID,\r\n me.Options.itemFields.GlobalJsDocumentID,\r\n jsSelectedText\r\n );\r\n if (!EC_Fmt.isNull(result)) {\r\n me.CodeEditors.testEditor.code += `\\n${result}`;\r\n countDown = 60;\r\n } else {\r\n ECP.Dialog.ShowDialog(\"Generate AI\", \"Failure to generate test code through the AI LLM\");\r\n }\r\n } catch (error) {\r\n ECP.Dialog.ShowDialog(\"Generate AI\", \"Failure to generate test code through the AI LLM\");\r\n }\r\n generateTestScriptBtn.disabled = true;\r\n generateTestScriptBtn.innerText = `Generate AI Test Script (${countDown}s)`;\r\n const interval = setInterval(() => {\r\n countDown--;\r\n generateTestScriptBtn.innerText = `Generate AI Test Script (${countDown}s)`;\r\n if (countDown <= 0) {\r\n clearInterval(interval);\r\n generateTestScriptBtn.disabled = false;\r\n generateTestScriptBtn.innerText = `Generate AI Test Script`;\r\n }\r\n }, 1000);\r\n ECP.Dialog.HideLoading();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n\r\n // Commit to Git With Message\r\n me.EditorContainer.querySelector(\"#ews-code-commit-button\").addEventListener(\"click\", () => {\r\n const changed = Array.from(me.EditorContainer.querySelectorAll(`.ews-code-tabs .ews-code-tab span`)).some(tabSpan => tabSpan.innerHTML.includes(\"*\"));\r\n\r\n const dialogContent = \"
\"\r\n + \"Commit Message\"\r\n + \"\"\r\n + \"
\";\r\n\r\n const dialog = ECP.Dialog.ShowDialog(\"Save With Commit Message\", dialogContent, {\r\n confirmButtonTitle: \"Save\",\r\n confirmButtonAction: async () => {\r\n const message = dialog.querySelector(\".ews-code-message\").value.trim();\r\n\r\n if (changed) {\r\n await me.SaveCode({ message });\r\n }\r\n\r\n const DashboardDocuments = [];\r\n\r\n if (me.Options.itemFields.GlobalHtmlDocumentID) {\r\n DashboardDocuments.push({\r\n Type: DashboardDocumentType.HTML,\r\n GlobalDocumentID: me.Options.itemFields.GlobalHtmlDocumentID\r\n });\r\n }\r\n\r\n if (me.Options.itemFields.GlobalCssDocumentID) {\r\n DashboardDocuments.push({\r\n Type: DashboardDocumentType.CSS,\r\n GlobalDocumentID: me.Options.itemFields.GlobalCssDocumentID\r\n });\r\n }\r\n\r\n if (me.Options.itemFields.GlobalJsDocumentID) {\r\n DashboardDocuments.push({\r\n Type: DashboardDocumentType.Javascript,\r\n GlobalDocumentID: me.Options.itemFields.GlobalJsDocumentID\r\n });\r\n }\r\n\r\n if (me.Options.itemFields.GlobalTestDocumentID) {\r\n DashboardDocuments.push({\r\n Type: DashboardDocumentType.TestScript,\r\n GlobalDocumentID: me.Options.itemFields.GlobalTestDocumentID\r\n });\r\n }\r\n\r\n if (me.Options.itemFields.GlobalMarkdownDocumentID) {\r\n DashboardDocuments.push({\r\n Type: DashboardDocumentType.Markdown,\r\n GlobalDocumentID: me.Options.itemFields.GlobalMarkdownDocumentID\r\n });\r\n }\r\n\r\n const DashboardCodeItemData = [];\r\n DashboardCodeItemData.push({ DashboardDocuments });\r\n\r\n await CommitCodeDocument(Settings.DashboardID, Settings.DashboardVersionID, DashboardCodeItemData, message);\r\n ECP.Dialog.HideLoading();\r\n }\r\n });\r\n });\r\n\r\n // View History\r\n me.EditorContainer.querySelector(\"#ews-code-viewHistory-button\").addEventListener(\"click\", () => {\r\n const currentType = me.EditorContainer.querySelector(\".ews-code-tab.ews-code-tab-selected\").dataset.type;\r\n const currentEditor = me.EditorContainer.querySelector(`.ews-code-editors editor[data-type='${currentType}']`);\r\n\r\n if (currentEditor) {\r\n me.ViewHistory(currentEditor);\r\n }\r\n });\r\n\r\n // Auto Fix js Code\r\n me.EditorContainer.querySelector(\".ews-code-autofix\").addEventListener(\"click\", () => {\r\n me.CodeEditors.jsEditor.fix();\r\n });\r\n me.EditorContainer.querySelector(\"#ews-code-guide-button\").addEventListener(\"click\", () => {\r\n const markdownGuideData = [\r\n {\r\n title: \"Headings\",\r\n examples: [\r\n {\r\n type: \"Heading 1\",\r\n example: \"# Heading 1\",\r\n prefix: \"# \",\r\n height: 100\r\n },\r\n {\r\n type: \"Heading 2\",\r\n example: \"## Heading 2\",\r\n prefix: \"## \",\r\n height: 90\r\n },\r\n {\r\n type: \"Heading 3\",\r\n example: \"### Heading 3\",\r\n prefix: \"### \"\r\n },\r\n {\r\n type: \"Heading 4\",\r\n example: \"#### Heading 4\",\r\n prefix: \"#### \"\r\n },\r\n {\r\n type: \"Heading 5\",\r\n example: \"##### Heading 5\",\r\n prefix: \"##### \"\r\n },\r\n {\r\n type: \"Heading 6\",\r\n example: \"###### Heading 6\",\r\n prefix: \"###### \"\r\n }\r\n ]\r\n },\r\n {\r\n title: \"Text Formatting\",\r\n examples: [\r\n {\r\n type: \"Bold\",\r\n example: \"**Bold Text**\",\r\n prefix: \"**\",\r\n suffix: \"**\"\r\n },\r\n {\r\n type: \"Italic\",\r\n example: \"*Italicized Text*\",\r\n prefix: \"*\",\r\n suffix: \"*\"\r\n },\r\n {\r\n type: \"Code\",\r\n example: \"`var myVariable;`\",\r\n prefix: \"`\",\r\n suffix: \"`\"\r\n },\r\n {\r\n type: \"Link\",\r\n example: \"[Title of Link](https://www.google.com)\",\r\n prefix: \"[](\",\r\n suffix: \")\"\r\n },\r\n {\r\n type: \"Image\",\r\n example: \"![Alternate Text](https://cdn.e8.co/GlobalDocs/580188.svg)\",\r\n prefix: \"![](\",\r\n suffix: \")\",\r\n height: 255\r\n }\r\n ]\r\n },\r\n {\r\n title: \"Section Formatting\",\r\n examples: [\r\n {\r\n type: \"Horizontal Rule\",\r\n example: \"---\",\r\n prefix: \"---\\n\"\r\n },\r\n {\r\n type: \"Block Quote\",\r\n example: \"> This is a Quote\",\r\n prefix: \"> \"\r\n },\r\n {\r\n type: \"Ordered List\",\r\n example: \"1. Item One\\n
2. Item Two\\n
3. Item Three\",\r\n prefix: \"1. \",\r\n height: 120\r\n },\r\n {\r\n type: \"Unordered List\",\r\n example: \"- Item One\\n
- Item Two\\n
- Item Three\",\r\n prefix: \"- \",\r\n height: 120\r\n },\r\n {\r\n type: \"Fenced Code\",\r\n example: \"```\\n
{\\n
 \\\"variable1\\\":\\\"value1\\\",\\n
 \\\"variable2\\\":\\\"value2\\\"\\n
}\\n
```\",\r\n prefix: \"```\\n\",\r\n suffix: \"\\n```\",\r\n height: 150\r\n },\r\n {\r\n type: \"Table\",\r\n example: \"|Col1|Col2|Col3|\\n
|----|----|----|\\n
| a1 | a2 | a3 |\\n
| b1 | b2 | b3 |\\n
| c1 | c2 | c3 |\",\r\n prefix: \"|\",\r\n suffix: \"||\\n|----|----|\\n| | |\",\r\n height: 200\r\n }\r\n ]\r\n }\r\n ];\r\n let htmlB = \"\";\r\n for (let i = 0; i < markdownGuideData.length; i++) {\r\n const section = markdownGuideData[i];\r\n htmlB += `

${section.title}

`\r\n + `
`\r\n + ``\r\n + ``\r\n + ``\r\n + ``\r\n + ``;\r\n for (let j = 0; j < section.examples.length; j++) {\r\n const example = section.examples[j];\r\n htmlB += ``\r\n + ``\r\n + ``\r\n + ``\r\n + ``\r\n + ``;\r\n }\r\n htmlB += ``\r\n + `

Type

Syntax

Example

${example.type}${example.example}${example.example}
`\r\n + `
`;\r\n }\r\n\r\n ECP.Dialog.ShowLoading();\r\n\r\n const markdownGuide = ECP.Dialog.ShowDialog(\"Markdown Guide\", htmlB, {\r\n width: 900,\r\n height: 1400,\r\n confirmButtonTitle: \"Close\"\r\n });\r\n\r\n const pasteButtons = markdownGuide.querySelectorAll(\".ews-icon-paste\");\r\n const markdownEditor = me.CodeEditors.markdownEditor.editor.monacoEditor;\r\n const monacoLibrary = me.CodeEditors.markdownEditor.frame.contentWindow.monaco;\r\n for (let i = 0; i < pasteButtons.length; i++) {\r\n pasteButtons[i].addEventListener(\"click\", () => {\r\n const selection = markdownEditor.getSelection();\r\n const selectedText = markdownEditor.getModel().getValueInRange(markdownEditor.getSelection(selection));\r\n markdownEditor.executeEdits(\"\", [\r\n {\r\n range: new monacoLibrary.Range(selection.startLineNumber, selection.startColumn, selection.endLineNumber, selection.endColumn),\r\n text: pasteButtons[i].dataset.prefix + selectedText + pasteButtons[i].dataset.suffix\r\n }\r\n ]);\r\n markdownGuide.parentElement.removeChild(markdownGuide);\r\n });\r\n }\r\n\r\n const markdownGuidePreviews = markdownGuide.querySelectorAll(\"markdown\");\r\n for (let i = 0; i < markdownGuidePreviews.length; i++) {\r\n const markdown = new Markdown(markdownGuidePreviews[i], \"\", markdownGuidePreviews[i].innerText);\r\n }\r\n\r\n ECP.Dialog.HideLoading();\r\n });\r\n\r\n const loadPromises = [];\r\n\r\n // Init Code Editor\r\n const myEditors = me.EditorContainer.querySelectorAll(\".ews-code-editors editor\");\r\n for (let i = 0; i < myEditors.length; i++) {\r\n const ele = myEditors[i];\r\n\r\n loadPromises.push(() => new Promise((loadResolve) => {\r\n me.CodeEditors[ele.id] = new Editor(me.EditorContainer.querySelector(`#${ele.id}`), ele.id, me.Options[`${ele.dataset.type}Content`] || \"\");\r\n\r\n ele.addEventListener(\"ready\", () => {\r\n loadResolve();\r\n\r\n me.CodeEditors[ele.id].frame.contentWindow.document.addEventListener(\"keydown\", (event) => {\r\n if ((event.ctrlKey || event.metaKey) && event.code === \"KeyS\") {\r\n event.preventDefault();\r\n\r\n me.SaveCode();\r\n\r\n return false;\r\n }\r\n\r\n if ((event.altKey || event.metaKey) && (event.code === \"ArrowLeft\" || event.code === \"ArrowRight\")) {\r\n event.preventDefault();\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n });\r\n }));\r\n\r\n if (ele.dataset.type === \"js\") {\r\n ele.addEventListener(\"change\", () => {\r\n if (me.linterDef) {\r\n me.linterDef.resolve();\r\n }\r\n });\r\n }\r\n\r\n let timer;\r\n\r\n ele.addEventListener(\"input\", function () {\r\n const {\r\n type\r\n } = this.dataset;\r\n\r\n const span = me.EditorContainer.querySelector(`.ews-code-tabs .ews-code-tab[data-type='${type}'] span`);\r\n\r\n if (me.CodeEditors[`${type}Editor`].code.replace(/\\r\\n/g, \"\\n\") !== (me.Options[`${type}Origin`] || \"\").replace(/\\r\\n/g, \"\\n\")) {\r\n if (!span.innerHTML.includes(\"*\")) {\r\n span.innerHTML += \"*\";\r\n }\r\n } else if (span.innerHTML.includes(\"*\")) {\r\n span.innerHTML = span.innerHTML.replace(\"*\", \"\");\r\n }\r\n\r\n if (timer) {\r\n clearTimeout(timer);\r\n }\r\n\r\n timer = setTimeout(() => {\r\n if (type === \"markdown\") {\r\n me.RefreshPreview();\r\n }\r\n }, 200);\r\n });\r\n }\r\n\r\n // Task 954694: Make the UI Kit available in the SDK tab of Code Blocks\r\n const sdkExternalLink = document.getElementById(\"ews-code-sdk-externallink\");\r\n if (sdkExternalLink) {\r\n sdkExternalLink.addEventListener(\"click\", (e) => {\r\n let link = me.EditorContainer.querySelector(\"#sdkPreview\").contentWindow.location.href;\r\n if (link === \"about:blank\") {\r\n link = \"Home?DashboardID=193376\";\r\n } else {\r\n link = link.replace(/EmbededDialog=True/ig, \"\");\r\n }\r\n window.open(link);\r\n\r\n e.stopPropagation();\r\n });\r\n }\r\n\r\n document.addEventListener(\"keydown\", (event) => {\r\n if ((event.ctrlKey || event.metaKey) && event.code === \"KeyS\") {\r\n event.preventDefault();\r\n\r\n me.SaveCode();\r\n\r\n return false;\r\n }\r\n\r\n if ((event.altKey || event.metaKey) && (event.code === \"ArrowLeft\" || event.code === \"ArrowRight\")) {\r\n event.preventDefault();\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n // Init Markdown\r\n const markdown = me.EditorContainer.querySelector(\"#markdownPreview\");\r\n\r\n loadPromises.push(() => new Promise(((loadResolve) => {\r\n me.Markdown = new Markdown(markdown, markdown.id, me.Options.MarkdownContent || \"\");\r\n\r\n markdown.addEventListener(\"ready\", () => {\r\n loadResolve();\r\n });\r\n })));\r\n\r\n loadPromises[0]().then(() => {\r\n loadPromises.shift();\r\n\r\n Promise.all([].concat(loadPromises.map(promiseFun => promiseFun()))).then(() => {\r\n ECP.Dialog.HideLoading();\r\n resolve();\r\n });\r\n\r\n // Change Tab\r\n const markdownPreview = me.EditorContainer.querySelector(\"#markdownPreview\");\r\n const testScriptExample = me.EditorContainer.querySelector(\"#testScriptExample\");\r\n const previewButton = me.EditorContainer.querySelector(\"#ews-code-preview-button\");\r\n const codeEditorTabs = me.EditorContainer.querySelectorAll(\".ews-code-tab\");\r\n\r\n const clickTabFunc = (event) => {\r\n const tab = event.currentTarget;\r\n me.ChangeTab(tab);\r\n\r\n if (tab.dataset.type === \"markdown\" && markdownPreview.style.display === \"none\") {\r\n me.RefreshPreview();\r\n }\r\n\r\n if (tab.dataset.type === \"test\" && testScriptExample.style.display === \"none\") {\r\n me.RefreshPreview();\r\n }\r\n\r\n if ((tab.dataset.type !== \"test\" && tab.dataset.type !== \"markdown\" && tab.dataset.type !== \"sdk\") && (markdownPreview.style.display !== \"none\" || testScriptExample.style.display !== \"none\")) {\r\n me.RefreshPreview();\r\n }\r\n\r\n if (tab.dataset.type === \"markdown\" || tab.dataset.type === \"test\") {\r\n if (previewButton.innerText === \"Open Preview\") {\r\n me.TogglePreview(previewButton);\r\n }\r\n }\r\n\r\n if (tab.dataset.type === \"sdk\") {\r\n // Init SDK\r\n if (!me.SDK) {\r\n // Task 954694: Make the UI Kit available in the SDK tab of Code Blocks\r\n ECP.Dialog.ShowLoading(null, \"#sdkPreview\");\r\n\r\n me.SDK = me.EditorContainer.querySelector(\"#sdkPreview\");\r\n me.SDK.addEventListener(\"load\", _ => ECP.Dialog.HideLoading());\r\n me.SDK.src = \"Home?DashboardID=193376&EmbededDialog=True\";\r\n }\r\n if (previewButton.innerText === \"Close Preview\") {\r\n me.TogglePreview(previewButton);\r\n }\r\n }\r\n };\r\n\r\n for (let i = 0; i < codeEditorTabs.length; i++) {\r\n codeEditorTabs[i].addEventListener(\"click\", clickTabFunc);\r\n }\r\n });\r\n }\r\n\r\n OpenEditor(options) {\r\n let optionArgs = options;\r\n const me = this;\r\n\r\n if (!optionArgs) {\r\n optionArgs = {};\r\n }\r\n\r\n me.Options = Object.assign({}, optionArgs);\r\n\r\n if (!me.Options.itemFields) {\r\n me.Options.itemFields = {};\r\n }\r\n\r\n // Set Origin Value\r\n me.Options.htmlOrigin = me.Options.htmlContent || \"\";\r\n me.Options.cssOrigin = me.Options.cssContent || \"\";\r\n me.Options.jsOrigin = me.Options.jsContent || \"\";\r\n me.Options.testOrigin = me.Options.testContent || \"\";\r\n me.Options.markdownOrigin = me.Options.markdownContent || \"\";\r\n\r\n if (me.EditorContainer) {\r\n const editorKeyArr = Object.keys(me.CodeEditors);\r\n\r\n for (let i = 0; i < editorKeyArr.length; i++) {\r\n const key = editorKeyArr[i];\r\n const editor = me.CodeEditors[key];\r\n const editorId = editor.frame.id.replace(\"Editor\", \"\");\r\n\r\n editor.code = me.Options[`${editorId}Content`] || \"\";\r\n }\r\n\r\n me.ResetTab();\r\n me.ChangeTab(me.EditorContainer.querySelectorAll(\".ews-code-tab\")[0]);\r\n me.CodeEditors.htmlEditor.focus();\r\n me.RefreshPreview();\r\n }\r\n\r\n if (me.Options.testContent) {\r\n me.Options.testContent = me.Options.testContent.replace(\"/* eslint-disable */\", \"\").trim();\r\n }\r\n\r\n me.EditorContainer.style.display = \"flex\";\r\n\r\n window.removeEventListener(\"beforeunload\", BeforeUnload);\r\n window.addEventListener(\"beforeunload\", BeforeUnload);\r\n\r\n window.removeEventListener(\"unload\", OnUnload);\r\n window.addEventListener(\"unload\", OnUnload);\r\n\r\n me.NeedClearCDN = false;\r\n }\r\n\r\n CloseEditor() {\r\n this.EditorContainer.style.display = \"none\";\r\n\r\n window.removeEventListener(\"beforeunload\", BeforeUnload);\r\n window.removeEventListener(\"unload\", OnUnload);\r\n }\r\n\r\n ChangeTab(tab) {\r\n // Task 939222: Refresh the session whenever clicking refresh preview in the code block\r\n EWS.VerifySession();\r\n const me = this;\r\n\r\n if (!tab.classList.contains(\"ews-code-tab-selected\")) {\r\n const {\r\n type\r\n } = tab.dataset;\r\n const autoFix = me.EditorContainer.querySelector(\".ews-code-autofix\");\r\n\r\n if (type === \"js\") {\r\n autoFix.style.display = \"block\";\r\n } else {\r\n autoFix.style.display = \"none\";\r\n }\r\n\r\n const viewHistory = me.EditorContainer.querySelector(\"#ews-code-viewHistory-button\");\r\n if (type === \"sdk\") {\r\n viewHistory.classList.add(\"disabled\");\r\n } else {\r\n viewHistory.classList.remove(\"disabled\");\r\n }\r\n\r\n const codeEditorTabs = me.EditorContainer.querySelectorAll(\".ews-code-tab\");\r\n for (let i = 0; i < codeEditorTabs.length; i++) {\r\n codeEditorTabs[i].classList.remove(\"ews-code-tab-selected\");\r\n if (codeEditorTabs[i] === tab) {\r\n codeEditorTabs[i].classList.add(\"ews-code-tab-selected\");\r\n }\r\n }\r\n\r\n const codeWrappers = me.EditorContainer.querySelectorAll(\".ews-code-wrap\");\r\n for (let i = 0; i < codeWrappers.length; i++) {\r\n codeWrappers[i].style.display = (codeWrappers[i].dataset.type === type || codeWrappers[i].dataset.type === \"sdk\") ? \"flex\" : \"none\";\r\n }\r\n }\r\n }\r\n\r\n ResetTab() {\r\n const me = this;\r\n\r\n me.Options.htmlOrigin = me.CodeEditors.htmlEditor.code;\r\n me.Options.cssOrigin = me.CodeEditors.cssEditor.code;\r\n me.Options.jsOrigin = me.CodeEditors.jsEditor.code;\r\n me.Options.testOrigin = me.CodeEditors.testEditor.code;\r\n me.Options.markdownOrigin = me.CodeEditors.markdownEditor.code;\r\n\r\n const spans = me.EditorContainer.querySelectorAll(\".ews-code-tabs .ews-code-tab span\");\r\n for (let i = 0; i < spans.length; i++) {\r\n if (spans[i].innerHTML.includes(\"*\")) {\r\n spans[i].innerHTML = spans[i].innerHTML.replace(\"*\", \"\");\r\n }\r\n }\r\n }\r\n\r\n TogglePreview(button) {\r\n const me = this;\r\n const preview = me.EditorContainer.querySelector(\".ews-code-preview\");\r\n const split = me.EditorContainer.querySelector(\".ews-code-editor-split\");\r\n const editor = me.EditorContainer.querySelector(\".ews-code-editors\");\r\n const autoFix = me.EditorContainer.querySelector(\".ews-code-autofix\");\r\n\r\n if (getComputedStyle(preview).display === \"none\") {\r\n me.RefreshPreview();\r\n\r\n preview.style.display = \"block\";\r\n split.style.display = \"block\";\r\n preview.style.left = \"64%\";\r\n split.style.left = \"64%\";\r\n editor.style.right = \"36%\";\r\n autoFix.style.right = \"36%\";\r\n button.innerText = \"Close Preview\";\r\n } else {\r\n preview.style.display = \"none\";\r\n split.style.display = \"none\";\r\n editor.style.right = \"0%\";\r\n autoFix.style.right = \"\";\r\n button.textContent = \"Open Preview\";\r\n }\r\n }\r\n\r\n RefreshPreview() {\r\n const me = this;\r\n const previewContainer = me.EditorContainer.querySelector(\".ews-code-preview\");\r\n const currentTab = me.EditorContainer.querySelector(\".ews-code-tab.ews-code-tab-selected\");\r\n\r\n const css = me.CodeEditors.cssEditor.code;\r\n const html = me.CodeEditors.htmlEditor.code;\r\n const js = me.CodeEditors.jsEditor.code;\r\n const md = me.CodeEditors.markdownEditor.code;\r\n\r\n const codePreview = previewContainer.querySelector(\"#codePreview\");\r\n\r\n if (codePreview) {\r\n codePreview.remove();\r\n }\r\n\r\n const markdownPreview = previewContainer.querySelector(\"#markdownPreview\");\r\n const testScriptExample = previewContainer.querySelector(\"#testScriptExample\");\r\n\r\n markdownPreview.style.display = \"none\";\r\n testScriptExample.style.display = \"none\";\r\n\r\n if (currentTab.dataset.type === \"markdown\") {\r\n markdownPreview.style.display = \"block\";\r\n me.Markdown.code = md;\r\n } else if (currentTab.dataset.type === \"test\") {\r\n testScriptExample.style.display = \"block\";\r\n } else {\r\n const iframe = document.createElement(\"iframe\");\r\n\r\n iframe.id = \"codePreview\";\r\n iframe.src = `Home?DashboardID=${Settings.DashboardID}&PreviewCode=True&EmbededDialog=True`;\r\n iframe.style.height = \"100%\";\r\n iframe.style.width = \"100%\";\r\n\r\n iframe.onload = async function () {\r\n const {\r\n contentDocument\r\n } = iframe;\r\n const previewDiv = contentDocument.createElement(\"div\");\r\n const contentDiv = EC_Fmt.HtmlStrToElement(`
`);\r\n\r\n previewDiv.classList.add(\"dashboard-item-preview\");\r\n previewDiv.classList.add(\"dashboard-item\");\r\n\r\n previewDiv.appendChild(contentDiv);\r\n\r\n const mainLayout = contentDocument.getElementById(\"MainLayout\");\r\n\r\n mainLayout.querySelector(\".column\").appendChild(previewDiv);\r\n\r\n const tempDiv = contentDocument.createElement(\"div\");\r\n\r\n if (css) {\r\n const output = await less.render(`div.dashboard-item-preview { ${css} }`);\r\n tempDiv.innerHTML = ``;\r\n contentDiv.appendChild(tempDiv.firstChild);\r\n }\r\n\r\n if (html) {\r\n tempDiv.innerHTML = html;\r\n tempDiv.childNodes.forEach((node) => {\r\n contentDiv.appendChild(node);\r\n });\r\n }\r\n\r\n if (js) {\r\n const newScript = contentDocument.createElement(\"script\");\r\n\r\n newScript.id = \"scriptpreview\";\r\n newScript.text = `\"use strict\";function CodeItemJsPreview(dashboardItem) {${js}} //# sourceURL=DashboardItemPreview.js`;\r\n\r\n contentDiv.append(newScript);\r\n\r\n if (iframe.contentWindow.CodeItemJsPreview) {\r\n // Task 1073687: Error when in custom javascript when editing Yerba Mate Co home dashboard\r\n try {\r\n iframe.contentWindow.CodeItemJsPreview(previewDiv);\r\n } catch (err) {\r\n dialog = ECP.Dialog.ShowDialog(EC_Fmt.NullChk(err.name, \"Error\"), EC_Fmt.NullChk(err.stack, err.toString()), {\r\n width: 550,\r\n cancelButtonTitle: \"Cancel\"\r\n });\r\n\r\n dialog.querySelector(\".ecp-dialog-confirm-button\").remove();\r\n }\r\n }\r\n }\r\n };\r\n\r\n previewContainer.appendChild(iframe);\r\n }\r\n }\r\n\r\n async SaveCode(options) {\r\n const me = this;\r\n\r\n options = options || {};\r\n\r\n const closeEditor = options.closeEditor;\r\n const deferred = options.deferred;\r\n const message = options.message;\r\n const codeData = {\r\n CodeList: []\r\n };\r\n const {\r\n CodeList\r\n } = codeData;\r\n let documentId;\r\n\r\n if (me.Options.htmlOrigin.replace(/\\r\\n/g, \"\\n\") !== me.CodeEditors.htmlEditor.code.replace(/\\r\\n/g, \"\\n\")) {\r\n if (!me.Options.isGlobal) {\r\n documentId = me.Options.itemFields && me.Options.itemFields.HtmlDocumentID ? me.Options.itemFields.HtmlDocumentID : \"\";\r\n } else {\r\n documentId = me.Options.itemFields && me.Options.itemFields.GlobalHtmlDocumentID ? me.Options.itemFields.GlobalHtmlDocumentID : \"\";\r\n }\r\n\r\n // Task 951688: Dashboard Edit Html is adding ='' and encoding {{content}}\r\n CodeList.push({\r\n Type: \"html\",\r\n DocumentID: documentId,\r\n Content: me.CodeEditors.htmlEditor.code || \"\"\r\n });\r\n }\r\n\r\n if (me.Options.cssOrigin.replace(/\\r\\n/g, \"\\n\") !== me.CodeEditors.cssEditor.code.replace(/\\r\\n/g, \"\\n\")) {\r\n if (!me.Options.isGlobal) {\r\n documentId = me.Options.itemFields && me.Options.itemFields.CssDocumentID ? me.Options.itemFields.CssDocumentID : \"\";\r\n } else {\r\n documentId = me.Options.itemFields && me.Options.itemFields.GlobalCssDocumentID ? me.Options.itemFields.GlobalCssDocumentID : \"\";\r\n }\r\n\r\n CodeList.push({\r\n Type: \"css\",\r\n DocumentID: documentId,\r\n Content: me.CodeEditors.cssEditor.code || \"\"\r\n });\r\n\r\n me.NeedClearCDN = true;\r\n }\r\n\r\n // Task 697919: Code Police - Automatic scanning of the Code Block HTML and Javascript\r\n me.CodeEditors.jsEditor.fix();\r\n\r\n // Task 962400: All standard company codes should be using eslint, Dashboards should not have eslint-disable\r\n if (me.CodeEditors.jsEditor.code.match(/\\/\\*\\s*(eslint-disable)[\\s\\S]*\\*\\//) || me.CodeEditors.jsEditor.code.match(/\\/\\/ *(eslint-disable).*/)) {\r\n ECP.Dialog.Alert(\"Failed to save the JS file:
Please check and change your code, do not use 'eslint-disable' to disable ESLint.\");\r\n return;\r\n }\r\n\r\n if (me.Options.jsOrigin.replace(/\\r\\n/g, \"\\n\") !== me.CodeEditors.jsEditor.code.replace(/\\r\\n/g, \"\\n\")) {\r\n if (!me.Options.isGlobal) {\r\n documentId = me.Options.itemFields && me.Options.itemFields.JsDocumentID ? me.Options.itemFields.JsDocumentID : \"\";\r\n } else {\r\n documentId = me.Options.itemFields && me.Options.itemFields.GlobalJsDocumentID ? me.Options.itemFields.GlobalJsDocumentID : \"\";\r\n }\r\n\r\n CodeList.push({\r\n Type: \"js\",\r\n DocumentID: documentId,\r\n Content: me.CodeEditors.jsEditor.code || \"\"\r\n });\r\n\r\n me.NeedClearCDN = true;\r\n }\r\n\r\n if (me.Options.testOrigin.replace(/\\r\\n/g, \"\\n\") !== me.CodeEditors.testEditor.code.replace(/\\r\\n/g, \"\\n\")) {\r\n if (!me.Options.isGlobal) {\r\n documentId = me.Options.itemFields && me.Options.itemFields.TestDocumentID ? me.Options.itemFields.TestDocumentID : \"\";\r\n } else {\r\n documentId = me.Options.itemFields && me.Options.itemFields.GlobalTestDocumentID ? me.Options.itemFields.GlobalTestDocumentID : \"\";\r\n }\r\n CodeList.push({\r\n Type: \"test\",\r\n DocumentID: documentId,\r\n Content: me.CodeEditors.testEditor.code || \"\"\r\n });\r\n }\r\n\r\n if (me.Options.jsOrigin.replace(/\\r\\n/g, \"\\n\") !== me.CodeEditors.jsEditor.code.replace(/\\r\\n/g, \"\\n\")) {\r\n if (!me.Options.isGlobal) {\r\n documentId = me.Options.itemFields && me.Options.itemFields.ConvertedJsDocumentID ? me.Options.itemFields.ConvertedJsDocumentID : \"\";\r\n } else {\r\n documentId = me.Options.itemFields && me.Options.itemFields.GlobalConvertedJsDocumentID ? me.Options.itemFields.GlobalConvertedJsDocumentID : \"\";\r\n }\r\n\r\n CodeList.push({\r\n Type: \"convertedjs\",\r\n DocumentID: documentId,\r\n Content: \"\"\r\n });\r\n }\r\n\r\n if (me.Options.markdownOrigin.replace(/\\r\\n/g, \"\\n\") !== me.CodeEditors.markdownEditor.code.replace(/\\r\\n/g, \"\\n\")) {\r\n if (!me.Options.isGlobal) {\r\n documentId = me.Options.itemFields && me.Options.itemFields.MarkdownDocumentID ? me.Options.itemFields.MarkdownDocumentID : \"\";\r\n } else {\r\n documentId = me.Options.itemFields && me.Options.itemFields.GlobalMarkdownDocumentID ? me.Options.itemFields.GlobalMarkdownDocumentID : \"\";\r\n }\r\n CodeList.push({\r\n Type: \"markdown\",\r\n DocumentID: documentId,\r\n Content: me.CodeEditors.markdownEditor.code || \"\"\r\n });\r\n }\r\n\r\n if (me.Options.jsOrigin.replace(/\\r\\n/g, \"\\n\") !== me.CodeEditors.jsEditor.code.replace(/\\r\\n/g, \"\\n\")) {\r\n documentId = me.Options.itemFields && me.Options.itemFields.GlobalCompiledJsDocumentID ? me.Options.itemFields.GlobalCompiledJsDocumentID : \"\";\r\n\r\n CodeList.push({\r\n Type: \"compiledjs\",\r\n DocumentID: documentId,\r\n Content: \"\"\r\n });\r\n }\r\n\r\n if (me.Options.cssOrigin.replace(/\\r\\n/g, \"\\n\") !== me.CodeEditors.cssEditor.code.replace(/\\r\\n/g, \"\\n\")) {\r\n documentId = me.Options.itemFields && me.Options.itemFields.GlobalCompiledCssDocumentID ? me.Options.itemFields.GlobalCompiledCssDocumentID : \"\";\r\n\r\n CodeList.push({\r\n Type: \"compiledcss\",\r\n DocumentID: documentId,\r\n Content: \"\"\r\n });\r\n }\r\n\r\n let createNewDocument = false;\r\n\r\n for (let i = 0; i < CodeList.length; i++) {\r\n const codeObj = CodeList[i];\r\n\r\n if (EC_Fmt.isNull(codeObj.DocumentID) && !EC_Fmt.isNull(codeObj.Content)) {\r\n createNewDocument = true;\r\n break;\r\n }\r\n }\r\n\r\n ECP.Dialog.ShowLoading(\"Saving...\", \".ews-code-container\");\r\n\r\n const myCreateCodeDocumentsRequest = new ECP.EC_Request(\"Dashboard_CreateCodeDocuments\");\r\n\r\n myCreateCodeDocumentsRequest.AddRequestVariable(\"CodeList\", JSON.stringify(codeData), ECP.EC_Verb.Post);\r\n myCreateCodeDocumentsRequest.AddRequestVariable(\"Message\", message || \"\", ECP.EC_Verb.Post);\r\n\r\n if (me.SaveDashboardCode) {\r\n myCreateCodeDocumentsRequest.AddRequestVariable(\"DashboardID\", Settings.DashboardID, ECP.EC_Verb.Post);\r\n myCreateCodeDocumentsRequest.AddRequestVariable(\"DashboardVersionID\", Settings.DashboardVersionID, ECP.EC_Verb.Post);\r\n } else if (me.Options.dashboardWidgetID) {\r\n myCreateCodeDocumentsRequest.AddRequestVariable(\"DashboardWidgetID\", me.Options.dashboardWidgetID, ECP.EC_Verb.Post);\r\n }\r\n\r\n try {\r\n const result = await myCreateCodeDocumentsRequest.Submit();\r\n ECP.Dialog.HideLoading();\r\n\r\n if (result.Status === \"success\") {\r\n const resultKeyArr = Object.keys(result);\r\n\r\n for (let i = 0; i < resultKeyArr.length; i++) {\r\n const key = resultKeyArr[i];\r\n const value = result[key];\r\n\r\n if (key === \"CustomErrorMessages\") {\r\n me.CodeEditors.cssEditor.customErrorMessages = value.CssCustomErrorMessage.ErrorMessageList.length > 0 ? value.CssCustomErrorMessage.ErrorMessageList : [];\r\n\r\n // Task 942880: CompiledCSS document blank with certain CSS rules\r\n for (let k = 0; k < value.CssCustomErrorMessage.ErrorMessageList.length; k++) {\r\n const errorObj = value.CssCustomErrorMessage.ErrorMessageList[k];\r\n if (errorObj.showAlert) {\r\n ECP.Dialog.Alert(`Failed to save the compiled CSS file:

(Line ${errorObj.line}, Column ${errorObj.column})
Error: ${errorObj.message}`);\r\n }\r\n }\r\n\r\n if (result.JsDocument) {\r\n me.CodeEditors.jsEditor.code = result.JsDocument;\r\n }\r\n\r\n if (result.CssDocument) {\r\n me.CodeEditors.cssEditor.code = result.CssDocument;\r\n }\r\n\r\n if (result.HtmlDocument) {\r\n me.CodeEditors.htmlEditor.code = result.HtmlDocument;\r\n }\r\n } else if (key !== \"Status\" && key !== \"HtmlDocument\" && key !== \"JsDocument\" && key !== \"CssDocument\") {\r\n me.Options.itemFields[(me.Options.isGlobal ? \"Global\" : \"\") + key] = value || me.Options.itemFields[(me.Options.isGlobal ? \"Global\" : \"\") + key] || \"\";\r\n }\r\n }\r\n\r\n me.ResetTab();\r\n\r\n if (options.callCallback && me.Options.callback) {\r\n if (me.Options.isGlobal) {\r\n me.Options.callback(\r\n \"Code\",\r\n me.Options.itemFields.GlobalHtmlDocumentID || \"\",\r\n me.Options.itemFields.GlobalCssDocumentID || \"\",\r\n me.Options.itemFields.GlobalJsDocumentID || \"\",\r\n me.Options.itemFields.GlobalTestDocumentID || \"\",\r\n me.Options.itemFields.GlobalConvertedJsDocumentID || \"\",\r\n me.Options.itemFields.GlobalMarkdownDocumentID || \"\",\r\n me.Options.itemFields.GlobalCompiledJsDocumentID || \"\",\r\n me.Options.itemFields.GlobalCompiledCssDocumentID || \"\"\r\n );\r\n } else {\r\n me.Options.callback(\r\n \"Code\",\r\n me.Options.itemFields.HtmlDocumentID || \"\",\r\n me.Options.itemFields.CssDocumentID || \"\",\r\n me.Options.itemFields.JsDocumentID || \"\",\r\n me.Options.itemFields.TestDocumentID || \"\",\r\n me.Options.itemFields.ConvertedJsDocumentID || \"\",\r\n me.Options.itemFields.MarkdownDocumentID || \"\"\r\n );\r\n }\r\n\r\n // Task 1029401: Saving code in a Code Block on a new dashboard, but never saving the dashboard itself can cause the code to be lost\r\n if (me.addNewItem || createNewDocument) {\r\n Save_Dashboard_Draft(Settings.DashboardID, Settings.DashboardVersionID, (dashboardResult) => {\r\n if (dashboardResult?.allDashboardItemIDStr) {\r\n const allDashboardItemIDArr = dashboardResult.allDashboardItemIDStr.split(\";\");\r\n const dashboardItemArr = document.querySelectorAll(\".dashboard-edit .column > div.widget.dashboard-item\");\r\n\r\n for (let i = 0; i < dashboardItemArr.length; i++) {\r\n const myDashboardItem = dashboardItemArr[i];\r\n\r\n if (parseInt(myDashboardItem.id) < 0) {\r\n for (let k = 0; k < allDashboardItemIDArr.length; k++) {\r\n const [oldID, newID] = allDashboardItemIDArr[k].split(\",\");\r\n\r\n if (myDashboardItem.id === oldID) {\r\n myDashboardItem.id = newID;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n me.RefreshPreview();\r\n\r\n if (closeEditor) {\r\n me.CloseEditor();\r\n } else if (deferred) {\r\n deferred.resolve(result);\r\n }\r\n } else {\r\n ECP.Dialog.Alert(\"Save Failed.\");\r\n\r\n if (deferred) {\r\n deferred.reject();\r\n }\r\n }\r\n } catch (err) {\r\n ECP.Dialog.HideLoading();\r\n\r\n if (deferred) {\r\n deferred.reject();\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n ValidateTestCode() {\r\n const me = this;\r\n\r\n if (!me.CodeEditors.testEditor.code || !me.CodeEditors.testEditor.code.replace(\"/* eslint-disable */\\n\", \"\")) {\r\n ECP.Dialog.Alert(\"Please add testing code to the 'Test Script' tab first.\");\r\n return false;\r\n }\r\n\r\n if (!me.CodeEditors.testEditor.code.includes(\"it(\")) {\r\n ECP.Dialog.Alert(\"Invalid testing code, please ensure your code follows the Mocha testing format.\");\r\n return false;\r\n }\r\n\r\n if (!me.CodeEditors.testEditor.code.includes(\"chai.expect\") && !me.CodeEditors.testEditor.code.includes(\"chai.should\") && !me.CodeEditors.testEditor.code.includes(\"chai.assert\")) {\r\n ECP.Dialog.Alert(\"Invalid testing code, please ensure your code follows the Chai testing format.\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n ViewHistory(editor) {\r\n const me = this;\r\n const type = editor.dataset.type.slice(0, 1).toUpperCase() + editor.dataset.type.slice(1);\r\n let fileType = \"\";\r\n\r\n switch (type) {\r\n case \"Html\":\r\n fileType = \"html\";\r\n break;\r\n case \"Js\":\r\n fileType = \"js\";\r\n break;\r\n case \"Css\":\r\n fileType = \"css\";\r\n break;\r\n case \"Test\":\r\n fileType = \"js\";\r\n break;\r\n case \"Markdown\":\r\n fileType = \"md\";\r\n break;\r\n }\r\n\r\n let documentId = \"\";\r\n\r\n if (!me.Options.isGlobal) {\r\n documentId = me.Options.itemFields && me.Options.itemFields[`${type}DocumentID`] ? me.Options.itemFields[`${type}DocumentID`] : \"\";\r\n } else {\r\n documentId = me.Options.itemFields && me.Options.itemFields[`Global${type}DocumentID`] ? me.Options.itemFields[`Global${type}DocumentID`] : \"\";\r\n }\r\n\r\n if (documentId) {\r\n let htmlB = \"\"\r\n + \"
\"\r\n + \"
\"\r\n + \"
\"\r\n + \"
\";\r\n\r\n const dialog = ECP.Dialog.ShowDialog(\"Git Commits\", htmlB, {\r\n confirmButtonTitle: \"Ok\",\r\n width: 600,\r\n height: 400\r\n });\r\n\r\n htmlB = `From: ${ECP.HTML.DateInput(\"From\", \"From\", false, EC_Fmt.DateParseFormat(new Date()), \"From\", \"\", 137, false, \"From\")}`\r\n + `To: ${ECP.HTML.DateInput(\"To\", \"To\", false, EC_Fmt.DateParseFormat(new Date()), \"To\", \"\", 137, false, \"To\")}`\r\n + `Search`;\r\n\r\n dialog.querySelector(\".svn-actions\").innerHTML = htmlB;\r\n\r\n const searchButton = dialog.querySelector(\"#ActionButtonSearch\");\r\n\r\n searchButton.addEventListener(\"click\", () => {\r\n me.SearchSVNLogs(documentId, dialog, editor);\r\n });\r\n\r\n const svnContent = dialog.querySelector(\".svn-content\");\r\n const footer = dialog.querySelector(\".ecp-dialog-footer\");\r\n\r\n footer.prepend(EC_Fmt.HtmlStrToElement(\"Diff\"));\r\n footer.prepend(EC_Fmt.HtmlStrToElement(\"Diff with working copy\"));\r\n\r\n const diffButton = footer.querySelector(\"#ActionButtonDiff\");\r\n\r\n diffButton.addEventListener(\"click\", () => {\r\n const selectedTrs = svnContent.querySelectorAll(\"tr.Dim\");\r\n const revisions = Array.from(selectedTrs).map(selectedTr => selectedTr.querySelectorAll(\"td\")[1].innerHTML.trim());\r\n\r\n TabCodeEditor.ShowDiffDialog(editor.getAttribute(\"language\"), documentId, revisions);\r\n });\r\n\r\n const diffWithButton = footer.querySelector(\"#ActionButtonDiffWithWorkingCopy\");\r\n\r\n diffWithButton.addEventListener(\"click\", () => {\r\n const selectedTr = svnContent.querySelector(\"tr.Dim\");\r\n const revisions = [selectedTr.querySelectorAll(\"td\")[1].innerHTML.trim()];\r\n const content = me.CodeEditors[`${fileType}Editor`].code;\r\n\r\n TabCodeEditor.ShowDiffDialog(editor.getAttribute(\"language\"), documentId, revisions, true, content);\r\n });\r\n\r\n svnContent.addEventListener(\"click\", (event) => {\r\n const tr = event.target.closest(\"tbody tr\");\r\n if (event.target.classList.contains(\"ews-icon-rotateleft\")) {\r\n ECP.Dialog.CloseDialog(dialog);\r\n } else if (tr) {\r\n const checkbox = tr.querySelector(\"input[type='checkbox']\");\r\n\r\n tr.classList.toggle(\"Dim\");\r\n checkbox.checked = tr.classList.contains(\"Dim\");\r\n\r\n const selectedTrs = svnContent.querySelectorAll(\"tr.Dim\");\r\n\r\n if (selectedTrs.length < 2) {\r\n diffButton.classList.add(\"disabled\");\r\n } else {\r\n diffButton.classList.remove(\"disabled\");\r\n\r\n if (selectedTrs.length > 2) {\r\n let firstTr = selectedTrs[0];\r\n\r\n if (tr === firstTr) {\r\n firstTr = selectedTrs[1];\r\n }\r\n\r\n firstTr.classList.remove(\"Dim\");\r\n firstTr.querySelector(\"input[type='checkbox']\").checked = false;\r\n }\r\n }\r\n\r\n if (selectedTrs.length === 1) {\r\n diffWithButton.classList.remove(\"disabled\");\r\n } else {\r\n diffWithButton.classList.add(\"disabled\");\r\n }\r\n }\r\n });\r\n } else {\r\n ECP.Dialog.Alert(\"No Git Logs.\");\r\n }\r\n }\r\n\r\n SearchSVNLogs(documentId, dialog, editor) {\r\n const me = this;\r\n let startTime = dialog.querySelector(\"#From\").value;\r\n let endTime = dialog.querySelector(\"#To\").value;\r\n\r\n if (startTime) {\r\n startTime = EC_Fmt.ToDate(startTime);\r\n // Task 628299: Dashboard SVN: lost commit log when save dashboard code\r\n startTime = `${startTime.getFullYear()}-${startTime.getMonth() + 1}-${startTime.getDate()}`;\r\n }\r\n\r\n if (endTime) {\r\n endTime = EC_Fmt.ToDate(endTime);\r\n endTime.setDate(endTime.getDate() + 1);\r\n // Task 628299: Dashboard SVN: lost commit log when save dashboard code\r\n endTime = `${endTime.getFullYear()}-${endTime.getMonth() + 1}-${endTime.getDate()}`;\r\n }\r\n\r\n ECP.Dialog.ShowLoading(\"Searching\", dialog.firstChild);\r\n\r\n const myRequest = new ECP.EC_Request(\"Get_CodeSVNLogs\");\r\n\r\n myRequest.AddRequestVariable(\"GlobalDocumentID\", documentId);\r\n myRequest.AddRequestVariable(\"StartTime\", startTime);\r\n myRequest.AddRequestVariable(\"EndTime\", endTime);\r\n myRequest.AddRequestVariable(\"DashboardID\", Settings.DashboardID);\r\n myRequest.AddRequestVariable(\"DashboardVersionID\", Settings.DashboardVersionID);\r\n\r\n myRequest.Submit().then((logs) => {\r\n let htmlB = \"\"\r\n + \"\"\r\n + \"\"\r\n + \"\"\r\n + \"\"\r\n + \"\"\r\n + \"\"\r\n + \"\"\r\n + \"\"\r\n + \"\"\r\n + \"\";\r\n\r\n if (logs.LOG) {\r\n for (let index = 0; index < logs.LOG.length; index++) {\r\n const log = logs.LOG[index];\r\n let author;\r\n let message = \"\";\r\n const describeArr = log.Describe.split(\"{^}\");\r\n\r\n if (describeArr.length > 1) {\r\n message = describeArr[0];\r\n author = describeArr[1];\r\n } else {\r\n author = describeArr[0];\r\n }\r\n\r\n author = author.replace(\"Committed By \", \"\");\r\n\r\n htmlB += \"\"\r\n + ``\r\n + ``\r\n + ``\r\n + ``\r\n + ``\r\n + ``\r\n + \"\";\r\n }\r\n }\r\n\r\n htmlB += \"\"\r\n + \"\"\r\n + \"
CommitAuthorDateMessageRevert
${log.LogNUM}${author}${EC_Fmt.DateTimeParseFormat(log.Time)}${message}
\";\r\n const svnContent = dialog.querySelector(\".svn-content\");\r\n svnContent.innerHTML = htmlB;\r\n const revertButtons = svnContent.querySelectorAll(\".ews-icon-rotateleft\");\r\n for (let i = 0; i < revertButtons.length; i++) {\r\n revertButtons[i].addEventListener(\"click\", async () => {\r\n ECP.Dialog.ShowLoading();\r\n\r\n const revision = revertButtons[i].dataset.lognum;\r\n // Task 727188: Using the Revert button inside of 'History' in a code block is causing a system error\r\n const myGetCodeRequest = new ECP.EC_Request(\"Get_CodeSVNContent\");\r\n\r\n myGetCodeRequest.SetReturnType(ECP.EC_ReturnType.Text);\r\n myGetCodeRequest.AddRequestVariable(\"GlobalDocumentID\", documentId);\r\n myGetCodeRequest.AddRequestVariable(\"CommitID\", revision);\r\n myGetCodeRequest.AddRequestVariable(\"DashboardID\", Settings.DashboardID);\r\n myGetCodeRequest.AddRequestVariable(\"DashboardVersionID\", Settings.DashboardVersionID);\r\n\r\n const oldText = await myGetCodeRequest.Submit();\r\n const activeEditor = editor.parentElement.querySelector(\"iframe\").contentWindow;\r\n activeEditor.editor.monacoEditor.executeEdits(\"\", [\r\n { range: new activeEditor.monaco.Range(0, 0, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER), text: oldText }\r\n ]);\r\n\r\n if (oldText !== editor.code) {\r\n const {\r\n type\r\n } = editor.dataset;\r\n\r\n const span = me.EditorContainer.querySelector(`.ews-code-tabs .ews-code-tab[data-type='${type}'] span`);\r\n\r\n if (!span.innerHTML.includes(\"*\")) {\r\n span.innerHTML += \"*\";\r\n }\r\n }\r\n\r\n ECP.Dialog.HideLoading();\r\n });\r\n }\r\n ECP.Dialog.HideLoading();\r\n });\r\n }\r\n\r\n static ShowDiffDialog(language, documentId, revisions, diffWithWorkingCopy, codeContent) {\r\n const htmlB = \"\"\r\n + \"
\"\r\n + \"
\"\r\n + \"Prev\"\r\n + \"Next\"\r\n + \"
\"\r\n + \"
\"\r\n + \"
\"\r\n + `
Revision ${diffWithWorkingCopy ? revisions[0] : revisions[1]}
`\r\n + `
${diffWithWorkingCopy ? \"Working Copy\" : `Revision ${revisions[0]}`}
`\r\n + \"
\"\r\n + \"
\"\r\n + ``\r\n + \"
\"\r\n + \"
\"\r\n + \"
\";\r\n\r\n let title;\r\n if (diffWithWorkingCopy) {\r\n title = `${revisions[0]} - Working Copy}`;\r\n } else {\r\n title = `${revisions[1]} - ${revisions[0]}`;\r\n }\r\n\r\n const dialog = ECP.Dialog.ShowDialog(`Git Commit Diff: ${title}`, htmlB, {\r\n height: window.innerHeight,\r\n width: window.innerWidth\r\n });\r\n\r\n ECP.Dialog.ShowLoading(\"\", dialog.firstChild);\r\n\r\n const editorElement = dialog.querySelector(\"editor\");\r\n const diffEditor = new Editor(editorElement, \"diffEditor\", \"\");\r\n\r\n editorElement.addEventListener(\"ready\", () => {\r\n const promises = [];\r\n\r\n for (let i = 0; i < revisions.length; i++) {\r\n const revision = revisions[i];\r\n // Task 727188: Using the Revert button inside of 'History' in a code block is causing a system error\r\n const myRequest = new ECP.EC_Request(\"Get_CodeSVNContent\");\r\n\r\n myRequest.SetReturnType(ECP.EC_ReturnType.Text);\r\n myRequest.AddRequestVariable(\"GlobalDocumentID\", documentId);\r\n myRequest.AddRequestVariable(\"CommitID\", revision);\r\n myRequest.AddRequestVariable(\"DashboardID\", Settings.DashboardID);\r\n myRequest.AddRequestVariable(\"DashboardVersionID\", Settings.DashboardVersionID);\r\n\r\n const promise = myRequest.Submit();\r\n\r\n promises.push(promise);\r\n }\r\n\r\n Promise.all(promises).then((contents) => {\r\n if (diffWithWorkingCopy) {\r\n diffEditor.fixedCode = codeContent;\r\n diffEditor.code = contents[0];\r\n } else {\r\n diffEditor.fixedCode = contents[0];\r\n diffEditor.code = contents[1];\r\n }\r\n\r\n ECP.Dialog.HideLoading();\r\n\r\n const diffNav = diffEditor.frame.contentWindow.monaco.editor.createDiffNavigator(diffEditor.editor.monacoEditor, {\r\n followsCaret: true,\r\n ignoreCharChanges: true\r\n });\r\n\r\n const prevButton = dialog.querySelector(\"#ActionButtonPrev\");\r\n const nextButton = dialog.querySelector(\"#ActionButtonNext\");\r\n\r\n function checkButtonStatus() {\r\n if (diffNav.nextIdx === 0) {\r\n prevButton.classList.add(\"disabled\");\r\n } else {\r\n prevButton.classList.remove(\"disabled\");\r\n }\r\n\r\n if (diffNav.nextIdx === diffNav.ranges.length - 1) {\r\n nextButton.classList.add(\"disabled\");\r\n } else {\r\n nextButton.classList.remove(\"disabled\");\r\n }\r\n }\r\n\r\n setTimeout(() => {\r\n if (!diffNav.canNavigate()) {\r\n prevButton.classList.add(\"disabled\");\r\n nextButton.classList.add(\"disabled\");\r\n } else {\r\n checkButtonStatus();\r\n }\r\n\r\n prevButton.addEventListener(\"click\", () => {\r\n if (!prevButton.classList.contains(\"disabled\")) {\r\n diffNav.previous();\r\n\r\n checkButtonStatus();\r\n }\r\n });\r\n\r\n nextButton.addEventListener(\"click\", () => {\r\n if (!nextButton.classList.contains(\"disabled\")) {\r\n diffNav.next();\r\n\r\n checkButtonStatus();\r\n }\r\n });\r\n }, 500);\r\n });\r\n });\r\n }\r\n\r\n static RunTest(argsTmp) {\r\n args = argsTmp;\r\n return new Promise(runTestFunction);\r\n }\r\n }\r\n\r\n const tabCodeEditor = new TabCodeEditor();\r\n\r\n EWS.DashboardItemTypesManager.add(\"Code\", {\r\n showEditButton: true,\r\n itemFields: [\"GlobalHtmlDocumentID\", \"GlobalJsDocumentID\", \"GlobalCssDocumentID\", \"GlobalTestDocumentID\", \"GlobalConvertedJsDocumentID\", \"GlobalMarkdownDocumentID\", \"GlobalCompiledJsDocumentID\", \"GlobalCompiledCssDocumentID\"],\r\n addItem(createNewItemCallback) {\r\n tabCodeEditor.InitEditors(null, true).then(() => {\r\n tabCodeEditor.OpenEditor({\r\n callback(title, htmlDocumentId, cssDocumentId, jsDocumentId, testDocumentId, convertedJsDocumentId, markdownDocumentId, compiledJsDocumentId, compiledCssDocumentID) {\r\n const dashboardItem = createNewItemCallback(title, {}, {\r\n html: htmlDocumentId,\r\n css: cssDocumentId,\r\n javascript: jsDocumentId,\r\n testScript: testDocumentId,\r\n convertedJs: convertedJsDocumentId,\r\n markdown: markdownDocumentId,\r\n compiledJavascript: compiledJsDocumentId,\r\n compiledCss: compiledCssDocumentID\r\n });\r\n\r\n return dashboardItem;\r\n },\r\n isGlobal: true\r\n });\r\n }, () => { });\r\n\r\n tabCodeEditor.SaveDashboardCode = true;\r\n },\r\n editItem(title, itemFields, dashboardItem, editItemCallback) {\r\n itemFields = itemFields || {};\r\n\r\n let hasItemFields = false;\r\n const itemFieldsKeys = Object.keys(itemFields);\r\n\r\n for (let index = 0; index < itemFieldsKeys.length; index++) {\r\n const key = itemFieldsKeys[index];\r\n\r\n if (itemFields[key]) {\r\n hasItemFields = true;\r\n break;\r\n }\r\n }\r\n\r\n // Task 913841: Can not run Test Scripts when the dashboard has no CSS file and has Js file\r\n if (!hasItemFields) {\r\n itemFields.GlobalHtmlDocumentID = dashboardItem.getAttribute(\"data-document-html\") || \"\";\r\n itemFields.GlobalJsDocumentID = dashboardItem.getAttribute(\"data-document-javascript\") || \"\";\r\n itemFields.GlobalCssDocumentID = dashboardItem.getAttribute(\"data-document-css\") || \"\";\r\n itemFields.GlobalTestDocumentID = dashboardItem.getAttribute(\"data-document-testScript\") || \"\";\r\n itemFields.GlobalConvertedJsDocumentID = dashboardItem.getAttribute(\"data-document-convertedJs\") || \"\";\r\n itemFields.GlobalMarkdownDocumentID = dashboardItem.getAttribute(\"data-document-markdown\") || \"\";\r\n }\r\n\r\n itemFields.GlobalCompiledJsDocumentID = dashboardItem.getAttribute(\"data-document-compiledJavascript\") || \"\";\r\n itemFields.GlobalCompiledCssDocumentID = dashboardItem.getAttribute(\"data-document-compiledCss\") || \"\";\r\n\r\n tabCodeEditor.InitEditors(dashboardItem).then(() => {\r\n tabCodeEditor.OpenEditor({\r\n callback(_title, htmlDocumentId, cssDocumentId, jsDocumentId, testDocumentId, convertedJsDocumentId, markdownDocumentId, compiledJsDocumentId, compiledCssDocumentId) {\r\n dashboardItem = editItemCallback(_title, hasItemFields ? {\r\n GlobalHtmlDocumentID: htmlDocumentId,\r\n GlobalJsDocumentID: jsDocumentId,\r\n GlobalCssDocumentID: cssDocumentId,\r\n GlobalTestDocumentID: testDocumentId,\r\n GlobalConvertedJsDocumentID: convertedJsDocumentId,\r\n GlobalMarkdownDocumentID: markdownDocumentId,\r\n GlobalCompiledJsDocumentID: compiledJsDocumentId,\r\n GlobalCompiledCssDocumentID: compiledCssDocumentId\r\n } : {}, {\r\n html: htmlDocumentId,\r\n css: cssDocumentId,\r\n javascript: jsDocumentId,\r\n testscript: testDocumentId,\r\n convertedjs: convertedJsDocumentId,\r\n markdown: markdownDocumentId,\r\n compiledJavascript: compiledJsDocumentId,\r\n compiledCss: compiledCssDocumentId\r\n });\r\n\r\n return dashboardItem;\r\n },\r\n isGlobal: true,\r\n htmlContent: dashboardItem.querySelector(\".code_html_init\") ? dashboardItem.querySelector(\".code_html_init\").value : \"\",\r\n cssContent: dashboardItem.querySelector(\".code_css_init\") ? dashboardItem.querySelector(\".code_css_init\").value : \"\",\r\n jsContent: dashboardItem.querySelector(\".code_js_init\") ? dashboardItem.querySelector(\".code_js_init\").value : \"\",\r\n testContent: dashboardItem.querySelector(\".code_test_init\") ? dashboardItem.querySelector(\".code_test_init\").value : \"\",\r\n markdownContent: dashboardItem.querySelector(\".code_markdown_init\") ? dashboardItem.querySelector(\".code_markdown_init\").value : \"\",\r\n itemFields\r\n });\r\n }, () => { });\r\n\r\n tabCodeEditor.SaveDashboardCode = true;\r\n },\r\n getDashboardDocuments(dashboardItem) {\r\n return GetDashboardDocuments(dashboardItem);\r\n },\r\n createEditButtons(dashboardItem) {\r\n const diamond = dashboardItem.querySelector(\".widget-tools .ews-icon-diamond\");\r\n\r\n if (diamond) {\r\n diamond.parentElement.removeChild(diamond);\r\n }\r\n\r\n let editButtons = dashboardItem.querySelector(\".code-action\");\r\n\r\n if (editButtons) {\r\n editButtons = editButtons.cloneNode();\r\n\r\n editButtons.classList.remove(\"hidden\");\r\n }\r\n\r\n return editButtons;\r\n }\r\n });\r\n\r\n EWS.Ready((EWS) => {\r\n // Convert click\r\n const dashboardContainer = document.querySelector(\".dashboard-edit\");\r\n\r\n if (dashboardContainer) {\r\n dashboardContainer.addEventListener(\"click\", async (event) => {\r\n if (event.target.matches(\".item-action\")) {\r\n const trigger = event.target;\r\n const DashboardItem = trigger.parentElement.parentElement;\r\n const type = DashboardItem.getAttribute(\"item-type\");\r\n\r\n if ((type === \"Code\" || type === \"PrivateCode\") && trigger.getAttribute(\"action\") === \"Publish\") {\r\n const jsContent = DashboardItem.querySelector(\".code_js_init\") ? DashboardItem.querySelector(\".code_js_init\").value : \"\";\r\n const testContent = DashboardItem.querySelector(\".code_test_init\") ? DashboardItem.querySelector(\".code_test_init\").value : \"\";\r\n\r\n // Check ESLint Error\r\n if (jsContent) {\r\n await tabCodeEditor.InitEditors();\r\n\r\n ECP.Dialog.ShowLoading(\"Check Javascript code errors......\");\r\n\r\n tabCodeEditor.linterDef = null;\r\n tabCodeEditor.CodeEditors.jsEditor.code = \"\";\r\n\r\n const linterChange = new Deferred();\r\n\r\n tabCodeEditor.linterDef = linterChange;\r\n\r\n requestAnimationFrame(() => {\r\n tabCodeEditor.CodeEditors.jsEditor.code = jsContent;\r\n tabCodeEditor.CodeEditors.testEditor.code = testContent;\r\n });\r\n\r\n await linterChange;\r\n\r\n ECP.Dialog.HideLoading();\r\n\r\n const {\r\n errors\r\n } = tabCodeEditor.CodeEditors.jsEditor;\r\n\r\n if (errors.length > 0) {\r\n ECP.Dialog.ShowDialog(\"Javascript Code Error\", `
The javascript code has ${errors.length} error${errors.length > 1 ? \"s\" : \"\"}. Please change your code.
`, {\r\n confirmButtonTitle: \"OK\"\r\n });\r\n\r\n return;\r\n }\r\n }\r\n\r\n // Run Test\r\n if (jsContent && testContent) {\r\n // Run test script\r\n if (!tabCodeEditor.ValidateTestCode()) {\r\n return;\r\n }\r\n\r\n TabCodeEditor.RunTest(Object.assign({}, {\r\n GlobalHtmlDocumentID: DashboardItem.getAttribute(\"data-document-html\") || \"\",\r\n GlobalCssDocumentID: DashboardItem.getAttribute(\"data-document-css\") || \"\",\r\n GlobalJsDocumentID: DashboardItem.getAttribute(\"data-document-javascript\") || \"\",\r\n GlobalConvertedJsDocumentID: DashboardItem.getAttribute(\"data-document-convertedjs\") || \"\",\r\n GlobalTestDocumentID: DashboardItem.getAttribute(\"data-document-testscript\") || \"\",\r\n GlobalCompiledJsDocumentID: DashboardItem.getAttribute(\"data-document-compiledJavascript\") || \"\",\r\n GlobalCompiledCssDocumentID: DashboardItem.getAttribute(\"data-document-compiledCss\") || \"\"\r\n }, {\r\n isGlobal: type === \"Code\",\r\n confirmButtonTitle: \"Next\",\r\n confirmButtonAction() {\r\n OpenPublishDialog({\r\n dashboardDocuments: GetDashboardDocuments(DashboardItem)\r\n });\r\n }\r\n })).catch(() => {\r\n ECP.Dialog.ShowDialog(\"Test Result\", \"
Test cases must pass and
must have at least 80% code coverage.
Please fix your code and/or test cases.
\", {\r\n confirmButtonTitle: \"OK\"\r\n });\r\n });\r\n } else {\r\n OpenPublishDialog({\r\n dashboardDocuments: GetDashboardDocuments(DashboardItem)\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Edit Published Code Item Type\r\n const DashboardItemEditButtons = document.querySelectorAll(\"#dashboard-item-library .ews-dashboard-library-edit\");\r\n\r\n for (let i = 0, len = DashboardItemEditButtons.length; i < len; i++) {\r\n DashboardItemEditButtons[i].addEventListener(\"click\", async (event) => {\r\n const itemTypeElement = event.currentTarget.closest(\".ews-dashboard-library-item\");\r\n const dashboardWidgetID = itemTypeElement.getAttribute(\"item-id\");\r\n\r\n ECP.Dialog.ShowLoading();\r\n\r\n const myGetWidgetGlobalDocumentRequest = new ECP.EC_Request(\"DashboardWidget_GetWidgetGlobalDocument\");\r\n\r\n myGetWidgetGlobalDocumentRequest.AddRequestVariable(\"DashboardWidgetID\", dashboardWidgetID);\r\n\r\n const result = await myGetWidgetGlobalDocumentRequest.Submit();\r\n\r\n ECP.Dialog.HideLoading();\r\n\r\n if (result.ErrorMessage) {\r\n ECP.Dialog.Alert(result.ErrorMessage);\r\n } else {\r\n const dashboardWidgetVersionID = result.DashboardWidgetVersionID;\r\n\r\n tabCodeEditor.InitEditors().then(() => {\r\n const globalDocuments = result.GlobalDocuments;\r\n\r\n globalDocuments[DashboardDocumentType.HTML] = globalDocuments[DashboardDocumentType.HTML] || {\r\n Type: DashboardDocumentType.HTML\r\n };\r\n globalDocuments[DashboardDocumentType.Javascript] = globalDocuments[DashboardDocumentType.Javascript] || {\r\n Type: DashboardDocumentType.Javascript\r\n };\r\n globalDocuments[DashboardDocumentType.CSS] = globalDocuments[DashboardDocumentType.CSS] || {\r\n Type: DashboardDocumentType.CSS\r\n };\r\n globalDocuments[DashboardDocumentType.TestScript] = globalDocuments[DashboardDocumentType.TestScript] || {\r\n Type: DashboardDocumentType.TestScript\r\n };\r\n globalDocuments[DashboardDocumentType.ConvertedJs] = globalDocuments[DashboardDocumentType.ConvertedJs] || {\r\n Type: DashboardDocumentType.ConvertedJs\r\n };\r\n globalDocuments[DashboardDocumentType.Markdown] = globalDocuments[DashboardDocumentType.Markdown] || {\r\n Type: DashboardDocumentType.Markdown\r\n };\r\n globalDocuments[DashboardDocumentType.CompiledJavascript] = globalDocuments[DashboardDocumentType.CompiledJavascript] || {\r\n Type: DashboardDocumentType.CompiledJavascript\r\n };\r\n globalDocuments[DashboardDocumentType.CompiledCss] = globalDocuments[DashboardDocumentType.CompiledCss] || {\r\n Type: DashboardDocumentType.CompiledCss\r\n };\r\n\r\n tabCodeEditor.OpenEditor({\r\n async callback(title, htmlDocumentId, cssDocumentId, jsDocumentId, testDocumentId, convertedJsDocumentID, markdownDocumentId, compiledJsDocumentId, compiledCssDocumentId) {\r\n tabCodeEditor.Options.globalDocuments[DashboardDocumentType.HTML].GlobalDocumentID = htmlDocumentId;\r\n tabCodeEditor.Options.globalDocuments[DashboardDocumentType.Javascript].GlobalDocumentID = jsDocumentId;\r\n tabCodeEditor.Options.globalDocuments[DashboardDocumentType.CSS].GlobalDocumentID = cssDocumentId;\r\n tabCodeEditor.Options.globalDocuments[DashboardDocumentType.TestScript].GlobalDocumentID = testDocumentId;\r\n tabCodeEditor.Options.globalDocuments[DashboardDocumentType.ConvertedJs].GlobalDocumentID = convertedJsDocumentID;\r\n tabCodeEditor.Options.globalDocuments[DashboardDocumentType.Markdown].GlobalDocumentID = markdownDocumentId;\r\n tabCodeEditor.Options.globalDocuments[DashboardDocumentType.CompiledJavascript].GlobalDocumentID = compiledJsDocumentId;\r\n tabCodeEditor.Options.globalDocuments[DashboardDocumentType.CompiledCss].GlobalDocumentID = compiledCssDocumentId;\r\n\r\n // save to dashboard item type fields\r\n const documents = {\r\n GlobalDocuments: []\r\n };\r\n\r\n documents.GlobalDocuments.push(Object.assign({}, tabCodeEditor.Options.globalDocuments[DashboardDocumentType.HTML], {\r\n Content: \"\"\r\n }));\r\n\r\n documents.GlobalDocuments.push(Object.assign({}, tabCodeEditor.Options.globalDocuments[DashboardDocumentType.Javascript], {\r\n Content: \"\"\r\n }));\r\n\r\n documents.GlobalDocuments.push(Object.assign({}, tabCodeEditor.Options.globalDocuments[DashboardDocumentType.CSS], {\r\n Content: \"\"\r\n }));\r\n\r\n documents.GlobalDocuments.push(Object.assign({}, tabCodeEditor.Options.globalDocuments[DashboardDocumentType.TestScript], {\r\n Content: \"\"\r\n }));\r\n\r\n documents.GlobalDocuments.push(Object.assign({}, tabCodeEditor.Options.globalDocuments[DashboardDocumentType.ConvertedJs], {\r\n Content: \"\"\r\n }));\r\n\r\n documents.GlobalDocuments.push(Object.assign({}, tabCodeEditor.Options.globalDocuments[DashboardDocumentType.Markdown], {\r\n Content: \"\"\r\n }));\r\n\r\n documents.GlobalDocuments.push(Object.assign({}, tabCodeEditor.Options.globalDocuments[DashboardDocumentType.CompiledJavascript], {\r\n Content: \"\"\r\n }));\r\n\r\n documents.GlobalDocuments.push(Object.assign({}, tabCodeEditor.Options.globalDocuments[DashboardDocumentType.CompiledCss], {\r\n Content: \"\"\r\n }));\r\n\r\n const mySaveWidgetDocumentsRequest = new ECP.EC_Request(\"Dashboard_SaveWidgetDocuments\");\r\n\r\n mySaveWidgetDocumentsRequest.AddRequestVariable(\"DashboardWidgetID\", dashboardWidgetID, ECP.EC_Verb.Post);\r\n mySaveWidgetDocumentsRequest.AddRequestVariable(\"DashboardWidgetVersionID\", dashboardWidgetVersionID, ECP.EC_Verb.Post);\r\n mySaveWidgetDocumentsRequest.AddRequestVariable(\"GlobalDocuments\", JSON.stringify({ root: documents.GlobalDocuments }), ECP.EC_Verb.Post);\r\n\r\n ECP.Dialog.ShowLoading(\"Saving......\");\r\n\r\n const saveFieldsResult = await mySaveWidgetDocumentsRequest.Submit();\r\n\r\n ECP.Dialog.HideLoading();\r\n\r\n if (result.ErrorMessage) {\r\n ECP.Dialog.Alert(saveFieldsResult.ErrorMessage);\r\n } else {\r\n Object.assign(tabCodeEditor.Options.globalDocuments, saveFieldsResult.GlobalDocuments);\r\n }\r\n\r\n tabCodeEditor.Options.itemFields = {\r\n GlobalHtmlDocumentID: tabCodeEditor.Options.globalDocuments[DashboardDocumentType.HTML].GlobalDocumentID || \"\",\r\n GlobalJsDocumentID: tabCodeEditor.Options.globalDocuments[DashboardDocumentType.Javascript].GlobalDocumentID || \"\",\r\n GlobalCssDocumentID: tabCodeEditor.Options.globalDocuments[DashboardDocumentType.CSS].GlobalDocumentID || \"\",\r\n GlobalTestDocumentID: tabCodeEditor.Options.globalDocuments[DashboardDocumentType.TestScript].GlobalDocumentID || \"\",\r\n GlobalConvertedJsDocumentID: tabCodeEditor.Options.globalDocuments[DashboardDocumentType.ConvertedJs].GlobalDocumentID || \"\",\r\n GlobalMarkdownDocumentID: tabCodeEditor.Options.globalDocuments[DashboardDocumentType.Markdown].GlobalDocumentID || \"\",\r\n GlobalCompiledJsDocumentID: tabCodeEditor.Options.globalDocuments[DashboardDocumentType.CompiledJavascript].GlobalDocumentID || \"\",\r\n GlobalCompiledCssDocumentID: tabCodeEditor.Options.globalDocuments[DashboardDocumentType.CompiledCss].GlobalDocumentID || \"\"\r\n };\r\n },\r\n isGlobal: true,\r\n globalDocuments,\r\n htmlContent: globalDocuments[DashboardDocumentType.HTML].Content || \"\",\r\n cssContent: globalDocuments[DashboardDocumentType.CSS].Content || \"\",\r\n jsContent: globalDocuments[DashboardDocumentType.Javascript].Content || \"\",\r\n testContent: globalDocuments[DashboardDocumentType.TestScript].Content || \"\",\r\n markdownContent: globalDocuments[DashboardDocumentType.Markdown].Content || \"\",\r\n itemFields: {\r\n GlobalHtmlDocumentID: globalDocuments[DashboardDocumentType.HTML].GlobalDocumentID || \"\",\r\n GlobalJsDocumentID: globalDocuments[DashboardDocumentType.Javascript].GlobalDocumentID || \"\",\r\n GlobalCssDocumentID: globalDocuments[DashboardDocumentType.CSS].GlobalDocumentID || \"\",\r\n GlobalTestDocumentID: globalDocuments[DashboardDocumentType.TestScript].GlobalDocumentID || \"\",\r\n GlobalConvertedJsDocumentID: globalDocuments[DashboardDocumentType.ConvertedJs].GlobalDocumentID || \"\",\r\n GlobalMarkdownDocumentID: globalDocuments[DashboardDocumentType.Markdown].GlobalDocumentID || \"\",\r\n GlobalCompiledJsDocumentID: globalDocuments[DashboardDocumentType.CompiledJavascript].GlobalDocumentID || \"\",\r\n GlobalCompiledCssDocumentID: globalDocuments[DashboardDocumentType.CompiledCss].GlobalDocumentID || \"\"\r\n }\r\n });\r\n }, () => { });\r\n }\r\n });\r\n }\r\n\r\n EWS.TabCodeEditor = TabCodeEditor;\r\n });\r\n\r\n function OpenPublishDialog(publishArgs) {\r\n EWS.VerifySession(() => {\r\n const myPublishDialogRequest = new ECP.EC_Request(\"DashboardWidget_PublishDialog\");\r\n\r\n myPublishDialogRequest.Submit().then((result) => {\r\n const dialog = ECP.Dialog.ShowDialog(result.title, result.content, {\r\n width: 485,\r\n height: 408,\r\n cancelButtonTitle: result.cancel,\r\n confirmButtonTitle: result.publish,\r\n confirmButtonAction() {\r\n const widget = dialog.querySelector(\"#ews-dashboard-item-widget\").value.trim();\r\n const widgetCategory = dialog.querySelector(\"#DashboardWidgetCategoryHidden\").value;\r\n const permission = dialog.querySelector(\"#PermissionHidden\").value;\r\n const description = dialog.querySelector(\"#ews-dashboard-item-description\").value.trim();\r\n const iconID = dialog.querySelector(\"#IconHidden\").value;\r\n const minVersion = dialog.querySelector(\"#ews-dashboard-item-minversion\").value.trim();\r\n const maxVersion = dialog.querySelector(\"#ews-dashboard-item-maxversion\").value.trim();\r\n const applicationID = dialog.querySelector(\"#ApplicationHidden\").value;\r\n\r\n if (!widget) {\r\n dialog.style.display = \"block\";\r\n ECP.Dialog.Alert(\"Please enter the Widget Name.\");\r\n return;\r\n }\r\n\r\n if (!widgetCategory) {\r\n dialog.style.display = \"block\";\r\n ECP.Dialog.Alert(\"Please select the Widget Category.\");\r\n return;\r\n }\r\n\r\n if (!iconID) {\r\n dialog.style.display = \"block\";\r\n ECP.Dialog.Alert(\"Please select the Icon.\");\r\n return;\r\n }\r\n\r\n if (!permission) {\r\n dialog.style.display = \"block\";\r\n ECP.Dialog.Alert(\"Please select the Permission.\");\r\n return;\r\n }\r\n\r\n if (!applicationID) {\r\n dialog.style.display = \"block\";\r\n ECP.Dialog.Alert(\"Please select the Application.\");\r\n return;\r\n }\r\n\r\n const mySaveWidgetRequest = new ECP.EC_Request(\"Dashboard_SaveDashboardWidget\");\r\n\r\n mySaveWidgetRequest.AddRequestVariable(\"DashboardWidget\", widget, ECP.EC_Verb.Post);\r\n mySaveWidgetRequest.AddRequestVariable(\"DashboardWidgetCategory\", widgetCategory, ECP.EC_Verb.Post);\r\n mySaveWidgetRequest.AddRequestVariable(\"Permission\", permission, ECP.EC_Verb.Post);\r\n mySaveWidgetRequest.AddRequestVariable(\"Description\", description, ECP.EC_Verb.Post);\r\n mySaveWidgetRequest.AddRequestVariable(\"IconID\", iconID, ECP.EC_Verb.Post);\r\n mySaveWidgetRequest.AddRequestVariable(\"MinECPVersion\", minVersion, ECP.EC_Verb.Post);\r\n mySaveWidgetRequest.AddRequestVariable(\"MaxECPVersion\", maxVersion, ECP.EC_Verb.Post);\r\n mySaveWidgetRequest.AddRequestVariable(\"ApplicationID\", applicationID, ECP.EC_Verb.Post);\r\n mySaveWidgetRequest.AddRequestVariable(\"DashboardDocuments\", JSON.stringify({ root: publishArgs.dashboardDocuments }), ECP.EC_Verb.Post);\r\n\r\n ECP.Dialog.ShowLoading();\r\n\r\n mySaveWidgetRequest.Submit().then((submitResult) => {\r\n ECP.Dialog.HideLoading();\r\n\r\n if (!submitResult.status) {\r\n dialog.style.display = \"block\";\r\n }\r\n }).catch((error) => {\r\n ECP.Dialog.HideLoading();\r\n dialog.style.display = \"block\";\r\n throw error;\r\n });\r\n }\r\n });\r\n\r\n const inputs = dialog.querySelectorAll(\".AutoCompleteInput\");\r\n\r\n for (let i = 0; i < inputs.length; i++) {\r\n const ajaxInput = new ECP.HTML.AjaxInput(inputs[i]);\r\n }\r\n });\r\n });\r\n }\r\n\r\n function OnUnload() {\r\n const codeItems = document.querySelectorAll(\"div[item-type='Code']\");\r\n for (let i = 0, len = codeItems.length; i < len; i++) {\r\n // Task 939024: Need to Release 'Edit Lock' when close the window.\r\n if (window.navigator && window.navigator.sendBeacon) {\r\n window.navigator.sendBeacon(`api?APICommand=Dashboard_MarkCodeBlockClosed&DashboardItemID=${codeItems[i].id}`);\r\n } else {\r\n fetch(`api?APICommand=Dashboard_MarkCodeBlockClosed&DashboardItemID=${codeItems[i].id}`, { credentials: \"same-origin\" });\r\n }\r\n }\r\n }\r\n\r\n function BeforeUnload(event) {\r\n const spans = tabCodeEditor.EditorContainer.querySelectorAll(\".ews-code-tabs .ews-code-tab span\");\r\n let changed = false;\r\n\r\n for (let index = 0; index < spans.length; index++) {\r\n const span = spans[index];\r\n\r\n if (span.innerHTML.includes(\"*\")) {\r\n changed = true;\r\n break;\r\n }\r\n }\r\n\r\n if (changed) {\r\n event.preventDefault();\r\n event.returnValue = \"\";\r\n }\r\n }\r\n\r\n function GetDashboardDocuments(dashboardItem) {\r\n const dashboardDocuments = [];\r\n\r\n if (dashboardItem.getAttribute(\"data-document-html\")) {\r\n dashboardDocuments.push({\r\n Type: DashboardDocumentType.HTML,\r\n GlobalDocumentID: dashboardItem.getAttribute(\"data-document-html\")\r\n });\r\n }\r\n\r\n if (dashboardItem.getAttribute(\"data-document-javascript\")) {\r\n dashboardDocuments.push({\r\n Type: DashboardDocumentType.Javascript,\r\n GlobalDocumentID: dashboardItem.getAttribute(\"data-document-javascript\")\r\n });\r\n }\r\n\r\n if (dashboardItem.getAttribute(\"data-document-css\")) {\r\n dashboardDocuments.push({\r\n Type: DashboardDocumentType.CSS,\r\n GlobalDocumentID: dashboardItem.getAttribute(\"data-document-css\")\r\n });\r\n }\r\n\r\n if (dashboardItem.getAttribute(\"data-document-testscript\")) {\r\n dashboardDocuments.push({\r\n Type: DashboardDocumentType.TestScript,\r\n GlobalDocumentID: dashboardItem.getAttribute(\"data-document-testscript\")\r\n });\r\n }\r\n\r\n if (dashboardItem.getAttribute(\"data-document-convertedjs\")) {\r\n dashboardDocuments.push({\r\n Type: DashboardDocumentType.ConvertedJs,\r\n GlobalDocumentID: dashboardItem.getAttribute(\"data-document-convertedjs\")\r\n });\r\n }\r\n\r\n if (dashboardItem.getAttribute(\"data-document-markdown\")) {\r\n dashboardDocuments.push({\r\n Type: DashboardDocumentType.Markdown,\r\n GlobalDocumentID: dashboardItem.getAttribute(\"data-document-markdown\")\r\n });\r\n }\r\n\r\n if (dashboardItem.getAttribute(\"data-document-compiledJavascript\")) {\r\n dashboardDocuments.push({\r\n Type: DashboardDocumentType.CompiledJavascript,\r\n GlobalDocumentID: dashboardItem.getAttribute(\"data-document-compiledJavascript\")\r\n });\r\n }\r\n\r\n if (dashboardItem.getAttribute(\"data-document-compiledCss\")) {\r\n dashboardDocuments.push({\r\n Type: DashboardDocumentType.CompiledCss,\r\n GlobalDocumentID: dashboardItem.getAttribute(\"data-document-compiledCss\")\r\n });\r\n }\r\n\r\n return dashboardDocuments;\r\n }\r\n}());\r\n"],"names":["DashboardDocumentType","0","1","2","3","4","5","6","7","HTML","Javascript","CSS","ConvertedJs","TestScript","Markdown","CompiledJavascript","CompiledCss","Deferred","deferred","promise","Promise","resolve","reject","then","onFulfilled","onRejected","let","args","runTestFunction","ECP","Dialog","ShowLoading","loadingCover","iFrames","document","querySelectorAll","index","length","body","removeChild","iframe","createElement","classList","add","style","display","height","width","onload","contentWindow","onbeforeunload","__coverage__","ProcessTestScriptResult","clearInterval","timer","errorDialog","ShowDialog","confirmButtonTitle","querySelector","fontSize","MochaTested","setInterval","iframeDocument","mochaDom","getElementById","HideLoading","titleLink","dashboardItemID","textContent","mochaLinks","i","setAttribute","replayElements","getElementsByClassName","success","parseInt","codeCoverage","codeCoverageNum","getAttribute","EC_Fmt","isNumber","parseFloat","toFixed","color","dialog","confirmButtonAction","undefined","zIndex","tabCodeEditor","coverage","statementKeys","Object","keys","s","newDecorations","statementResult","statementMap","className","push","range","CodeEditors","jsEditor","editor","monaco","Range","start","line","end","options","isWholeLine","linesDecorationsClassName","overviewRuler","position","window","decorations","monacoEditor","deltaDecorations","onerror","src","GlobalHtmlDocumentID","GlobalCssDocumentID","GlobalJsDocumentID","Null2EmptyStr","GlobalConvertedJsDocumentID","GlobalTestDocumentID","GlobalCompiledJsDocumentID","GlobalCompiledCssDocumentID","appendChild","generateAITestScript","async","JavaScriptConnect","myRequest","EC_Request","SetReturnType","EC_ReturnType","Json","AddRequestVariable","EC_Verb","Post","result","await","Submit","code","TabCodeEditor","constructor","this","EditorContainer","Options","isSplitMove","linterDef","SDK","NeedClearCDN","SaveDashboardCode","addNewItem","InitEditors","dashboardItem","me","isMobile","Alert","CodeBlockAlreadyOpenBy","OpenBy_AuthenticationID","isInteger","id","fetch","credentials","JSON","parse","text","OpenBy_FullName","cancelButtonTitle","cancelButtonAction","CloseDialog","LoadEditor","html","Settings","EnableBeta","tempDiv","innerHTML","firstChild","addEventListener","CloseEditor","TogglePreview","previewWidth","mouseEvent","pageX","getComputedStyle","replace","right","left","pointerEvents","EWS","VerifySession","RefreshPreview","SaveCode","closeEditor","callCallback","ValidateTestCode","errors","def","RunTest","assign","itemFields","isGlobal","catch","generateTestScriptBtn","countDown","ensureSecondLine","requiredLines","lines","split","forEach","splice","join","myJSEditors","selection","getSelection","jsSelectedText","getModel","getValueInRange","isNull","testEditor","startsWith","click","error","disabled","innerText","interval","changed","Array","from","some","tabSpan","includes","dialogContent","message","value","trim","DashboardDocuments","Type","GlobalDocumentID","GlobalMarkdownDocumentID","DashboardCodeItemData","CommitCodeDocument","DashboardID","DashboardVersionID","currentType","dataset","type","currentEditor","ViewHistory","fix","markdownGuideData","title","examples","example","prefix","suffix","htmlB","section","j","NullChk","markdownGuide","pasteButtons","markdownEditor","monacoLibrary","frame","selectedText","executeEdits","startLineNumber","startColumn","endLineNumber","endColumn","parentElement","markdownGuidePreviews","markdown","loadPromises","myEditors","ele","Editor","loadResolve","event","ctrlKey","metaKey","preventDefault","altKey","span","clearTimeout","setTimeout","sdkExternalLink","link","location","href","open","e","stopPropagation","MarkdownContent","shift","all","concat","map","promiseFun","markdownPreview","testScriptExample","previewButton","codeEditorTabs","clickTabFunc","tab","currentTarget","ChangeTab","_","OpenEditor","optionArgs","htmlOrigin","htmlContent","cssOrigin","cssContent","jsOrigin","jsContent","testOrigin","testContent","markdownOrigin","markdownContent","editorKeyArr","key","editorId","ResetTab","htmlEditor","focus","removeEventListener","BeforeUnload","OnUnload","contains","autoFix","viewHistory","remove","codeWrappers","cssEditor","spans","button","preview","previewContainer","currentTab","css","js","md","codePreview","contentDocument","previewDiv","contentDiv","HtmlStrToElement","mainLayout","output","less","render","childNodes","node","newScript","append","CodeItemJsPreview","err","name","stack","toString","codeData","CodeList","documentId","HtmlDocumentID","DocumentID","Content","CssDocumentID","match","JsDocumentID","TestDocumentID","ConvertedJsDocumentID","MarkdownDocumentID","createNewDocument","codeObj","myCreateCodeDocumentsRequest","stringify","dashboardWidgetID","Status","resultKeyArr","customErrorMessages","CssCustomErrorMessage","ErrorMessageList","k","errorObj","showAlert","column","JsDocument","CssDocument","HtmlDocument","callback","Save_Dashboard_Draft","dashboardResult","allDashboardItemIDStr","allDashboardItemIDArr","dashboardItemArr","myDashboardItem","oldID","newID","slice","toUpperCase","fileType","DateInput","DateParseFormat","Date","searchButton","SearchSVNLogs","svnContent","footer","prepend","diffButton","selectedTrs","revisions","selectedTr","ShowDiffDialog","diffWithButton","content","tr","target","closest","checkbox","toggle","checked","firstTr","startTime","endTime","ToDate","getFullYear","getMonth","getDate","setDate","logs","LOG","log","author","describeArr","Describe","LogNUM","DateTimeParseFormat","Time","revertButtons","revision","lognum","myGetCodeRequest","Text","oldText","activeEditor","Number","MAX_SAFE_INTEGER","language","diffWithWorkingCopy","codeContent","innerHeight","innerWidth","editorElement","diffEditor","promises","fixedCode","contents","diffNav","createDiffNavigator","followsCaret","ignoreCharChanges","prevButton","nextButton","checkButtonStatus","nextIdx","ranges","canNavigate","previous","next","argsTmp","DashboardItemTypesManager","showEditButton","addItem","createNewItemCallback","htmlDocumentId","cssDocumentId","jsDocumentId","testDocumentId","convertedJsDocumentId","markdownDocumentId","compiledJsDocumentId","compiledCssDocumentID","javascript","testScript","convertedJs","compiledJavascript","compiledCss","editItem","editItemCallback","hasItemFields","itemFieldsKeys","_title","compiledCssDocumentId","testscript","convertedjs","getDashboardDocuments","GetDashboardDocuments","createEditButtons","diamond","editButtons","cloneNode","Ready","dashboardContainer","matches","trigger","DashboardItem","linterChange","requestAnimationFrame","OpenPublishDialog","dashboardDocuments","DashboardItemEditButtons","len","itemTypeElement","myGetWidgetGlobalDocumentRequest","ErrorMessage","dashboardWidgetVersionID","DashboardWidgetVersionID","globalDocuments","GlobalDocuments","convertedJsDocumentID","documents","mySaveWidgetDocumentsRequest","root","saveFieldsResult","publishArgs","myPublishDialogRequest","cancel","publish","widget","widgetCategory","permission","description","iconID","minVersion","maxVersion","applicationID","mySaveWidgetRequest","submitResult","status","inputs","ajaxInput","AjaxInput","codeItems","navigator","sendBeacon","returnValue"],"mappings":"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"}