1<!DOCTYPE html> 2 3<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 4<head> 5 <title>AMP - Application Management Panel</title> 6 <meta charset="utf-8" /> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 8 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 9 <meta http-equiv="cleartype" content="on" /> 10 <meta name="description" content="AMP - Application Management Panel" /> 11 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 12 <meta name="application-name" content="AMP" /> 13 <meta name="theme-color" content="#222222" /> 14 <meta name="mobile-web-app-capable" content="yes" /> 15 <meta name="apple-mobile-web-app-capable" content="yes" /> 16 <meta name="apple-mobile-web-app-title" content="AMP" /> 17 <!-- Preload critical assets --> 18 <link rel="preload" as="style" href="/CSS/Stylesheet.css?v=2.8.0.4"> 19 <link rel="preload" as="style" href="/theme?v=2.8.0.4"> 20 <link rel="preload" href="/Fonts/MaterialSymbolsRounded.woff2" as="font" type="font/woff2" crossorigin> 21 <!-- Preload critical scripts --> 22 <link rel="preload" as="script" href="/Scripts/jquery-3.6.0.min.js"> 23 <link rel="preload" as="script" href="/Scripts/knockout-3.5.1.js"> 24 <link rel="preload" as="script" href="/Scripts/AMP.js?v=2.8.0.4"> 25 <!-- Preconnect to needed domains to save load time later --> 26 <link rel="preconnect" href="https://gravatar.com" /> 27 <link rel="preconnect" href="https://cdn.cloudflare.steamstatic.com" /> 28 <!-- Normal resource links --> 29 <link rel="apple-touch-icon-precomposed" sizes="256x256" href="/Images/AppIcon.png"> 30 <link rel="apple-touch-icon" href="/Images/AppIcon.png"> 31 <link type="text/css" href="/CSS/Stylesheet.css?v=2.8.0.4" rel="stylesheet" /> 32 <link type="text/css" href="/theme?v=2.8.0.4" rel="stylesheet" id="themeLink" /> 33 <link type="image/x-icon" rel="shortcut icon" href="/favicon.ico" /> 34 <link rel="icon" sizes="256x256" href="/Images/AppIcon.png" /> 35 <link rel="manifest" href="/manifest.json" /> 36</head> 37<body> 38 <div id="mainModal" class="modalbg"> 39 <div class="modalpanel"> 40 <img id="modalImage" /> 41 <h1 id="modaltitle"></h1> 42 <div class="modalcontents"> 43 <p id="modalmessage"></p> 44 <p id="modalsubtitle"></p> 45 <input id="modalPromptInput" type="text" /> 46 <p id="relatedLinkArea"><span>Related Link:</span> <a href="" id="relatedLinkA" title="" target="_blank"></a></p> 47 <div id="modalAdvanced"> 48 <p>Advanced Details <span class="adHandle"></span></p> 49 <pre id="modalAdvancedText"></pre> 50 </div> 51 </div> 52 <div class="modalbuttons"> 53 54 </div> 55 <div class="loader" id="modalLoader"><div class="loader2" style="display:block;"><div class="loader2" style="display:block;"><div class="loader2" style="display:block;"></div></div></div></div> 56 </div> 57 </div> 58 <div id="loginSplash" class="desktopOnly"> 59 <!--<d-topics-list discourse-url="https://discourse.cubecoders.com/" category="6" per-page="8"></d-topics-list>--> 60 <iframe id="loginBrandContents"></iframe> 61 </div> 62 <div id="loginContainer"> 63 <div id="loginLogo"> 64 <!--<img src="/Images/10thAnniversary.png" alt="Welcome to AMP" />--> 65 <img src="/Images/FullLogo256.webp" fetchpriority="high" alt="Welcome to AMP" /> 66 <div id="ADSLoginWaiting">Connecting to remote AMP instance...</div> 67 <h2 id="loginWelcome">Welcome to AMP</h2> 68 <div id="loginModuleInfo"> 69 <h4><span>For </span><span class="AppName"></span></h4> 70 <h6><span>©</span><span class="ModuleAuthor"></span></h6> 71 </div> 72 </div> 73 <div role="form" id="loginForm"> 74 <div> 75 <label>Username</label><br /> 76 <input type="text" name="username" /> 77 </div> 78 <div> 79 <label>Password</label><br /> 80 <input type="password" name="password" id="loginPasswordField" /> 81 </div> 82 <div> 83 <label class="checkbox"> 84 <input type="checkbox" name="rememberme" checked="checked" />
85 <span></span> 86 </label> 87 <span style="margin-left: 8px;">Remember Me</span> 88 </div> 89 <button class="bgGreen" id="loginButton">Login</button> 90 <button type="button" class="bgGreen secureLoginButton" id="secureLoginButton"><span>Passwordless Login</span></button><br /><br /> 91 <button type="button" class="bgBlue" id="oidcLoginButton"><span>Login with OIDC</span></button><br /><br /> 92 <div class="well warning transparentAnim" id="loginFailure" style="margin: 0"> 93 <div style="margin: 0;"> 94 <h3><span id="loginFailureReason" style="margin-bottom:0"></span></h3> 95 <p id="loginFailureDetails"></p> 96 <a href="about:blank" style="display:none" target="_blank" id="acocuntDisabledLinked">Contact Support</a> 97 <a href="https://discourse.cubecoders.com/docs?topic=14191?utm_source=amplogin" style="display:none" target="_blank" id="loginHelperLink">Why am I being rate limited?</a> 98 <a href="https://discourse.cubecoders.com/docs?topic=3349?utm_source=amplogin" style="display:block;margin-top:16px;" target="_blank" id="forgotLogin">Forgotten login details?</a> 99 </div> 100 </div> 101 </div> 102 <div class="loginBusy"> 103 <div class="loader" id="loginSpinner"><div class="loader2" style="display:block;"><div class="loader2" style="display:block;"><div class="loader2" style="display:block;"></div></div></div></div> 104 <h3>Loading plugins<br />one moment please...</h3> 105 </div> 106 </div> 107 <div id="barTop"> 108 <div id="responsiveHelpers"> 109 <img src="/Images/NavToggle.png" loading="lazy" id="navToggle" alt="Navigation" /> 110 </div> 111 <div id="tabInfo"> 112 <h2 id="tabTitle">Status</h2> 113 <h4 id="tabCaption"></h4> 114 </div> 115 <div id="topSearchBox" data-viewmodel="SearchAreaVM"> 116 <div class="icon icons_search"></div> 117 <input type="search" role="search" aria-label="search" autocomplete="amp_off_9af765b1-21c0-4385-b1ea-383cefb5a33f" class="searchBox" title="Search" placeholder="Search..." data-bind="textInput: query" name="amp_search_9a7ef19d-eeb0-43c8-a706-f4333629f5db" spellcheck="false" /> 118 </div> 119 </div> 120 <div id="searchResults" data-viewmodel="SearchAreaVM" style="display:none;" data-bind="visible: resultsVisible"> 121 <div class="searchResultCategory" data-bind="visible: results().length == 0"> 122 <div class="searchResultCategoryInfo"> 123 <h3>No results for '<span data-bind="text: query"></span>'</h3> 124 <p>Try using a simpler query with fewer search terms, or try the options below:</p> 125 </div> 126 <div class="searchCategoryItems"> 127 <div class="searchResult" data-bind="click: kbSearch"> 128 <h3>Search Knowledge Base</h3> 129 <p>Click to search the knowledge base for '<span data-bind="text: query"></span>'</p> 130 </div> 131 <div class="searchResult" data-bind="click: supportSearch"> 132 <h3>Search CubeCoders Support</h3> 133 <p>Click to check the official support board for posts about '<span data-bind="text: query"></span>'</p> 134 </div> 135 </div> 136 </div> 137 <!-- ko foreach: results --> 138 <div class="searchResultCategory"> 139 <div class="searchResultCategoryInfo"> 140 <div class="mat-icon" data-bind="text: icon">settings</div> 141 <h3 data-bind="text: name"></h3> 142 <p data-bind="text: description"></p> 143 </div> 144 <div class="searchCategoryItems" data-bind="foreach: items"> 145 <div class="searchResult" data-bind="click: click, css: {'videoResult' : imageURI != null}"> 146 <!-- ko if: imageURI != null --> 147 <img data-bind="attr: {src: imageURI}" loading="lazy" /> 148 <!-- /ko --> 149 <h3 data-bind="text: title"></h3> 150 <p data-bind="text: description"></p>
151 <p class="source" data-bind="text: source"></p> 152 </div> 153 </div> 154 </div> 155 <!-- /ko --> 156 </div> 157 <div id="mainBody"> 158 <div id="releaseSpec"></div> 159 <div id="mainBodyArea"> 160 <div class="bodyTab" id="tab_currentuser" data-viewmodel="UserInfoVM"> 161 <div class="settingsGroup"> 162 <div class="groupBody"> 163 <div class="userInfoBlock doubleWidth"> 164 <img data-bind="attr: {src: imageSmallURI}" loading="lazy" alt="User Avatar" style="float: left; margin-right: 16px; border-radius: 8px;" /> 165 <h2 data-bind="text: username"></h2> 166 <!-- ko if: isLDAPUser() --> 167 <h3>LDAP Authenticated User</h3> 168 <!-- /ko --> 169 <!-- ko if: isOIDCUser() --> 170 <h3>OIDC Authenticated User</h3> 171 <!-- /ko --> 172 <!-- ko if: !isOIDCUser() && !isLDAPUser() --> 173 <h3>AMP Authenticated User</h3> 174 <!-- /ko --> 175 <a href="https://gravatar.com/emails/" target="_new">Edit Profile Picture</a> 176 </div> 177 <div class="settingContainer"> 178 <div class="settingLabel">Email Address</div> 179 <input type="email" data-bind="value: emailAddress" /> 180 <div class="settingActionsList"> 181 <button data-bind="click: updateDetails" class="slimButton slideIcon"><span>Save Changes</span><span class="mat-icon">save</span></button> 182 </div> 183 </div> 184 185 <h2 style="margin:0" class="doubleWidth">Multi-factor Authentication and Logins</h2> 186 <div class="settingContainer"> 187 <div class="settingLabel"> 188 <div> 189 <span class="mat-icon" data-bind="text: isTwoFactor() ? 'check_circle' : 'warning'" style="float:right;"></span> 190 <span>2FA is currently <span data-bind="text: (isTwoFactor() ? 'Enabled' : 'Disabled')" style="margin-right: 8px"></span></span> 191 <p>Two-factor authentication helps prevent against attacks by requiring a secondary authentication source such as a one-time code.</p> 192 </div> 193 </div> 194 <div class="settingActionsList"> 195 <button class="slimButton" data-bind="visible: !isTwoFactor(), click: enableTwoFactor">Setup 2FA</button> 196 <button data-bind="visible: isTwoFactor(), click: disableTwoFactor" class="slimButton bgRed slideIcon"><span>Disable 2FA</span><span class="mat-icon">key_off</span></button> 197 </div> 198 </div> 199 200 <!-- ko if: showWebauthnSetup --> 201 <div class="settingContainer"> 202 <div class="settingLabel"> 203 <div>Passwordless Login</div> 204 <div class="settingDescription">Passwordless login allows you to authenticate using your device, fingerprint, a security key, or any other Webauthn compatible security method.</div> 205 </div> 206 207 <div class="settingActionsList"> 208 <button data-bind="click: setupWebauthn" class="slimButton bgGreen secureLoginButton"><span>Setup Passwordless Login</span></button> 209 <button data-bind="click: manageWebauthnTokens" class="slimButton"><span>Manage Tokens</span></button> 210 </div> 211 </div> 212 <!-- /ko --> 213 <!-- ko if: !showWebauthnSetup --> 214 <div class="well warning">
215 <span class="mat-icon">warning</span> 216 <div> 217 <h3>Passwordless logins not available</h3> 218 <p>You are not accessing AMP over HTTPS which is mandatory for passwordless logins.<br /><a href="https://discourse.cubecoders.com/docs?topic=2305" target="_blank">Support Article: Setting up secure HTTP (HTTPS) with AMP </a></p> 219 </div> 220 </div> 221 <!-- /ko --> 222 223 <div class="settingContainer doubleWidth"> 224 <div class="settingLabel"> 225 <div><span>RSA public key</span></div> 226 <div class="settingDescription">Specifying a public key allows you to log into AMPs SFTP using an RSA public key. This is mandatory when using Oauth2 login providers and recommended when using 2FA logins. Enter using ssh 'authorized keys' format.</div> 227 </div> 228 <input type="text" data-bind="value: newPubkey, valueUpdate: 'input'" placeholder="ssh-rsa QXJlIHlvdSBib3JlZCBvciBzb21ldGhpbmc/IHdoeSBhcmUgeW91IGxvb2tpbmcgYXQgdGhpcz8= [email protected]" /> 229 <div class="settingActionsList"> 230 <button data-bind="click: savePubKey" class="slimButton">Update Public Key</button> 231 </div> 232 </div> 233 234 <h2 class="doubleWidth" style="margin: 0">Actions</h2> 235 236 <!-- ko if: !isLDAPUser() && !isOIDCUser()--> 237 <div class="settingContainer"> 238 <div class="settingLabel">Change Password</div> 239 <table class="twoColLine noZebra" style="margin: 0 -4px 0 -4px"> 240 <tr> 241 <td>Current Password</td> 242 <td><input type="password" data-bind="value: oldPassword" required="required" /></td> 243 </tr> 244 <tr> 245 <td>New Password</td> 246 <td><input type="password" data-bind="value: newPassword, valueUpdate: 'input'" required="required" autocomplete="new-password" /></td> 247 </tr> 248 <tr> 249 <td>Confirm Password</td> 250 <td><input type="password" data-bind="value: confirmPassword" required="required" autocomplete="new-password" /></td> 251 </tr> 252 <tr> 253 <td>Password Strength</td> 254 <td><div class="passwordGrade" data-bind="css: passwordGradeClass(), style: {width: passwordGradeWidth()}, visible: newPassword() != ''"></div></td> 255 </tr> 256 </table> 257 <div class="settingActionsList"> 258 <button class="slimButton" data-bind="click: changePassword">Change Password</button> 259 </div> 260 </div> 261 <!-- /ko --> 262 263 <div> 264 <button class="slimButton" data-bind="click: serviceLogin">Service Login</button> 265 <button class="slimButton bgRed slideIcon" data-bind="click: logout"><span>Logout</span><span class="mat-icon">logout</span></button> 266 </div> 267 </div> 268 </div> 269 </div> 270 <div class="bodyTab" id="tab_status"> 271 <div class="metricsHeader"> 272 <h2>Metrics and Status</h2> 273 <div class="grow"></div> 274 <div id="AMP_Core_PrimaryTask" class="AppStatus" data-bind="'class': stateColorClass()">
275 <span data-bind="text: stateText"></span> 276 <span class="mat-icon" data-bind="text: stateIcon"></span> 277 </div> 278 </div> 279 <div id="AMP_Core_MetricsDisplay"> 280 <!-- ko foreach: metrics --> 281 <div class="DisplayMetric" data-bind="style: {'border-color': color}, attr: {'data-metric': shortMetricName}"> 282 <div class="DisplayMetricHeader" data-bind="style: { 'background-color': color, 'color': color3 }"> 283 <div data-bind="text:name" style="font-weight:bold;"></div> 284 <div data-bind="text:displayValue"></div> 285 <div class="circleChart"> 286 <svg> 287 <g> 288 <circle r="32" cx="48" cy="56"></circle> 289 <circle r="32" cx="48" cy="56" class="value" data-bind="style:{ 'stroke-dashoffset': dashOffset() }"></circle> 290 </g> 291 </svg> 292 </div> 293 </div> 294 <div class="DisplayMetricGraph" data-bind="attr: { id: elementId }"></div> 295 </div> 296 <!-- /ko --> 297 </div> 298 <div id="statusActions"> 299 <div> 300 <h2>Actions</h2> 301 <div class="buttonGroup" id="AMP_Core_ServerStatus" style="width: auto; float: none;"> 302 <button class="bgGreen slideIcon" data-module="Core" data-method="Start" data-showstates="0,80,100" data-permission="Core.AppManagement.StartApplication"><span>Start</span><span class="mat-icon">play_arrow</span></button> 303 <button class="bgGreen slideIcon" data-module="Core" data-method="Start" data-showstates="50" data-permission="Core.AppManagement.StartApplication"><span>Wake Up</span><span class="mat-icon">play_arrow</span></button> 304 <button class="bgAmber slideIcon" data-module="Core" data-method="UpdateApplication" data-showstates="0,80,100" data-permission="Core.AppManagement.UpdateApplication"><span>Update</span><span class="mat-icon">system_update_alt</span></button> 305 <button class="slideIcon" data-module="Core" data-method="Restart" data-showstates="20" data-permission="Core.AppManagement.RestartApplication"><span>Restart</span><span class="mat-icon">replay</span></button> 306 <button class="bgRed slideIcon" data-module="Core" data-method="Stop" data-showstates="20,50" data-permission="Core.AppManagement.StopApplication"><span>Stop</span><span class="mat-icon">stop</span></button> 307 <button class="bgAmber slideIcon" data-module="Core" data-method="Sleep" data-showstates="20" id="sleepButton" data-permission="Core.AppManagement.StopApplication"><span>Sleep</span><span class="mat-icon">pause</span></button> 308 <button class="bgRed slideIcon" data-module="Core" data-method="Kill" data-showstates="30,40" data-permission="Core.AppManagement.StopApplication"><span>Kill</span><span class="mat-icon">warning</span></button> 309 <button class="bgRed slideIcon" data-module="Core" data-method="Kill" data-showstates="10,70" data-permission="Core.AppManagement.StopApplication"><span>Abort</span><span class="mat-icon">error</span></button> 310 <button class="slideIcon bgGreen" id="helpButton" data-permission="Core.Special.Diagnostics" data-bind="click: openTicket"><span>Assistance</span><span class="mat-icon">support</span></button> 311 </div> 312 </div> 313 <div data-viewmodel="DiagnosticsVM"> 314 <h2>Connection Info</h2> 315 <div class="listenPort">
316 <span>Primary Endpoint</span> 317 <span><span data-bind="text:primaryEndpoint()"></span> <a href="javascript:void" style="text-decoration:none;" title="Copy to Clipboard" data-bind="click: copyPrimaryEndpointToClipboard, visible: canCopyToClipboard">ð</a></span> 318 </div> 319 <div class="listenPort" data-bind="if: primaryEndpointURL() != ''"> 320 <span>Connection Link</span> 321 <span><a data-bind="attr: {href: primaryEndpointURL()}, text: primaryEndpointURL()"></a></span> 322 </div> 323 <!-- ko foreach: extraServerInfo --> 324 <div class="listenPort"> 325 <span data-bind="text: key"></span> 326 <span data-bind="text: value"></span> 327 </div> 328 <!-- /ko --> 329 </div> 330 <div data-viewmodel="DiagnosticsVM" style="min-width: 45%"> 331 <h2>Network Port Status</h2> 332 <div id="AMP_Core_Ports"> 333 <div data-bind="foreach: ports"> 334 <div class="listenPort"> 335 <span class="AppStatus" data-bind="'class': ListeningColor()"> 336 <span data-bind="text: Caption"></span> 337 <span class="mat-icon" data-bind="text: Icon"></span> 338 </span> 339 <span data-bind="text: Name"></span> 340 <span data-bind="text: PortDisplay"></span> 341 <span data-bind="text: ProtocolName"></span> 342 </div> 343 </div> 344 <div data-bind="if: ports().length == 0"> 345 <div class="listenPort"> 346 <span><span class="appStateIcon" style="background-color: orange"> </span></span> 347 <span>No port information available.</span> 348 <span></span> 349 <span></span> 350 </div> 351 </div> 352 </div> 353 </div> 354 </div> 355 </div> 356 <div class="bodyTab noOverflowTab noPaddingTab" id="tab_console"> 357 <div class="consoleHeader"> 358 <div class="iconButtonGroup" id="AMP_Core_ConsoleButtons"> 359 <button class="bgGreen iconButton" data-module="Core" data-method="Start" data-showstates="0,100" data-permission="Core.AppManagement.StartApplication"><span class="mat-icon">play_arrow</span></button> 360 <button class="bgGreen iconButton" data-module="Core" data-method="Start" data-showstates="50" data-permission="Core.AppManagement.StartApplication"><span class="mat-icon">play_arrow</span></button> 361 <button class="bgAmber iconButton" data-module="Core" data-method="UpdateApplication" data-showstates="0,100" data-permission="Core.AppManagement.UpdateApplication"><span></span><span class="mat-icon">system_update_alt</span></button> 362 <button class="iconButton" data-module="Core" data-method="Restart" data-showstates="20" data-permission="Core.AppManagement.RestartApplication"><span class="mat-icon">replay</span></button> 363 <button class="bgRed iconButton" data-module="Core" data-method="Stop" data-showstates="20,50" data-permission="Core.AppManagement.StopApplication"><span class="mat-icon">stop</span></button> 364 <button class="bgAmber iconButton" data-module="Core" data-method="Sleep" data-showstates="20" id="sleepButton" data-permission="Core.AppManagement.StopApplication"><span class="mat-icon">pause</span></button> 365 <button class="bgRed iconButton" data-module="Core" data-method="Kill" data-showstates="30,40" data-permission="Core.AppManagement.StopApplication"><span class="mat-icon">warning</span></button> 366 <button class="bgRed iconButton" data-module="Core" data-method="Kill" data-showstates="10,70" data-permission="Core.AppManagement.StopApplication"><span class="mat-icon">error</span></button> 367 </div> 368 <div class="grow"></div> 369 <div id="AMP_Core_ConsoleStatus" class="AppStatus" data-bind="'class': stateColorClass()">
370 <span data-bind="text: stateText"></span> 371 <span class="mat-icon" data-bind="text: stateIcon"></span> 372 </div> 373 </div> 374 <div id="consoleContainer" data-viewmodel="UserListVM"> 375 <div id="consoleUsers" data-bind="foreach: users"> 376 <div class="consoleUserEntry" data-bind="text: name, style: {color: userColor}, click: click, attr: {'data-name': name, 'data-id': id}"></div> 377 </div> 378 <div id="consoleArea"> 379 380 </div> 381 <div id="consoleLine"> 382 <input id="consoleLineEntry" type="text" autocomplete="off" spellcheck="false" /> 383 </div> 384 </div> 385 </div> 386 387 <div id="tab_settings" class="bodyTab noRounded" data-viewmodel="SettingsVM"> 388 <div class="tabHeaderContainer" data-bind="foreach: currentCategory()?.subcategories, visible: currentCategory()?.subcategories().length > 1 "> 389 <div class="button tabHeader" data-bind="css: {active:active}, click: click"> 390 <span class="mat-icon" data-bind="text: icon"></span><span data-bind="text: displayName"></span> 391 </div> 392 </div> 393 394 <!-- ko foreach: categories --> 395 <!-- ko if: currentSubcategory() != null && currentSubcategory().settings().length > 0 --> 396 <div class="settingsGroup" data-bind="attr: {id: tabName()}"> 397 <div class="groupBody" data-bind="template: {name: 'settingEditorTemplate', foreach: currentSubcategory()?.settings}"></div> 398 </div> 399 <!-- /ko --> 400 <!-- /ko --> 401 </div> 402 403
403<script id="settingEditorTemplate" type="text/html"> 404 <div class="settingContainer" data-bind="visible: visible, css: { highlighted : isHighlighted, 'warning': hasWarning, doubleWidth: doubleWidth }, element: el"> 405 <!-- ko if: settingType.startsWith("List<") --> 406 <button class="slimButton listEditButton" data-bind="click: addValue, disable: bulkEditMode()"><span class="mat-icon">add</span></button> 407 <button class="slimButton listEditButton" data-bind="click: removeValue, disable: bulkEditMode()"><span class="mat-icon">delete</span></button> 408 <button class="slimButton listEditButton" data-bind="click: moveValueDown, disable: bulkEditMode()"><span class="mat-icon">move_up</span></button> 409 <button class="slimButton listEditButton" data-bind="click: moveValueUp, disable: bulkEditMode()"><span class="mat-icon">move_down</span></button> 410 <button class="slimButton listEditButton" data-bind="click: bulkEdit, visible: !bulkEditMode()"><span class="mat-icon">edit</span></button> 411 <button class="slimButton listEditButton" data-bind="click: bulkEdit, visible: bulkEditMode()"><span class="mat-icon">save</span></button> 412 <!-- /ko --> 413 <div class="settingLabel" data-bind="style: { position: (!settingType.startsWith('List<') && !settingType.startsWith('Dictionary<')) ? 'relative' : 'unset'}, css: {'provisionSpec': provisionSpec }"> 414 <!-- ko if: settingType == "Boolean" --> 415 <label class="checkbox"> 416 <input type="checkbox" data-bind="checked: value" /> 417 <span></span> 418 </label> 419 <!-- /ko --> 420 <div><span data-bind="text: name"></span></div> 421 <!-- ko if: description != "" --> 422 <div class="settingDescription" data-bind="text: description"></div> 423 <!-- /ko --> 424 <!-- ko if: showValueWarning() --> 425 <div class="settingDescription" style="color: #e06c6c; font-weight: 600;" data-bind="text: warnText"></div> 426 <!-- /ko --> 427 <!-- ko if: settingType == "Enum" && inputType() != "Radio" --> 428 <select data-bind="options: enumValues, value: value, optionsText: 'name', optionsValue: 'value', disable: isReadOnly()"></select> 429 <!-- /ko --> 430 <!-- ko if: settingType == "Combo" --> 431 <input type="text" data-bind="value: value, attr: { 'list' : 'list_' + node }, event: {dblclick: clearValue}, disable: isReadOnly()" /> 432 <datalist data-bind="attr: {id:'list_' + node}, foreach: enumValues"> 433 <option data-bind="val: value, text: name"></option> 434 </datalist> 435 <!-- /ko --> 436 <!-- ko if: inputType() == "Radio" --> 437 <div data-bind="foreach: enumValues" class="radioList"> 438 <label data-bind="css: {selected: $parent.value == value}"><input type="radio" data-bind="checked: $parent.value, uniqueName: false, attr: {name: 'list_' + $parent.node, value: value}, disable: isReadOnly" /><span data-bind="text: name"></span></label> 439 </div> 440 <!-- /ko --> 441 <!-- ko if: inputType() == "Textarea" --> 442 <textarea data-bind="value: value, disabled: isReadOnly()"></textarea> 443 <!-- /ko --> 444 <!-- ko if: settingType.startsWith("List<") --> 445 <!-- ko if: !bulkEditMode() --> 446 <select multiple="multiple" data-bind="options: value, value: selectedValue, valueAllowUnset: true, disabled: isReadOnly()"></select> 447 <!-- /ko --> 448 <!-- ko if: bulkEditMode() --> 449 <textarea data-bind="textInput: bulkValue, disabled: isReadOnly()"></textarea> 450 <!-- /ko --> 451 <!-- /ko --> 452 <!-- ko if: settingType.startsWith("Dictionary<") --> 453 <table> 454 <thead> 455 <tr> 456 <th data-bind="text: attributes?.KeyName ?? 'Key'"></th> 457 <th data-bind="text: attributes?.ValueName ?? 'Value'"></th> 458 <!-- ko if: isReadOnly() === false --> 459 <th> 460 <button class="slimButton listEditButton solo" data-bind="click: bulkEdit, visible: !bulkEditMode()"><span class="mat-icon">edit</span></button> 461 <button class="slimButton listEditButton solo" data-bind="click: bulkEdit, visible: bulkEditMode()"><span class="mat-icon">save</span></button> 462 </th> 463 <!-- /ko --> 464 </tr> 465 </thead> 466 <tbody data-bind="foreach: value"> 467 <tr> 468 <!-- ko if: $parent.isReadOnly() || !$parent.bulkEditMode() --> 469 <td data-bind="text: Key"></td> 470 <td data-bind="text: Value"></td> 471 <!-- /ko --> 472 <!-- ko if: $parent.bulkEditMode() --> 473 <td><input type="text" data-bind="value: Key" /></td> 474 <td><input type="text" data-bind="value: Value" /></td> 475 <!-- /ko --> 476 <!-- ko if: $parent.isReadOnly() === false --> 477 <td> 478 <button class="slimButton listEditButton solo" data-bind="click: $parent.removeKVP"><span class="mat-icon">delete</span></button> 479 </td> 480 <!-- /ko --> 481 </tr> 482 </tbody> 483 <tfoot> 484 <tr> 485 <td> 486 <div class="kvpNodePickerWrap"> 487 <input type="text" data-bind="value: newKVPkey, valueUpdate: 'input', attr: {placeholder: attributes?.KeyPlaceholder ?? 'Key'}
487, event: {input: nodePickerInputEvent, focus: nodePickerFocusEvent, keydown: nodePickerKeydown}" autocomplete="off" /> 488 <!-- ko if: keyEnumOptions && nodePickerVisible() --> 489 <div class="kvpNodePicker" data-bind="click: function() { return true; }"> 490 <!-- ko if: nodePickerFiltered().length === 0 --> 491 <div class="kvpNodePickerEmpty">No matching settings</div> 492 <!-- /ko --> 493 <!-- ko foreach: nodePickerFiltered --> 494 <div class="kvpNodePickerItem" data-bind="click: $parent.nodePickerSelectItem.bind($parent, $data), css: { kvpNodePickerItemHighlight: $index() === $parent.nodePickerHighlight() }"> 495 <span class="kvpNodePickerName" data-bind="text: name"></span> 496 <span class="kvpNodePickerNode" data-bind="text: value"></span> 497 </div> 498 <!-- /ko --> 499 </div> 500 <!-- /ko --> 501 </div> 502 </td> 503 <td><input type="text" data-bind="value: newKVPvalue, attr: {placeholder: attributes?.ValuePlaceholder ?? 'Value'}" /></td> 504 <!-- ko if: isReadOnly() === false --> 505 <td><button class="slimButton listEditButton solo" data-bind="click: addKVP"><span class="mat-icon">add</span></button></td> 506 <!-- /ko --> 507 </tr> 508 </tfoot> 509 </table> 510 <!-- /ko --> 511 <!-- ko if: settingType == "Uri" --> 512 <input type="url" data-bind="value: value, disable: isReadOnly(), attr: {'placeholder' : placeholder, 'maxlength': maxLength}" /> 513 <!-- /ko --> 514 <!-- ko if: inputType() == "RandomPassword" --> 515 <button class="slimButton slideIcon" style="margin-bottom:16px" data-bind="click: generateRandomPassword"><span>Generate Password</span></button> <button class="slimButton bgRed slideIcon" data-bind="click: clearPassword"><span>Clear Password</span><span class="mat-icon">delete</span></button> 516 <!-- /ko --> 517 <!-- ko if: inputType() == "UserPassword" --> 518 <input type="password" minlength="12" data-bind="attr: {'placeholder' : placeholder, 'maxlength': maxLength}, textInput: pwInput, disable: isReadOnly()" /> 519 <div class="passwordGrade" data-bind="css: passwordGradeClass, style: { width : (passwordGrade() * 14.28) + '%', display: 'block', 'margin-top': '16px' }, visible: showPwGrade"></div> 520 <div class="settingActionsList"> 521 <button class="slimButton slideIcon" style="margin-bottom:16px" data-bind="click: generateRandomPassword"><span>Generate Password</span><span class="mat-icon">edit</span></button> 522 <button class="slimButton slideIcon" style="margin-bottom:16px" data-bind="click: updatePassword"><span>Save Password</span><span class="mat-icon">edit</span></button> 523 </div> 524 <!-- /ko --> 525 <!-- ko if: inputType() == "number" --> 526 <input type="number" inputmode="number" pattern="[0-9]*" data-bind="attr: {'placeholder' : placeholder, 'min': minValue, 'max': maxValue, 'maxlength': maxLength}, value: value, disable: isReadOnly()" /> 527 <!-- /ko --> 528 <!-- ko if: (settingType == "String" || inputType() == "range") && inputType() != "number" && inputType() != "Textarea" && inputType() != "RandomPassword" && inputType() != "UserPassword" --> 529 <input data-bind="attr: {'type': inputType(), 'placeholder' : placeholder, 'min': minValue, 'max': maxValue, 'maxlength': maxLength}, value: value, disable: isReadOnly()" /> 530 <!-- /ko --> 531 <!-- ko if: suffix != null && suffix != "" && (sett
531ingType == "String" || inputType() == "range" || inputType() == "number") --> 532 <span class="inputFieldSuffix" data-bind="text: suffix"></span> 533 <!-- /ko --> 534 <div data-bind="foreach: actions" class="settingActionsList"> 535 <button type="button" data-bind="text: caption, click: click"></button> 536 </div> 537 <!-- ko if: !settingType.startsWith("List<") && !settingType.startsWith("Dictionary<") --> 538 <div data-bind="fadeVisible: tooltipVisible, attr: {'class': tooltipClass}"><span data-bind="text: tooltipText"></span><span class="mat-icon" data-bind="text: tooltipIcon"></span><!--<img src="/Images/settingWait.gif" alt="Updating..." data-bind="visible: updating" />--></div> 539 <!-- /ko --> 540 <span data-bind="visible: showNodes, text: node" class="permNodeDescription"></span> 541 </div> 542 <!-- ko if: provisionSpec === true --> 543 <div class="settingWarning">Managed by ADS. Select "Edit Ports" for this instance to modify.</div> 544 <!-- /ko --> 545 <!-- ko if: requiresRestart === true --> 546 <div class="settingInfo">Instance Restart Required <span class="mat-icon">replay</span></div> 547 <!-- /ko --> 548 </div> 549 </script>
549 550 551 <div class="bodyTab" id="tab_schedule" data-viewmodel="ScheduleVM"> 552 <!-- ko if: populatedTriggers().length === 0 --> 553 <h1>No Schedule Set</h1> 554 <p style="margin-bottom:48px">Create a new trigger to make tasks run at a given interval or in response to an event.</p> 555 <!-- /ko --> 556 <div class="flexButtonGroup"> 557 <button class="slideIcon bgGreen" data-bind="click: addNewTrigger"><span>Add New Trigger</span><span class="mat-icon">add_circle</span></button> 558 </div> 559 <div id="scheduleTriggersContainer"> 560 <!-- ko foreach: populatedTriggers --> 561 <div class="scheduleTriggerInfo"> 562 <div class="scheduleTriggerDescription"> 563 <div class="scheduleTriggerHeaderItem grow"> 564 <div class="scheduleHeader">Trigger</div> 565 <div class="scheduleTriggerDescriptionTitle"> 566 <span data-bind="text: Description"></span> 567 </div> 568 </div> 569 <!-- ko if: !Restricted() --> 570 <div class="scheduleTriggerHeaderItem" style="min-width: 72px"> 571 <div class="scheduleHeader">Enabled</div> 572 <div class="ScheduleHeaderDescriptionTitle"> 573 <label class="checkbox"> 574 <input type="checkbox" data-bind="checked: EnabledToggle" /> 575 <span></span> 576 </label> 577 </div> 578 </div> 579 <!-- /ko --> 580 <div class="scheduleTriggerDescriptionVariables scheduleTriggerHeaderItem"> 581 <div class="scheduleHeader">Emitted Values</div> 582 <div class="scheduleTriggerDescriptionVariables"> 583 <!-- ko if: (Emits().length === 0) --> 584 <div class="scheduleTriggerVariable">(None)</div> 585 <!-- /ko --> 586 <!-- ko foreach: Emits --> 587 <div class="scheduleTriggerVariable" data-bind="text: Name"></div> 588 <!-- /ko --> 589 </div> 590 </div> 591 <div class="scheduleTriggerTaskDropper"> 592 <div class="button iconButton" data-bind="click: RunNow" title="Run this trigger immediately"><span class="mat-icon">play_arrow</span></div> 593 <div class="button iconButton" data-bind="click: Edit, visible: IsEditable" title="Edit Trigger"><span class="mat-icon">edit</span></div> 594 <div class="button iconButton" data-bind="click: Delete" title="Delete Trigger"><span class="mat-icon">delete</span></div> 595 </div> 596 </div> 597 <div class="scheduleTriggerContents"> 598 <!-- ko foreach: Tasks --> 599 <div class="scheduleTriggerTask"> 600 <div class="scheduleTriggerTaskTitle"> 601 <span data-bind="text: FormattedDisplay() == '' ? Description : FormattedDisplay()"></span> 602 <div class="scheduleTriggerTaskDropper"> 603 <!-- ko if: (ParameterMappings().length > 0) --> 604 <div class="button iconButton" data-bind="click: Edit" title="Edit Task"><span class="mat-icon">edit</span></div> 605 <!-- /ko --> 606 <div class="button iconButton" data-bind="click: MoveUp" title="Move task up in list"><span class="mat-icon">move_up</span></div> 607 <div class="button iconButton" data-bind="click: MoveDown" title="Move task down in list"><span class="mat-icon">move_down</span></div> 608 <div class="button iconButton bgRed" data-bind="click: Delete" title="Delete Task"><span class="mat-icon">delete</span></div> 609 </div> 610 </div> 611 <!-- ko if: (ParameterMappings().length > 0 && FormattedDisplay() == "") --> 612 <table class="TwoColLine"> 613 <tbody data-bind="foreach: ParameterMappings"> 614 <tr> 615 <td data-bind="text: Param"></td> 616 <td data-bind="text: displayValue()" class="parameterMapping"></td> 617 </tr> 618 </tbody> 619 </table> 620 <!-- /ko --> 621 <!-- ko if: LastExecuteError --> 622 <div class="well warning">
623 <span class="mat-icon">warning</span> 624 <div> 625 <h3>This task failed the last time it ran:</h3> 626 <p data-bind="text: LastErrorReason"></p> 627 </div> 628 <button class="bgRed slimButton" data-bind="click: DismissWarning">Dismiss</button> 629 </div> 630 <!-- /ko --> 631 </div> 632 <!-- /ko --> 633 <!-- ko if: (Tasks().length == 0) && !Restricted() --> 634 <div style="padding:16px"> 635 <h2>No Tasks Added</h2> 636 <p style="margin-bottom:16px">Add a new task to this trigger to perform actions once this trigger is activated, such as taking a backup.</p> 637 </div> 638 <!-- /ko --> 639 <!-- ko if: Restricted() --> 640 <div style="padding:16px"> 641 <h2 style="margin-top: 0;">Licence Upgrade Required</h2> 642 <h3>Webhook Recievers are available in AMP Professional, Advanced and Enterprise Editions</h3> 643 <p>You can upgrade at any time via your Licence account.</p> 644 <div class="flexButtonList"> 645 <a class="button bgGreen slimButton" href="https://cubecoders.com/account?utm_source=scheduleupgrade" target="_blank"> Access your account </a> 646 </div> 647 </div> 648 <!-- /ko --> 649 <!-- ko if: !Restricted() --> 650 <div class="scheduleTriggerTask"> 651 <button class="slideIcon slimButton bgGreen" data-bind="click: AddTask" title="Add New Task"><span>Add New Task</span><span class="mat-icon">add_circle</span></button> 652 </div> 653 <!-- /ko --> 654 </div> 655 </div> 656 <!-- /ko --> 657 </div> 658 </div> 659 660 <div class="bodyTab noMobilePadding" id="tab_activesessions" data-viewmodel="SessionManagementVM"> 661 <table id="currentSessionsTable" class="rowSelect noMobileRadius"> 662 <thead> 663 <tr> 664 <th>Username</th> 665 <th class="hiddenOnMobile">Logged in at</th> 666 <th>Last activity</th> 667 <th>IP Address</th> 668 <th>Device</th> 669 </tr> 670 </thead> 671 <tbody data-bind="foreach: sessions"> 672 <tr data-bind="click: click, css: {selected: selected}"> 673 <td data-bind="text: Username"></td> 674 <td class="hiddenOnMobile" data-bind="text: DisplayStartTime"></td> 675 <td data-bind="text: DisplayLastActivity"></td> 676 <td data-bind="text: Source"></td> 677 <td><div data-bind="attr: {'class' : SessionTypeIcon()}"></div></td> 678 </tr> 679 </tbody> 680 </table> 681 <br /> 682 <div class="buttonGroup" data-bind="visible: selectedSession() != null"> 683 <!--<button>End Session</button>--> 684 </div> 685 <h3></h3> 686 </div> 687 688 <div class="bodyTab noPaddingTab" id="tab_usermanagement" data-viewmodel="AMPUserListVM"> 689 <div class="sideItemList hiddenOnMobile"> 690 <button class="slideIcon slimButton" data-bind="click: createUser"><span>
690Create User</span><span class="mat-icon">person_add</span></button> 691 692 <div> 693 <div data-bind="foreach: users" class="itemList"> 694 <div class="item" data-bind="click: click, css:{selected: selected}"> 695 <img data-bind="attr:{src: gravatar}" loading="lazy" alt="Gravatar" /> 696 <div> 697 <span data-bind="text: username"></span> 698 <span class="desc" data-bind="text: userShortDesc"></span> 699 </div> 700 </div> 701 </div> 702 </div> 703 </div> 704 705 <select class="hiddenOnDesktop" data-bind="options: users, optionsText: 'username', value: currentUser, optionsCaption: 'Select a user...'"> 706 </select> 707 708 <div class="sideItemData fullSizeOnMobile" style="margin-top:16px;"> 709 <div class="settingsGroup"> 710 <div class="groupBody"> 711 <!-- ko with: editUser --> 712 <div class="userInfoBlock doubleWidth"> 713 <img data-bind="attr: {src: GravatarImageUri}" loading="lazy" alt="User Avatar" style="float: left; margin-right: 16px; border-radius: 8px;" /> 714 <h2 data-bind="text: Name"></h2> 715 <!-- ko if: IsLDAPUser() --> 716 <h3>LDAP Authenticated User</h3> 717 <!-- /ko --> 718 <!-- ko if: IsOIDCUser() --> 719 <h3>OIDC Authenticated User</h3> 720 <!-- /ko --> 721 <!-- ko if: !IsOIDCUser() && !IsLDAPUser() --> 722 <h3>AMP Authenticated User</h3> 723 <!-- /ko --> 724 <p>Last login: <span data-bind="text: LastLoginTimestamp"></span></p> 725 </div> 726 727 <div></div> 728 729 <h2 style="margin:0" class="doubleWidth">User Details</h2> 730 731 <div class="settingContainer"> 732 <div class="settingLabel">Email Address</div> 733 <input type="email" data-bind="value: EmailAddress" /> 734 </div> 735 736 <!-- ko if: IsOIDCUser() --> 737 <div class="settingContainer"> 738 <div class="settingLabel"> 739 <div>OIDC Subject (sub)</div> 740 <div class="settingDescription">The OIDC subject claim that identifies this user with the provider. Populated automatically on first login if left blank.</div> 741 </div> 742 <input type="text" data-bind="value: OIDCSub" placeholder="Not yet populated" /> 743 <div class="settingActionsList"> 744 <button class="slimButton" data-bind="click: saveOIDCSub">Update</button> 745 </div> 746 </div> 747 <!-- /ko --> 748 749 <div class="settingContainer"> 750 <div class="settingLabel"> 751 <label class="checkbox"> 752 <input type="checkbox" data-bind="checked: Disabled" /> 753 <span></span> 754 </label> 755 <div>Account Disabled / Pending</div> 756 <div class="settingDescription">Disabled accounts cannot log in, but retain all their data.</div> 757 </div> 758 </div> 759 760 <!-- ko if: !IsLDAPUser() && !IsOIDCUser() --> 761 <div class="settingContainer"> 762 <div class="settingLabel"> 763 <label class="checkbox"> 764 <input type="checkbox" data-bind="checked: PasswordExpires" />
765 <span></span> 766 </label> 767 <div>Password Expires</div> 768 <div class="settingDescription">If enabled, user passwords expire after 90 days and must be changed in order to log in again.</div> 769 </div> 770 </div> 771 772 <div class="settingContainer"> 773 <div class="settingLabel"> 774 <label class="checkbox"> 775 <input type="checkbox" data-bind="checked: CannotChangePassword" /> 776 <span></span> 777 </label> 778 <div>Cannot Change Password</div> 779 <div class="settingDescription">Prevents this user from being able to change their own password, but it can still be changed by an administrator. Useful for bots or service accounts.</div> 780 </div> 781 </div> 782 783 <div class="settingContainer"> 784 <div class="settingLabel"> 785 <label class="checkbox"> 786 <input type="checkbox" data-bind="checked: MustChangePassword" /> 787 <span></span> 788 </label> 789 <div>Require Password Change</div> 790 <div class="settingDescription">Mandates that the user change their password next time they log in. This flag is cleared automatically once the user has done this.</div> 791 </div> 792 </div> 793 <!-- /ko --> 794 795 <h2 style="margin:0" class="doubleWidth">Security and Permissions</h2> 796 <!-- ko if: !IsLDAPUser() && !IsOIDCUser() --> 797 <div class="settingContainer"> 798 <div class="settingLabel">Change Password</div> 799 <table class="twoColLine noZebra" style="margin: 0 -4px 0 -4px"> 800 <tr> 801 <td>New Password</td> 802 <td><input type="password" data-bind="value: Password, valueUpdate: 'input'" required="required" autocomplete="new-password" /></td> 803 </tr> 804 <tr> 805 <td>Confirm Password</td> 806 <td><input type="password" data-bind="value: Password2" required="required" autocomplete="new-password" /></td> 807 </tr> 808 <tr> 809 <td>Password Strength</td> 810 <td><div class="passwordGrade" data-bind="css: passwordGradeClass(), style: {width: passwordGradeWidth()}, visible: Password() != ''"></div></td> 811 </tr> 812 </table> 813 <div class="settingActionsList"> 814 <button class="slimButton" data-bind="click: changePassword">Change Password</button> 815 </div> 816 </div> 817 <!-- /ko --> 818 <div class="settingContainer" data-bind="css: {'doubleWidth' : IsLDAPUser() || IsOIDCUser()}"> 819 <div class="settingLabel"> 820 <div>Role Membership</div> 821 <!-- ko if: IsOIDCUser() --> 822 <div class="settingDescription">This user's roles are managed by the OIDC provider and synced to AMP on login. Role membership cannot be changed manually.</div> 823 <!-- /ko --> 824 <!-- ko ifnot: IsOIDCUser() --> 825 <div class="settingDescription">Control which roles this user is a member of. Roles that deny permissions take precedence over those that allow.</div> 826 <!-- /ko --> 827 </div> 828 <div data-bind="foreach: RoleMembership" class="treeContainer"> 829 <div class="treeEntry treeItem noParent"> 830 <div class="treeItemText"> 831 <div class="treeName" data-bind="click: Toggle, text: Name, css: {'disabled': IsReadOnly()}"></div> 832 </div> 833 <label class="checkbox"> 834 <input type="checkbox" data-bind="click: Toggle, checked: IsMember() == true, disable: IsReadOnly()" />
835 <span></span> 836 </label> 837 </div> 838 </div> 839 <div class="settingActionsList"> 840 <button class="slimButton" data-bind="click: editPermissions">Edit User Permissions</button> 841 </div> 842 </div> 843 <h2 class="doubleWidth" style="margin: 0" data-bind="click: clickDanger">Danger Zone</h2> 844 <!-- ko if: !IsOIDCUser() && !IsLDAPUser() && $root.oidcEnabled() --> 845 <div class="settingContainer"> 846 <div class="settingLabel">Convert to OIDC</div> 847 <p>Converts this user to OIDC authentication. Their password will be cleared and they will only be able to log in via the configured OIDC provider.</p> 848 <button class="bgAmber slideIcon" data-bind="click: convertToOIDC"><span>Convert to OIDC User</span><span class="mat-icon">manage_accounts</span></button> 849 </div> 850 <!-- /ko --> 851 <!-- ko if: IsOIDCUser() --> 852 <div class="settingContainer"> 853 <div class="settingLabel">Revert to Local Authentication</div> 854 <p>Reverts this user back to local (password-based) authentication. Their OIDC link will be removed and their password will be cleared. A password reset will be required before they can log in again.</p> 855 <button class="bgAmber slideIcon" data-bind="click: revertFromOIDC"><span>Revert to Local Auth</span><span class="mat-icon">lock_person</span></button> 856 </div> 857 <!-- /ko --> 858 <div class="settingContainer"> 859 <div class="settingLabel">Delete User</div> 860 <p>This will permanently delete this user and all associated data.</p> 861 <!-- ko if: IsLDAPUser() --> 862 <p>If this user logs in again over LDAP, the user will be recreated. You should delete the user in your directory server before deleting it here.</p> 863 <!-- /ko --> 864 <!-- ko if: IsOIDCUser() --> 865 <p>If this user logs in again over OIDC, the user will be recreated. You should delete the user in your authentication provider before deleting it here.</p> 866 <!-- /ko --> 867 <button class="bgRed slideIcon" data-bind="click: deleteUser"><span>Delete User Forever</span><span class="mat-icon">delete_forever</span></button> 868 </div> 869 <!-- /ko --> 870 <p> <br /></p> 871 </div> 872 </div> 873 </div> 874 </div> 875 876 <div class="bodyTab noMobilePadding" id="tab_auditlog" data-viewmodel="AuditLogVM"> 877 <table id="auditLogTable" class="noMobileRadius"> 878 <thead> 879 <tr> 880 <th>User</th> 881 <th>Timestamp</th> 882 <th class="hiddenOnMobile">Source</th> 883 <th class="hiddenOnMobile">Category</th> 884 <th class="hiddenOnMobile">Message</th> 885 </tr> 886 </thead> 887 <tbody data-bind="foreach: entries"> 888 <tr> 889 <td data-bind="text: User"></td> 890 <td data-bind="text: DisplayTime"></td> 891 <td class="hiddenOnMobile" data-bind="text: Source"></td> 892 <td class="hiddenOnMobile" data-bind="text: Category"></td> 893 <td class="hiddenOnMobile" data-bind="text: Message"></td> 894 </tr> 895 <tr class="noDesktopRow"> 896 <td colspan="2" data-bind="text: `${Source} [${Category}]: ${Message}`"></td> 897 </tr> 898 </tbody> 899 </table> 900 <button class="bgGreen" data-bind="click:advance">More >></button> 901 </div> 902 903 <div class="bodyTab noPaddingTab" id="tab_rolemanagement" data-viewmodel="PermissionManagementVM"> 904 <div class="sideItemList hiddenOnMobile"> 905 <button class="slideIcon slimButton" data-bind="click: createRole"><span>Create Role</span><span class="mat-icon">group_add</span></button> 906 <button class="slideIcon slimButton" data-bind="click: createTemplateRole, visible: canCreateTemplates"><span>Create Template Role</span><span class="mat-icon">group_add</span></button> 907 908 <div> 909 <div data-bind="foreach: roles" class="itemList"> 910 <div class="item" data-bind="click: Click, css:{selected: selected}">
911 <span class="mat-icon" data-bind="text: Icon()"></span> 912 <div> 913 <span data-bind="text: Name"></span> 914 <span class="desc" data-bind="text: DisplayRoleType()"></span> 915 </div> 916 </div> 917 </div> 918 </div> 919 </div> 920 921 <select class="hiddenOnDesktop" data-bind="options: roles, optionsText: 'Name', value: currentRole, optionsCaption: 'Select a role...'"> 922 </select> 923 924 <div class="sideItemData fullSizeOnMobile"> 925 <!-- ko with: overrideRole() != null ? overrideRole : currentRole --> 926 <div class="permissionsHeader"> 927 <h4>Permissions for <span data-bind="text: Name"></span></h4> 928 <p data-bind="text: Description"></p> 929 </div> 930 <div class="permissionDescriptions"> 931 <!-- ko if: IsInstanceSpecific --> 932 <div> 933 <h4>Instance Specific</h4> 934 <p>This role is specific to this instance and is not visible to other instances</p> 935 <p class="description">Users created outside this instance can still be assigned this role</p> 936 </div> 937 <!-- /ko --> 938 <!-- ko if: !IsInstanceSpecific && !IsCommonRole --> 939 <div> 940 <h4>Global Role</h4> 941 <p>This role is visible in all instances, but has different permissions in each instance</p> 942 <p class="description">Edit this role from inside a single instance to change what effect it will have</p> 943 </div> 944 <!-- /ko --> 945 <!-- ko if: IsCommonRole --> 946 <div> 947 <h4>Template Role</h4> 948 <p>The permissions for this role are the same across all instances except ADS</p> 949 <p class="description">Changing permissions for this role will change it in all other instances except ADS which will continue to have separate permissions.</p> 950 </div> 951 <!-- /ko --> 952 <!-- ko if: DisableEdits --> 953 <div> 954 <h4>Read Only</h4> 955 <p>This role cannot be modified</p> 956 <p class="description">This role is managed by AMP and cannot be edited</p> 957 </div> 958 <!-- /ko --> 959 </div> 960 <!-- /ko --> 961 <input type="text" placeholder="Filter" data-bind="value: $root.filter, valueUpdate: 'input'" /> 962
962<script type="text/html" id="permissionNestedTemplate"> 963 <div class="treeEntry treeItem" data-bind="css: {noParent : Parent == null}, visible : FilterVisible"> 964 <div data-bind="css: {expanded : Expanded()}, click: Toggle, visible: CanExpand" class="treeExpando"></div> 965 <div class="treeItemText" data-bind="click: Toggle"> 966 <div class="treeName"> 967 <span data-bind="text: DisplayName"></span> 968 </div> 969 <!-- ko if: Description != null --> 970 <div data-bind="text: Description" class="description"></div> 971 <!-- /ko --> 972 </div> 973 <span data-bind="foreach: NodeSegments" class="permNodeDescription"><span data-bind="text: $data"></span></span> 974 <label class="checkbox" data-bind="visible: Node != ''"> 975 <input type="checkbox" class="redOff" data-bind="click: Click, checked: HasPermission() == true, attr: {indeterminate : HasPermission() == null}" /> 976 <span></span> 977 </label> 978 </div> 979 <!-- ko if: Children().length > 0 && FilterVisible --> 980 <div data-bind="css: { expanded : Expanded() }, style: { 'max-height': Expanded() ? Height() : 0 }, template: { name: 'permissionNestedTemplate', foreach: Children}" class="treeContents"></div> 981 <!-- /ko --> 982 </script>
982 983 984 <div data-bind="template: { name: 'permissionNestedTemplate', foreach: permissions}" id="rolePermissionsSelector" class="treeContainer"></div> 985 <hr style="margin: 16px -8px; color: #333;" /> 986 <!--<h3>Members of <span data-bind="text: Name"></span></h3>--> 987 <!-- ko with: overrideRole() != null ? overrideRole : currentRole --> 988 <!-- ko if: !IsDefault && !IsHidden() && !DisableEdits --> 989 <h3>Delete Role</h3> 990 <p>This will permanently delete this role and any associated data</p> 991 <button class="bgRed slideIcon" data-bind="click: deleteRole"><span>Delete Role Forever</span><span class="mat-icon">delete_forever</span></button> 992 <!-- /ko --> 993 <!-- /ko --> 994 <p> <br /></p> 995 <button class="slideIcon hiddenOnDesktop" data-bind="click: createRole"><span>Create Role</span><span class="mat-icon">group_add</span></button> 996 <button class="slideIcon hiddenOnDesktop" data-bind="click: createTemplateRole, visible: canCreateTemplates"><span>Create Template Role</span><span class="mat-icon">group_add</span></button> 997 </div> 998 </div> 999 1000 <div class="bodyTab" id="tab_support" data-viewmodel="DiagnosticsVM"> 1001 <a data-bind="visible: branded, attr: {href: brandURL}" style="float:right"><img style="max-height:256px" loading="lazy" data-bind="attr: {src: brandLogo, alt: brandName}" /></a> 1002 <h2>Get Support</h2> 1003 1004 <!-- ko if: branded() --> 1005 <p>Server provided by <a data-bind="attr: {href: brandURL}, text: brandName"></a> | <a data-bind="attr: {href: supportUrl}">Support Home</a></p> 1006 <button data-bind="click: createTicket">Open a support ticket</button> 1007 <p data-bind="text: supportText()"></p> 1008 <!-- /ko --> 1009 <!-- ko if: !branded() --> 1010 <table style="width: 500px; max-width: 100%;"> 1011 <tr> 1012 <td>Got a quick question?</td> 1013 <td><button class="" data-bind="click: showDiscord">Join Discord Server</button></td> 1014 </tr> 1015 <tr style="background-color:transparent;"> 1016 <td>Check out documentation and articles</td> 1017 <td><button class="" data-bind="click: showSupportBoard">Visit support board</button></td> 1018 </tr> 1019 <tr> 1020 <td>Still need assistance?</td> 1021 <td><button class="" data-bind="click: createTicket">Open a support ticket</button></td> 1022 </tr> 1023 </table> 1024 <!-- /ko --> 1025 <h2>Updates</h2> 1026 <!-- ko if: !upgradePending() --> 1027 <p>Hooray! AMP is up-to-date.</p> 1028 <!-- /ko --> 1029 <p>Currently running version <span data-bind="text: installedVersion"></span> - <span data-bind="text: installedBuild"></span></p> 1030 <!-- ko if: upgradePending() && !upgradePatchOnly() --> 1031 <p>An AMP Update is Available: <span data-bind="text: upgradeVersion"></span> - <span data-bind="text: upgradeBuild"></span></p> 1032 <!-- /ko --> 1033 <!-- ko if: upgradePatchOnly() --> 1034 <p>A new patch is Available: <span data-bind="text: upgradeBuild"></span></p> 1035 <!-- /ko --> 1036 1037 <button class="slimButton slideIcon" data-bind="click: showReleaseNotes"><span>View Release Notes</span><span class="mat-icon">contract</span></button> 1038 <a class="button slimButton slideIcon" href="https://discourse.cubecoders.com/t/how-to-update-amp-to-the-latest-version/2297" target="_blank" rel="noopener noreferrer"><span>Upgrade this instance</span><span class="mat-icon">system_update_alt</span></a> 1039 <!-- <button class="slimButton slideIcon" data-bind="click: upgradeAMP"><span>Upgrade this instance</span><span class="mat-icon">system_update_alt</span></button> --> 1040 1041 <h2>Diagnostics</h2> 1042 <button class="slimButton slideIcon" data-bind="click: copyToClipboard"><span>Copy data to clipboard</span><span class="mat-icon">content_copy</span></button> 1043 <button class="slimButton slideIcon" data-bind="click: showReports, visible: !branded()"><span>View uploaded error reports</span><span class="mat-icon">pageview</span></button> 1044 <p> </p> 1045 <table id="diagTable"> 1046 <tbody data-bind="foreach: diaginfo"> 1047 <tr>
1048 <td data-bind="text: key"></td> 1049 <td data-bind="text: value"></td> 1050 </tr> 1051 </tbody> 1052 </table> 1053 <h2>Actions</h2> 1054 <button class="slimButton slideIcon bgRed" data-bind="click: restartAMP, visible: restartAvailable"><span>Restart this AMP instance</span><span class="mat-icon">replay</span></button> 1055 </div> 1056 1057 <!-- Merlin tabs should go below here --> 1058 <div class="bodyTab wizardTab" id="tab_createUser" data-viewmodel="AMPUserListVM"> 1059 <div class="wizardContents wizardPopup"> 1060 <h2>Create User</h2> 1061 <button class="iconButton" data-wizard="cancel" data-wizardname="createUser"><span class="mat-icon">close</span></button> 1062 <div class="settingsGroup" style="margin-top: 16px"> 1063 <div class="groupBody"> 1064 <div class="settingContainer"> 1065 <div class="settingLabel"> 1066 <div><span>Username</span></div> 1067 <div class="settingDescription">The login username for the new user.</div> 1068 <input type="text" data-bind="value: newUsername, valueUpdate: 'input'" placeholder="Username" /> 1069 </div> 1070 </div> 1071 <!-- ko if: oidcEnabled() --> 1072 <div class="settingContainer"> 1073 <div class="settingLabel"> 1074 <div><span>OIDC User</span></div> 1075 <div class="settingDescription">Authenticate this user via the OIDC provider instead of a password.</div> 1076 <label class="checkbox"> 1077 <input type="checkbox" data-bind="checked: newIsOIDCUser" /> 1078 <span></span> 1079 </label> 1080 </div> 1081 </div> 1082 <!-- ko if: newIsOIDCUser() --> 1083 <div class="settingContainer"> 1084 <div class="settingLabel"> 1085 <div><span>OIDC Subject (sub)</span></div> 1086 <div class="settingDescription">Optional. The OIDC subject claim for this user. Leave blank to populate automatically on first login.</div> 1087 <input type="text" data-bind="value: newOIDCSub, valueUpdate: 'input'" placeholder="Leave blank for auto" /> 1088 </div> 1089 </div> 1090 <!-- /ko --> 1091 <!-- /ko --> 1092 </div> 1093 </div> 1094 <div class="wizardButtons"> 1095 <button class="slimButton bgGreen" data-bind="click: submitCreateUser">Create User</button> 1096 <button class="slimButton" data-wizard="cancel" data-wizardname="
1096createUser">Cancel</button> 1097 </div> 1098 </div> 1099 </div> 1100 1101 <div class="bodyTab wizardTab" id="tab_diagnostics_newTicket" data-viewmodel="DiagnosticsVM"> 1102 <div class="wizardContents wizardPopup"> 1103 <!-- ko with: newTicket --> 1104 <h2>Create new ticket <span data-bind="text: selectedCategory() == null ? '' : ' - ' + selectedCategory().title"></span></h2> 1105 <button class="iconButton" data-bind="click: close"><span class="mat-icon">close</span></button> 1106 <h2 class="warningHeader" data-bind="visible: showADSwarning()">You are creating a ticket for AMPs deployment system (ADS), if you are having a problem with a particular instance/game - manage that instance first and create a ticket from there. Do not use this for issues with a specific game.</h2> 1107 <!-- ko if: selectedCategory() == null --> 1108 <h3>Issue Category</h3> 1109 <p>Which category best describes the problem you are having?</p> 1110 <div class="radioButtonGrid" data-bind="foreach: availableCategories"> 1111 <label class="radioButtons"> 1112 <input type="radio" name="NewTicketCategory" data-bind="checked: $parent.selectedCategory, checkedValue: $data" /> 1113 <span> 1114 <strong data-bind="text: title"></strong><br /><span data-bind="text: caption"></span> 1115 </span> 1116 </label> 1117 </div> 1118 <!-- /ko --> 1119 <!-- ko if: selectedCategory() != null && selectedCategory().special == "conn" --> 1120 <h3>Connectivity Problems</h3> 1121 <p>Which of the following are best describes the issue?</p> 1122 <div class="radioButtonGrid" data-bind="foreach: connectivityCategories"> 1123 <label class="radioButtons"> 1124 <input type="radio" name="NewTicketConnCategory" data-bind="checked: $parent.selectedSubcategory, checkedValue: $data" /> 1125 <span> 1126 <strong data-bind="text: title"></strong><br /><span data-bind="text: caption"></span> 1127 </span> 1128 </label> 1129 </div> 1130 <!-- /ko --> 1131 <!-- ko if: selectedCategory() != null --> 1132 <p class="infoWell" data-bind="visible: selectedCategory()?.articleLink != null">You may find the following support article useful: <a data-bind="attr: {href: selectedCategory()?.articleLink}, text: selectedCategory()?.articleTitle" href="" target="_blank" class="plausible-event-name=ClickRelevantSupportArticle"></a></p> 1133 <br /> 1134 <h3>Problem Description</h3> 1135 <p style="margin-top:0">Please fill in all the fields below. <em>All responses must be in English.</em></p> 1136 <!-- ko if: selectedCategory()?.isOther --> 1137 <h4>Task</h4> 1138 <p>In a few words, what is it that you're currently trying to do?</p> 1139 <input type="text" placeholder="" data-bind="value: tryingToDo" /> 1140 <!-- /ko --> 1141 <h4>Summary</h4> 1142 <p>Briefly describe the issue in between 4 and 10 words (120 characters max)</p> 1143 <input type="text" placeholder="It is not necessary to include the name of the application" data-bind="value: shortDescription" pattern="^(\s*\S+\s*){4,10}$" title="Please enter between 4 and 10 words, up to 120 characters" maxlength="120" /> 1144 <h4>Reproduction Steps</h4> 1145 <p>What steps have you performed to get to your current situation? (Minimum 3 steps)</p> 1146 <!-- ko foreach: steps --> 1147 <ul> 1148 <li><span data-bind="text: $data"></span> <button class="slimButton slideIcon listEditButton bgRed" data-bind="$parent.removeStep($data)"><span>Remove Step</span><span class="mat-icon">delete</span></button></li> 1149 </ul> 1150 <!-- /ko --> 1151 <button class="slimButton slideIcon bgGreen" data-bind="click: addStep"><span>Add Step</span><span class="mat-icon">add_circle</span></button> 1152 <h4>Detailed Description</h4> 1153 <textarea data-bind="value: longProblemDescription, valueUpdate: 'input'"></textarea> 1154 <!--<h4>Include Console Output</h4> 1155 <p class="settingDescription">Includes the most recent 20 lines of log output.</p> 1156 <label class="checkbox"> 1157 <input type="checkbox" data-bind="checked: includeConsoleOutput" />
1158 <span></span> 1159 </label>--> 1160 <!-- /ko --> 1161 <p> </p> 1162 <button data-bind="click: close"><span>Cancel</span></button> 1163 <button data-bind="click: clearCategory, visible: selectedCategory() != null"><span>Back</span></button> 1164 <button data-bind="enable: isValid, click: createTicket, visible: selectedCategory() != null" class="bgGreen"><span>Create Ticket</span></button> 1165 <!-- /ko --> 1166 </div> 1167 </div> 1168 1169 <div class="bodyTab wizardTab" id="tab_userinfo_tokens" data-viewmodel="UserInfoVM"> 1170 <div class="wizardContents wizardPopup"> 1171 <h2>Authentication Tokens</h2> 1172 <button class="iconButton" data-bind="click: closeWebauthnManage"><span class="mat-icon">close</span></button> 1173 <table> 1174 <thead> 1175 <tr> 1176 <th>Last Used</th> 1177 <th>Description</th> 1178 <th class="hiddenOnMobile">Created</th> 1179 <th>Action</th> 1180 </tr> 1181 </thead> 1182 <tbody data-bind="foreach: webauthnCredentials"> 1183 <tr> 1184 <td data-bind="text: _displayLastUsedUTC"></td> 1185 <td data-bind="text: Description"></td> 1186 <td class="hiddenOnMobile" data-bind="text: _displayCreatedUTC"></td> 1187 <td> 1188 <button class="slimButton slideIcon bgRed" data-bind="click: _revoke"><span>Revoke</span><span class="mat-icon">key_off</span></button> 1189 </td> 1190 </tr> 1191 </tbody> 1192 </table> 1193 <p> </p> 1194 <button data-bind="click: closeWebauthnManage"><span>Close</span></button> 1195 <button data-bind="click: setupWebauthn" class="bgGreen secureLoginButton"><span>Add new token</span></button> 1196 </div> 1197 </div> 1198 1199 <div class="bodyTab wizardTab" id="tab_console_userinfo"> 1200 <div class="wizardContents wizardPopup"> 1201 <h2>User Information</h2> 1202 <button class="iconButton" data-wizard="finish" data-wizardname="viewUserInfo"><span class="mat-icon">close</span></button> 1203 <table class="TwoColLine"> 1204 <tr> 1205 <td>Name</td> 1206 <td id="tab_console_name"></td> 1207 </tr> 1208 <tr> 1209 <td>UUID</td> 1210 <td id="tab_console_uuid"></td> 1211 </tr> 1212 <tr> 1213 <td>Session ID</td> 1214 <td id="tab_console_session"></td> 1215 </tr> 1216 <tr> 1217 <td>IP Address</td> 1218 <td id="tab_console_ip"></td> 1219 </tr> 1220 <tr> 1221 <td>Join Time</td> 1222 <td id="tab_console_join"></td> 1223 </tr> 1224 </table> 1225 1226 <br /> 1227 <button class="bgRed slideIcon" data-wizard="finish" data-wizardname="viewUserInfo"><span>Close</span><span class="mat-icon">close</span></button> 1228 <div id="userContentsButtonsArea" class="buttonGroup flexButtonGroup"> 1229 1230 </div> 1231 </div> 1232 </div> 1233 1234 <div class="bodyTab wizardTab" id="tab_schedule_newTask" data-viewmodel="ScheduleVM"> 1235 <div class="wizardContents wizardPopup">
1236 <!-- ko if: editing() --> 1237 <h2>Edit task</h2> 1238 <!-- /ko --> 1239 <!-- ko if: !editing() --> 1240 <h2>Add a new task</h2> 1241 <button class="iconButton" data-wizard="cancel"><span class="mat-icon">close</span></button> 1242 1243 <p>What task would you like to perform?</p> 1244 1245 <select data-bind="options: availableMethods, optionsText: 'Description', value: selectedTask"></select> 1246 <!-- /ko --> 1247 1248 <!-- ko with: editing() ? editingTask : selectedTask --> 1249 <h4 data-bind="text: Description().length > 0 ? Description() : Name(), visible: $parent.editing()"></h4> 1250 1251 <!-- ko if: Notice && Notice() --> 1252 <div class="well warning" style="margin-top: 12px"> 1253 <span class="mat-icon">warning</span> 1254 <div><p data-bind="text: Notice()"></p></div> 1255 </div> 1256 <!-- /ko --> 1257 1258 <!-- ko if: Consumes().length == 0 --> 1259 <p style="margin-top: 16px">This task consumes no values.</p> 1260 <!-- /ko --> 1261 <!-- ko if: Consumes().length > 0 --> 1262 <div class="settingsGroup" style="margin-top: 16px"> 1263 <div class="groupBody" data-bind="foreach: Consumes" style="grid-template-columns: repeat(auto-fill, minmax(250px, 2fr))"> 1264 <div class="settingContainer" data-bind="style: {opacity: Locked ? '0.55' : '1'}"> 1265 <div class="settingLabel"> 1266 <div><span data-bind="text: DisplayName"></span></div> 1267 <div class="settingDescription" data-bind="text: Description"></div> 1268 <!-- ko if: InputType == "Enum" --> 1269 <select data-bind="options: enumValues, value: Value, optionsText: 'name', optionsValue: 'value', disable: Locked"></select> 1270 <!-- /ko --> 1271 <!-- ko if: (InputType == "text" || InputType == "number") --> 1272 <input class="scheduleTriggerContents" data-bind="attr: {'type': InputType}, value: Value, valueUpdate: 'input', click: () => $root.setSelected($element), disable: Locked" /> 1273 <!-- /ko --> 1274 <!-- ko if: ValueType == "Uri" --> 1275 <input class="scheduleTriggerContents" type="url" data-bind="value: Value, valueUpdate: 'input', click: () => $root.setSelected($element), disable: Locked" /> 1276 <!-- /ko --> 1277 <!-- ko if: InputType === "Boolean" || InputType === "checkbox" --> 1278 <label class="checkbox"> 1279 <input type="checkbox" data-bind="checked: Value, disable: Locked" /> 1280 <span></span> 1281 </label> 1282 <!-- /ko --> 1283 <!-- ko if: InputType === "Textarea" --> 1284 <textarea class="scheduleTriggerContents" data-bind="value: Value, valueUpdate: 'input', click: () => $root.setSelected($element), disable: Locked"></textarea> 1285 <!-- /ko --> 1286 <!-- ko if: Locked && LockedReason --> 1287 <div class="settingDescription" style="color: orange; font-style: italic;" data-bind="text: LockedReason"></div> 1288 <!-- /ko --> 1289 </div> 1290 1291 </div> 1292 </div> 1293 </div> 1294 1295 <div> 1296 <h4>Available Variables</h4> 1297 <!-- ko with: $root.selectedTrigger() --> 1298 <div class="emitsList"> 1299 <!-- ko foreach: Emits() --> 1300 <div class="button emitValue bgAmber" data-bind="text: Name, click: () => {$root.insertParam(Name);}, attr: {'title': Description}"></div> 1301 <!-- /ko --> 1302 <!-- ko foreach: GlobalMappings --> 1303 <div class="button emitValue" data-bind="text: Name, click: () => {$root.insertParam(Name);}, attr: {'title': Description}"></div> 1304 <!-- /ko --> 1305 </div> 1306 <p>Click on a parameter to insert it into your value.</p> 1307 <!-- /ko --> 1308 </div> 1309 <!-- /ko --> 1310 <!-- /ko --> 1311 <br /> 1312 <button class="bgRed slideIcon" data-wizard="cancel"><span>Cancel</span><span class="mat-icon">close</span></button> 1313 <button class="bgGreen slideIcon" data-bind="click: addEditTask">
1313<span data-bind="text: editing() ? 'Edit Task' : 'Add Task'"></span><span class="mat-icon" data-bind="text: (editing()) ? 'edit' : 'add_circle'"></span></button> 1314 </div> 1315 </div> 1316 1317 <div class="bodyTab wizardTab" id="tab_schedule_newTrigger" data-viewmodel="ScheduleVM"> 1318 <div class="wizardContents wizardPopup"> 1319 <!-- Merlin --> 1320 <!-- ko if: editing() --> 1321 <h2>Edit trigger</h2> 1322 <!-- /ko --> 1323 <!-- ko if: !editing() --> 1324 <h2>Add a new trigger</h2> 1325 <!-- /ko --> 1326 <button class="iconButton" data-wizard="cancel"><span class="mat-icon">close</span></button> 1327 1328 <div data-bind="visible: newTriggerType() == -1"> 1329 <p>What type of trigger would you like to add?</p> 1330 1331 <label class="radioButtons"> 1332 <input type="radio" name="NewTriggerType" value="0" data-bind="checked: newTriggerType" /> 1333 <span> 1334 <strong>Event Trigger</strong><br />For responding to events raised by in-application actions or by other AMP components 1335 <img src="/Images/Glyphicons/[email protected]" loading="lazy" alt="Lightning bolt symbol representing an 'event'" /> 1336 </span> 1337 </label> 1338 1339 1340 <label class="radioButtons"> 1341 <input type="radio" name="NewTriggerType" value="15" data-bind="checked: newTriggerType" /> 1342 <span> 1343 <strong>Simple Time Interval</strong><br />Create a trigger that runs at a fixed interval (daily, weekly, etc.) 1344 <img src="/Images/Glyphicons/[email protected]" loading="lazy" alt="A clock icon representing a regular interval" /> 1345 </span> 1346 </label> 1347 1348 1349 <label class="radioButtons"> 1350 <input type="radio" name="NewTriggerType" value="10" data-bind="checked: newTriggerType" /> 1351 <span> 1352 <strong>Advanced Time Interval</strong><br />Create a trigger that runs at a more variable interval (E.g. only on weekdays but not weekends) 1353 <img src="/Images/Glyphicons/AdvSchedule.png" loading="lazy" alt="A calendar overlaid with a clock representing a variable interval" /> 1354 </span> 1355 </label> 1356 1357 <!-- 1358 <label class="radioButtons"> 1359 <input type="radio" name="NewTriggerType" value="20" disabled /> 1360 <span><strong>Fixed Time</strong><br />One-shot triggers that occur at a specific time, and are then removed</span> 1361 </label> 1362 --> 1363 </div> 1364 1365 <div data-bind="visible: newTriggerType() == 0"> 1366 <h3>Event Trigger</h3> 1367 <select data-bind="options: availableTriggers, optionsText: 'Description', value: newTriggerEvent"></select> 1368 </div> 1369 1370 <div data-bind="visible: newTriggerType() == 10" class="scheduleAdvSegments"> 1371 <h3>Advanced Time Interval Trigger</h3> 1372 1373 <h4>Months</h4> 1374 <div class="twelveSegmentContainer" data-bind="foreach: newTriggerMonths"> 1375 <div class="timeSegment" data-bind="text: text, click: toggle, css: {selected: selected}"></div> 1376 </div> 1377 <h4>Days</h4> 1378 <div class="sevenSegmentContainer" data-bind="foreach: newTriggerDays"> 1379 <div class="timeSegment" data-bind="text: text, click: toggle, css: {selected: selected}"></div> 1380 </div> 1381 <h4>Hours</h4> 1382 <div class="hoursSegmentContainer" data-bind="foreach: newTriggerHours"> 1383 <div class="timeSegment" data-bind="text: text, click: toggle, css: {selected: selected}"></div> 1384 </div> 1385 <h4>Minutes</h4> 1386 <div class="minutesSegmentContainer" data-bind="foreach: newTriggerMinutes"> 1387 <div class="timeSegment" data-bind="text: text, click: toggle, css: {selected: selected}"></div> 1388 </div> 1389 1390 <div class="segmentKeyContainer" style="float: right; position: unset;"> 1391 <div class="timeSegment selected" style="float:right;">Selected</div> 1392 <div class="timeSegment" style="float:right;">Not Selected</div> 1393 </div> 1394 1395 <div style="margin-top:8px"> 1396 <p>Server Timezone: <span data-bind="text: serverTimezone"></span></p> 1397 <h4>What do you want to call this trigger?</h4> 1398 <input data-bind="value: newTriggerName" type="text" required="required" /> 1399 </div> 1400 </div> 1401 1402 <div data-bind="visible: newTriggerType() == 15"> 1403 <h3>Simple Time Interval Trigger</h3> 1404 1405 <select data-bind="value: newSimpleTriggerType"> 1406 <option value="0">Once per week</option> 1407 <option value="10">Once per day</option> 1408 <option value="20">Every X hours</option> 1409 <option value="30">Every X minutes</option> 1410 <option value="40">Once per month</option> 1411 <option value="50">On the (nth) (day) of each month</option> 1412 </select> 1413 1414 <br /><br /> 1415
1416 <span data-bind="visible: newSimpleTriggerType() != 10 && newSimpleTriggerType() != 40 && newSimpleTriggerType() != 50">Every</span> 1417 <span data-bind="visible: newSimpleTriggerType() == 40 || newSimpleTriggerType() == 50">On the</span> 1418 1419 <select data-bind="visible: newSimpleTriggerType() == 50, value: simpleNthDayOf"> 1420 <option value="0">first</option> 1421 <option value="1">second</option> 1422 <option value="2">third</option> 1423 <option value="3">fourth</option> 1424 <option value="4">fifth</option> 1425 </select> 1426 1427 <select data-bind="visible: newSimpleTriggerType() == 0 || newSimpleTriggerType() == 50, value: simpleWeekday"> 1428 <option value="0">Monday</option> 1429 <option value="1">Tuesday</option> 1430 <option value="2">Wednesday</option> 1431 <option value="3">Thursday</option> 1432 <option value="4">Friday</option> 1433 <option value="5">Saturday</option> 1434 <option value="6">Sunday</option> 1435 </select> 1436 1437 <select data-bind="visible: newSimpleTriggerType() == 20, value: simpleIntervalHours"> 1438 <option value="1">1</option> 1439 <option value="2">2</option> 1440 <option value="3">3</option> 1441 <option value="4">4</option> 1442 <option value="6">6</option> 1443 <option value="8">8</option> 1444 <option value="12">12</option> 1445 </select> 1446 1447 <select data-bind="visible: newSimpleTriggerType() == 30, value: simpleIntervalMinutes"> 1448 <option value="1">1</option> 1449 <option value="2">2</option> 1450 <option value="3">3</option> 1451 <option value="4">4</option> 1452 <option value="5">5</option> 1453 <option value="6">6</option> 1454 <option value="10">10</option> 1455 <option value="12">12</option> 1456 <option value="15">15</option> 1457 <option value="20">20</option> 1458 <option value="30">30</option> 1459 </select> 1460 1461 <select data-bind="visible: newSimpleTriggerType() == 40, value: simpleIntervalDayOfMonth" id="scheduleSimpleDayOfMonth"> 1462 <option value="1">1st</option> 1463 <option value="2">2nd</option> 1464 <option value="3">3rd</option> 1465 <option value="4">4th</option> 1466 <option value="5">5th</option> 1467 <option value="6">6th</option> 1468 <option value="7">7th</option> 1469 <option value="8">8th</option> 1470 <option value="9">9th</option> 1471 <option value="10">10th</option> 1472 <option value="11">11th</option> 1473 <option value="12">12th</option> 1474 <option value="13">13th</option> 1475 <option value="14">14th</option> 1476 <option value="15">15th</option> 1477 <option value="16">16th</option> 1478 <option value="17">17th</option> 1479 <option value="18">18th</option> 1480 <option value="19">19th</option> 1481 <option value="20">20th</option> 1482 <option value="21">21st</option> 1483 <option value="22">22nd</option> 1484 <option value="23">23rd</option> 1485 <option value="24">24th</option> 1486 <option value="25">25th</option> 1487 <option value="26">26th</option> 1488 <option value="27">27th</option> 1489 <option value="28">28th</option> 1490 <option value="29">29th</option> 1491 <option value="30">30th</option> 1492 <option value="31">31st</option> 1493 </select> 1494
1495 <span data-bind="visible: newSimpleTriggerType() == 30"> Minutes </span> 1496 <span data-bind="visible: newSimpleTriggerType() == 20"> Hours </span> 1497 <span data-bind="visible: newSimpleTriggerType() == 0 || newSimpleTriggerType() == 10"> at </span> 1498 <span data-bind="visible: newSimpleTriggerType() == 40 || newSimpleTriggerType() == 50"> of each month at </span> 1499 1500 <span data-bind="visible: newSimpleTriggerType() == 0 || newSimpleTriggerType() == 10 || newSimpleTriggerType() == 40 || newSimpleTriggerType() == 50"> 1501 <select data-bind="value: simpleHours"> 1502 <option value="0">00</option> 1503 <option value="1">01</option> 1504 <option value="2">02</option> 1505 <option value="3">03</option> 1506 <option value="4">04</option> 1507 <option value="5">05</option> 1508 <option value="6">06</option> 1509 <option value="7">07</option> 1510 <option value="8">08</option> 1511 <option value="9">09</option> 1512 <option value="10">10</option> 1513 <option value="11">11</option> 1514 <option value="12">12</option> 1515 <option value="13">13</option> 1516 <option value="14">14</option> 1517 <option value="15">15</option> 1518 <option value="16">16</option> 1519 <option value="17">17</option> 1520 <option value="18">18</option> 1521 <option value="19">19</option> 1522 <option value="20">20</option> 1523 <option value="21">21</option> 1524 <option value="22">22</option> 1525 <option value="23">23</option> 1526 </select> 1527 <span>:</span> 1528 <select data-bind="value: simpleMinutes"> 1529 <option value="0">00</option> 1530 <option value="1">01</option> 1531 <option value="2">02</option> 1532 <option value="3">03</option> 1533 <option value="4">04</option> 1534 <option value="5">05</option> 1535 <option value="6">06</option> 1536 <option value="7">07</option> 1537 <option value="8">08</option> 1538 <option value="9">09</option> 1539 <option value="10">10</option> 1540 <option value="11">11</option> 1541 <option value="12">12</option> 1542 <option value="13">13</option> 1543 <option value="14">14</option> 1544 <option value="15">15</option> 1545 <option value="16">16</option> 1546 <option value="17">17</option> 1547 <option value="18">18</option> 1548 <option value="19">19</option> 1549 <option value="20">20</option> 1550 <option value="21">21</option> 1551 <option value="22">22</option> 1552 <option value="23">23</option> 1553 <option value="24">24</option> 1554 <option value="25">25</option> 1555 <option value="26">26</option> 1556 <option value="27">27</option> 1557 <option value="28">28</option> 1558 <option value="29">29</option> 1559 <option value="30">30</option> 1560 <option value="31">31</option> 1561 <option value="32">32</option> 1562 <option value="33">33</option> 1563 <option value="34">34</option> 1564 <option value="35">35</option> 1565 <option value="36">36</option> 1566 <option value="37">37</option> 1567 <option value="38">38</option> 1568 <option value="39">39</option> 1569 <option value="40">40</option> 1570 <option value="41">41</option> 1571 <option value="42">42</option> 1572 <option value="43">43</option> 1573 <option value="44">44</option> 1574 <option value="45">45</option> 1575 <option value="46">46</option> 1576 <option value="47">47</option> 1577 <option value="48">48</option> 1578 <option value="49">49</option> 1579 <option value="50">50</option> 1580 <option value="51">51</option> 1581 <option value="52">52</option> 1582 <option value="53">53</option> 1583 <option value="54">54</option> 1584 <option value="55">55</option> 1585 <option value="56">56</option>
1586 <option value="57">57</option> 1587 <option value="58">58</option> 1588 <option value="59">59</option> 1589 </select> 1590 </span> 1591 1592 <p data-bind="visible: newSimpleTriggerType() == 40 && simpleIntervalDayOfMonth() > 28" class="inlineWarning">This trigger will not fire on months that have fewer than <span style="font-weight:bold" data-bind="text: simpleIntervalDayOfMonth()"></span> days.</p> 1593 <p>Server Timezone: <span data-bind="text: serverTimezone"></span></p> 1594 </div> 1595 1596 <!-- ko if: newTriggerType() != -1 --> 1597 <h4>Emitted Values</h4> 1598 <!-- /ko --> 1599 <!-- ko if: newTriggerType() == 0 --> 1600 <!-- ko with: newTriggerEvent --> 1601 <!-- ko if: Emits().length > 0 --> 1602 <ul id="triggerEmittedValues" data-bind="foreach: Emits"> 1603 <li data-bind="text: Name"></li> 1604 </ul> 1605 <!-- /ko --> 1606 <!-- ko if: Emits().length == 0 --> 1607 <p>This trigger emits no values.</p> 1608 <!-- /ko --> 1609 <!-- /ko --> 1610 <!-- /ko --> 1611 <ul data-bind="visible: (newTriggerType() == 10 || newTriggerType() == 15 || newTriggerType() == 20 || newTriggerType() == 40)"> 1612 <li>Time</li> 1613 </ul> 1614 1615 <br /> 1616 <button class="bgRed slideIcon" data-bind="click: hideWizard"><span>Cancel</span><span class="mat-icon">delete</span></button> 1617 <!-- ko if: newTriggerType() != -1 --> 1618 <!-- ko if: !editing() --> 1619 <button data-bind="click: backButton"><span>Back</span></button> 1620 <!-- /ko --> 1621 <button class="bgGreen slideIcon" data-bind="click: addTrigger"><span data-bind="text: (editing()) ? 'Edit Trigger' : 'Add Trigger'"></span><span class="mat-icon" data-bind="text: (editing()) ? 'edit' : 'add_circle'"></span></button> 1622 <!-- /ko --> 1623 </div> 1624 </div> 1625 1626 <div class="bodyTab wizardPopup wizardTab" id="tab_mobileLogin"> 1627 <div class="wizardContents"> 1628 <h2>Mobile Login</h2> 1629 <button class="iconButton" data-wizard="finish" data-wizardname="mobileLogin"><span class="mat-icon">close</span></button> 1630 <img id="mobileLoginQR" loading="lazy" alt="A single-use QR code. Scan this with a mobile device. Not seeing anything here? Try disabling ad-blockers/privacy plugins for this page." /> 1631 <p>Scan this QR code on your mobile device to log in as the current user.</p> 1632 <p>This is a single-use code that cannot be used again once scanned. It will remain valid for 30 seconds.</p> 1633 <br /> 1634 <button class="" data-wizard="finish" data-wizardname="mobileLogin"><span>Finish</span></button> 1635 </div> 1636 </div> 1637 1638 <div class="bodyTab wizardPopup wizardTab" id="tab_changepassword"> 1639 <div class="wizardContents"> 1640 <h2>Change Password</h2> 1641 <button class="iconButton" data-wizard="cancel" data-wizardname="tab_changepassword"><span class="mat-icon">close</span></button> 1642 <h3 id="passwdChangeRequiredText">A password change is required to log in with this user</h3> 1643 <form id="changePasswordForm"> 1644 <table class="twoColLine noZebra"> 1645 <tr> 1646 <td>Username</td> 1647 <td id="changepw_showusername" data-formfield="username"></td> 1648 </tr> 1649 <tr> 1650 <td>Old Password</td> 1651 <td><input type="password" name="oldpassword" required="required" /></td> 1652 </tr> 1653 <tr> 1654 <td>New Password</td> 1655 <td>
1655<input type="password" id="changepw_newpwd" name="newpassword" required="required" /></td> 1656 </tr> 1657 <tr> 1658 <td>Confirm Password</td> 1659 <td><input type="password" name="confirmpassword" required="required" /></td> 1660 </tr> 1661 <tr id="showChangePW2FA"> 1662 <td>2FA Code (If enabled)</td> 1663 <td><input type="number" name="changepw2fa" /></td> 1664 </tr> 1665 <tr> 1666 <td>Password Strength</td> 1667 <td><div id="passwordGrade" class="passwordGrade"></div></td> 1668 </tr> 1669 </table> 1670 <br /> 1671 <button class="bgRed slideIcon" data-wizard="cancel" data-wizardname="tab_changepassword" type="button"><span>Cancel</span><span class="mat-icon">close</span></button> 1672 <button class="bgGreen slideIcon" data-wizard="finish" data-wizardname="tab_changepassword" type="submit"><span>Change Password</span><span class="mat-icon">password</span></button> 1673 </form> 1674 </div> 1675 </div> 1676 </div> 1677 </div> 1678 1679
1679<script type="text/html" id="notificationTemplate"> 1680 <div class="notification" data-bind="css: { failed: State() == 3, alert: State() == 100 }"> 1681 <div class="notificationTitle"> 1682 <span data-bind="text: Name"></span> 1683 <button data-bind="click: Cancel, visible: IsCancellable() && State() == 0">Cancel</button> 1684 <button class="bgRed" data-bind="click: Dismiss, visible: State() == 3">Dismiss</button> 1685 </div> 1686 <!-- ko if: Actions().length == 0 --> 1687 <div class="notificationDescription" data-bind="text: Description"></div> 1688 <div class="notificationProgessContainer"> 1689 <div class="notificationProgressBar" data-bind="css: { progUnknown: IsIndeterminate }, style: { width : IsIndeterminate() ? '100%' : ProgressPercent() + '%' }"></div> 1690 <div class="notificationSpeed" data-bind="text: Speed"></div> 1691 </div> 1692 <!-- /ko --> 1693 <!-- ko if: Actions().length > 0 --> 1694 <div class="notificationDescription" style="margin: 16px 0px" data-bind="text: Description"></div> 1695 <!-- /ko --> 1696 <!-- ko foreach: Actions --> 1697 <button class="slimButton" data-bind="click: click, text: text, css: cssClass"></button> 1698 <!-- /ko --> 1699 </div> 1700 </script>
1700 1701 1702 <div id="notificationContainer" data-bind="fadeVisible: Visible"> 1703 <div class="notificationBanner" data-bind="click: ToggleCollapsed"> 1704 <span class="mat-icon notificationChevron" data-bind="css: { notificationChevronCollapsed: Collapsed }">expand_more</span> 1705 <span>Notifications</span> (<span class="notificationCount" data-bind="text: Notifications().length"></span>) 1706 <button class="bgRed" data-bind="click: DismissAll, clickBubble: false, visible: DismissAllVisible">Dismiss All</button> 1707 </div> 1708 <div class="notificationContents" data-bind="visible: !Collapsed()"> 1709 <!-- ko template: {name: 'notificationTemplate', foreach: Notifications, beforeRemove: BeforeRemove} --> 1710 <!-- /ko --> 1711 </div> 1712 </div> 1713 1714 <div id="sideMenuContainer"> 1715 <div id="userInfo" data-viewmodel="UserInfoVM"> 1716 <img class="icon smallIcon" data-bind="attr: {src: imageSmallURI}" loading="lazy" alt="User Avatar" /> 1717 <span data-bind="text: username"></span> 1718 </div> 1719 <div id="sideMenu"> 1720 <img data-bind="visible: showADSUI, attr: {src: imageURL}" loading="lazy" class="heroImage" /> 1721 <div class="menuTitle">Main Menu</div> 1722 1723
1723<script type="text/html" id="menuSubmenu"> 1724 <!-- ko if: children().length > 0 && visible() --> 1725 <div class="multiMenuContainer"> 1726 <a data-bind="'class': extraClass, click:click, css:{small: small}"> 1727 <span class="mat-icon" data-bind="text: image"></span> 1728 <span style="flex-grow:1" data-bind="text:title"></span> 1729 <span class="mat-icon">arrow_forward_ios</span> 1730 </a> 1731 <div class="subMenuWell" data-bind="css: {appear: expanded}"> 1732 <div class="menuTitle" data-bind="text:title"></div> 1733 <a data-bind="click:click" class="small"> 1734 <span class="mat-icon">arrow_back_ios_new</span> 1735 <span>Back</span> 1736 </a> 1737 <div data-bind="template: { name: 'menuSubmenu', foreach: children}"> 1738 </div> 1739 </div> 1740 </div> 1741 <!-- /ko --> 1742 <!-- ko if: children().length == 0 && visible() --> 1743 <a data-bind="'class': extraClass, attr:{href: tab, 'data-permission': requiredPermission}, click:click, css:{selected: selected, small: small, disabled: disabled }, disable: disabled"> 1744 <span class="mat-icon" data-bind="text: image"></span> 1745 <span data-bind="visible: subtitle() != '', text: subtitleIcon" class="warn mat-icon"></span> 1746 <div> 1747 <span data-bind="text:title, css: {hasSubtitle: subtitle() != ''}"></span> 1748 <span data-bind="visible: subtitle() != '', text:subtitle" class="subtitle"></span> 1749 </div> 1750 </a> 1751 <!-- /ko --> 1752 </script>
1752 1753 1754 <div id="sideMenuPresenter" data-bind="template: {name: 'menuSubmenu', foreach: sideMenuData}"> 1755 1756 </div> 1757 </div> 1758 1759 <div id="bgtext" data-viewmodel="DiagnosticsVM"> 1760 <span id="versionHeadline">AMP Release "<span data-bind="text: versionCodename()"></span>"</span> 1761 <div class="tiny" data-bind="text: versionTitle()"></div> 1762 </div> 1763 </div> 1764 1765 <!--Scripts--> 1766 <!--Third Party--> 1767
1767<script type="text/javascript" src="/Scripts/jquery-3.6.0.min.js" defer></script>
1767 1768
1768<script type="text/javascript" src="/Scripts/swiped-events.min.js" defer></script>
1768 1769
1769<script type="text/javascript" src="/Scripts/flotchart-full.min.js" defer></script>
1769 1770
1770<script type="text/javascript" src="/Scripts/knockout-3.5.1.js" defer></script>
1770 1771
1771<script type="text/javascript" src="/Scripts/knockout.quickmap.js" defer></script>
1771 1772
1772<script type="text/javascript" src="/Scripts/FileSaver.js" defer></script>
1772 1773
1773<script type="text/javascript" src="/Scripts/pressure.min.js" defer></script>
1773 1774 <!--End Third Party--> 1775 <!--Internal--> 1776
1776<script type="text/javascript" src="/Scripts/FeatureTest.js" defer></script>
1776 1777
1777<script type="text/javascript" src="/Scripts/Common.js?v=2.8.0.4" defer></script>
1777 1778
1778<script type="text/javascript" src="/Scripts/API.js?v=2.8.0.4" defer></script>
1778 1779
1779<script type="text/javascript" src="/Scripts/Locale.js?v=2.8.0.4" defer></script>
1779 1780
1780<script type="text/javascript" src="/Scripts/UI.js?v=2.8.0.4" defer></script>
1780 1781
1781<script type="text/javascript" src="/Scripts/PluginHandler.js?v=2.8.0.4" defer></script>
1781 1782
1782<script type="text/javascript" src="/Scripts/AMP.js?v=2.8.0.4" id="scriptAMPmain" defer></script>
1782 1783 <!--End Internal--> 1784 <!--External--> 1785 <!--
1785<script src="https://discourse.cubecoders.com/javascripts/embed-topics.js"></script>
1785--> 1786 <!--End External--> 1787 <!--
1787<script type="text/javascript" src="/Scripts/AMPBundle.js"></script>
1787--> 1788</body> 1789</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.