trilium/src/views/index.ejs

564 lines
24 KiB
Plaintext
Raw Normal View History

<!DOCTYPE html>
2017-10-16 07:10:36 +08:00
<html lang="en">
<head>
2017-10-16 07:10:36 +08:00
<meta charset="utf-8">
<title>Trilium Notes</title>
</head>
<body>
<div id="container" style="display:none;">
2017-10-16 07:10:36 +08:00
<div id="header" class="hide-toggle">
<div id="header-title">
2018-03-25 00:52:58 +08:00
<img src="/images/app-icons/png/24x24.png">
2017-11-07 12:52:54 +08:00
Trilium Notes
2017-10-16 07:10:36 +08:00
</div>
<div id="history-navigation" style="display: none;">
<a id="history-back-button" title="Go to previous note." class="icon-action"
style="background: url('/images/icons/back.png')"></a>
&nbsp; &nbsp;
<a id="history-forward-button" title="Go to next note." class="icon-action"
style="background: url('/images/icons/forward.png')"></a>
</div>
<div style="flex-grow: 100; display: flex;">
<button class="btn btn-xs" id="jump-to-note-button" title="CTRL+J">Jump to note</button>
<button class="btn btn-xs" id="recent-notes-button" title="CTRL+E">Recent notes</button>
<button class="btn btn-xs" id="recent-changes-button">Recent changes</button>
<div>
<span style="font-size: smaller">Protected session:</span>
<div class="btn-group btn-group-xs">
<button type="button" class="btn" id="protected-session-on">On</button>
<button type="button" class="btn active" id="protected-session-off">Off</button>
</div>
</div>
2017-10-16 07:10:36 +08:00
</div>
2018-02-03 23:37:57 +08:00
<div id="plugin-buttons">
</div>
2017-10-16 07:10:36 +08:00
<div>
<button class="btn btn-xs" id="sync-now-button" title="Number of outstanding changes to be pushed to server">
2018-02-03 23:37:57 +08:00
<span class="ui-icon ui-icon-refresh"></span>
2017-12-22 20:00:17 +08:00
Sync now (<span id="changes-to-push-count">0</span>)
</button>
2017-10-29 23:22:41 +08:00
<button class="btn btn-xs" id="options-button">
<span class="ui-icon ui-icon-gear"></span> Options</button>
2017-10-16 07:10:36 +08:00
<form action="logout" id="logout-button" method="POST" style="display: inline;">
2017-10-16 07:10:36 +08:00
<input type="submit" class="btn btn-xs" value="Logout">
</form>
</div>
</div>
<div style="grid-area: left-pane; display: flex; flex-direction: column;" class="hide-toggle">
<div style="display: flex; justify-content: space-around; padding: 10px 0 10px 0; margin: 0 20px 0 20px; border: 1px solid #ccc;">
<a id="create-top-level-note-button" title="Create new top level note" class="icon-action"
2018-03-25 00:52:58 +08:00
style="background: url('/images/icons/file-plus.png')"></a>
2017-10-16 07:10:36 +08:00
<a id="collapse-tree-button" title="Collapse note tree" class="icon-action"
2018-03-25 00:52:58 +08:00
style="background: url('/images/icons/list.png')"></a>
2017-10-16 07:10:36 +08:00
<a id="scroll-to-current-note-button" title="Scroll to current note. Shortcut CTRL+." class="icon-action"
2018-03-25 00:52:58 +08:00
style="background: url('/images/icons/crosshair.png')"></a>
2017-10-16 07:10:36 +08:00
<a id="toggle-search-button" title="Search in notes" class="icon-action"
2018-03-25 00:52:58 +08:00
style="background: url('/images/icons/search.png')"></a>
</div>
<input type="file" id="import-upload" style="display: none" />
2017-10-16 07:10:36 +08:00
<div id="search-box" style="display: none; padding: 10px; margin-top: 10px;">
<div style="display: flex; align-items: center;">
<input name="search-text" placeholder="Search text, labels" style="flex-grow: 100; margin-left: 5px; margin-right: 5px;" autocomplete="off">
<button id="do-search-button" class="btn btn-primary btn-sm" title="Search">Search</button>
</div>
2018-03-14 08:02:00 +08:00
<div style="display: flex; align-items: center; justify-content: space-evenly; margin-top: 10px;">
<button id="reset-search-button" class="btn btn-sm" title="Reset search">Reset search</button>
2018-03-14 08:02:00 +08:00
<button id="save-search-button" class="btn btn-sm" title="Save search">Save search</button>
</div>
2017-10-16 07:10:36 +08:00
</div>
2018-04-19 11:13:37 +08:00
<div id="tree"></div>
2017-10-16 07:10:36 +08:00
<div id="parent-list">
<p><strong>Note locations:</strong></p>
2017-12-17 10:35:44 +08:00
<ul id="parent-list-inner"></ul>
</div>
</div>
2018-04-19 11:13:37 +08:00
<div style="grid-area: title;">
<div class="hide-toggle" style="display: flex; align-items: center;">
<a title="Protect the note so that password will be required to view the note"
2017-10-16 07:10:36 +08:00
class="icon-action"
id="protect-button"
style="display: none; background: url('images/icons/lock.png')"></a>
2017-10-16 07:10:36 +08:00
<a title="Unprotect note so that password will not be required to access this note in the future"
2017-10-16 07:10:36 +08:00
class="icon-action"
id="unprotect-button"
style="display: none; background: url('images/icons/unlock.png')"></a>
2017-10-16 07:10:36 +08:00
&nbsp;
<input autocomplete="off" value="" id="note-title" style="font-size: x-large; border: 0; flex-grow: 100;" tabindex="1">
<span id="note-id-display" title="Note ID"></span>
<button class="btn btn-sm"
style="display: none; margin-right: 10px"
id="toggle-edit-button">Toggle edit</button>
<button class="btn btn-sm"
style="display: none; margin-right: 10px"
id="render-button">Render <kbd>Ctrl+Enter</kbd></button>
<button class="btn btn-sm"
style="display: none; margin-right: 10px"
id="execute-script-button">Execute <kbd>Ctrl+Enter</kbd></button>
<div class="dropdown" id="note-type" data-bind="visible: type() != 'search'">
2018-03-25 00:52:58 +08:00
<button data-bind="disable: isDisabled()" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="btn btn-sm">
2018-01-22 12:06:25 +08:00
Type: <span data-bind="text: typeString()"></span>
<span class="caret"></span>
</button>
<ul id="note-type-dropdown" class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel">
<li data-bind="click: selectText, css: { selected: type() == 'text' }"><span class="check">&check;</span> <strong>Text</strong></li>
<li role="separator" class="divider"></li>
2018-01-24 12:41:22 +08:00
<li data-bind="click: selectRender, css: { selected: type() == 'render' && mime() == '' }"><span class="check">&check;</span> <strong>Render HTML note</strong></li>
<li role="separator" class="divider"></li>
2018-01-22 12:06:25 +08:00
<li data-bind="click: selectCode, css: { selected: type() == 'code' && mime() == '' }"><span class="check">&check;</span> <strong>Code</strong></li>
<!-- ko foreach: codeMimeTypes -->
<li data-bind="click: $parent.selectCodeMime, css: { selected: $parent.type() == 'code' && $parent.mime() == mime }"><span class="check">&check;</span> <span data-bind="text: title"></span></li>
<!-- /ko -->
</ul>
</div>
<div class="dropdown" style="margin-left: 10px; margin-right: 10px;">
2018-03-25 00:52:58 +08:00
<button type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="btn btn-sm">
Note actions
<span class="caret"></span>
</button>
<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel">
<li><a id="show-note-revisions-button">Note revisions</a></li>
<li><a class="show-labels-button"><kbd>Alt+L</kbd> Labels</a></li>
<li><a id="show-source-button"><kbd>Ctrl+U</kbd> HTML source</a></li>
<li><a id="upload-file-button">Upload file</a></li>
</ul>
</div>
2017-10-16 07:10:36 +08:00
</div>
</div>
2018-05-09 04:39:01 +08:00
<div id="note-detail-wrapper">
<div id="note-detail-component-wrapper">
<div id="note-detail-text" class="note-detail-component" tabindex="2"></div>
<div id="note-detail-search" class="note-detail-component">
<div style="display: flex; align-items: center;">
<strong>Search string: &nbsp; &nbsp;</strong>
<textarea rows="4" cols="50" id="search-string"></textarea>
</div>
<br />
<h4>Help</h4>
<p>
<ul>
<li>
<code>@abc</code> - matches notes with label abc</li>
<li>
<code>@!abc</code> - matches notes without abc label (maybe not the best syntax)</li>
<li>
<code>@abc=true</code> - matches notes with label abc having value true</li>
<li><code>@abc!=true</code></li>
<li>
<code>@"weird label"="weird value"</code> - works also with whitespace inside names values</li>
<li>
<code>@abc and @def</code> - matches notes with both abc and def</li>
<li>
<code>@abc @def</code> - AND relation is implicit when specifying multiple labels</li>
<li>
<code>@abc or @def</code> - OR relation</li>
<li>
<code>@abc&lt;=5</code> - numerical comparison (also &gt;, &gt;=, &lt;).</li>
<li>
<code>some search string @abc @def</code> - combination of fulltext and label search - both of them need to match (OR not supported)</li>
<li>
<code>@abc @def some search string</code> - same combination</li>
</ul>
<a href="https://github.com/zadam/trilium/wiki/Labels">Complete help on search syntax</a>
</p>
2018-03-11 22:49:22 +08:00
</div>
<div id="note-detail-code" class="note-detail-component"></div>
<div id="note-detail-render" class="note-detail-component"></div>
<div id="note-detail-file" class="note-detail-component">
<table id="file-table">
<tr>
<th>File name:</th>
<td id="file-filename"></td>
</tr>
<tr>
<th>File type:</th>
<td id="file-filetype"></td>
</tr>
<tr>
<th>File size:</th>
<td id="file-filesize"></td>
</tr>
<tr>
<td>
<button id="file-download" class="btn btn-primary" type="button">Download</button>
&nbsp;
<button id="file-open" class="btn btn-primary" type="button">Open</button>
</td>
</tr>
</table>
</div>
2018-03-11 22:49:22 +08:00
<input type="file" id="file-upload" style="display: none" />
2018-03-11 22:49:22 +08:00
</div>
2018-01-21 10:56:03 +08:00
<div id="children-overview"></div>
2018-02-05 09:23:30 +08:00
<div id="label-list">
<button class="btn btn-sm show-labels-button">Labels:</button>
2018-02-05 09:23:30 +08:00
<span id="label-list-inner"></span>
</div>
2018-02-05 09:23:30 +08:00
</div>
2017-10-16 07:10:36 +08:00
</div>
<div id="recent-notes-dialog" title="Recent notes" style="display: none;">
<input id="recent-notes-search-input" class="form-control"/>
2017-10-16 07:10:36 +08:00
</div>
2017-12-22 10:54:25 +08:00
<div id="add-link-dialog" title="Add link" style="display: none;">
<form id="add-link-form">
2018-05-26 22:04:40 +08:00
<div id="add-link-type-div" class="radio">
2017-12-22 10:54:25 +08:00
<label title="Add HTML link to the selected note at cursor in current note">
<input type="radio" name="add-link-type" value="html"/>
add normal HTML link</label>
<label title="Add selected note as a child of current note">
<input type="radio" name="add-link-type" value="selected-to-current"/>
add selected note to current note</label>
<label title="Add current note as a child of the selected note">
<input type="radio" name="add-link-type" value="current-to-selected"/>
add current note to selected note</label>
</div>
2017-10-16 07:10:36 +08:00
<div class="form-group">
2017-12-22 10:54:25 +08:00
<label for="note-autocomplete">Note</label>
2017-10-16 07:10:36 +08:00
<input id="note-autocomplete" style="width: 100%;">
</div>
2017-12-22 10:54:25 +08:00
<div class="form-group" id="add-link-title-form-group">
2017-10-16 07:10:36 +08:00
<label for="link-title">Link title</label>
<input id="link-title" style="width: 100%;">
</div>
2017-12-22 10:54:25 +08:00
<div class="form-group" id="add-link-prefix-form-group" title="Cloned note will be shown in note tree with given prefix">
<label for="clone-prefix">Prefix (optional)</label>
<input id="clone-prefix" style="width: 100%;">
</div>
2017-10-16 07:10:36 +08:00
<button class="btn btn-sm">Add link</button>
</form>
</div>
<div id="jump-to-note-dialog" title="Jump to note" style="display: none;">
<form id="jump-to-note-form">
<div class="form-group">
<label for="jump-to-note-autocomplete">Note</label>
2017-10-16 07:10:36 +08:00
<input id="jump-to-note-autocomplete" style="width: 100%;">
</div>
2017-12-27 08:54:43 +08:00
<button name="action" value="jump" class="btn btn-sm">Jump <kbd>enter</kbd></button>
2017-10-16 07:10:36 +08:00
</form>
</div>
<div id="protected-session-password-dialog" title="Protected session" style="display: none;">
2017-11-15 11:34:33 +08:00
<form id="protected-session-password-form">
2017-10-16 07:10:36 +08:00
<div class="form-group">
<label for="protected-session-password">To proceed with requested action you need to start protected session by entering password:</label>
<input id="protected-session-password" class="form-control" type="password">
2017-10-16 07:10:36 +08:00
</div>
<button class="btn btn-sm">Start protected session <kbd>enter</kbd></button>
2017-10-16 07:10:36 +08:00
</form>
</div>
<div id="options-dialog" title="Options" style="display: none;">
<div id="options-tabs">
2017-10-16 07:10:36 +08:00
<ul>
<li><a href="#change-password">Change password</a></li>
<li><a href="#protected-session-timeout">Protected session</a></li>
<li><a href="#note-revision-snapshot-time-interval">Note revisions</a></li>
<li><a href="#advanced">Advanced</a></li>
2017-11-14 12:35:23 +08:00
<li><a href="#about">About Trilium</a></li>
2017-10-16 07:10:36 +08:00
</ul>
<div id="change-password">
<form id="change-password-form">
<div class="form-group">
<label for="old-password">Old password</label>
<input class="form-control" id="old-password" type="password">
</div>
<div class="form-group">
<label for="new-password1">New password</label>
<input class="form-control" id="new-password1" type="password">
</div>
<div class="form-group">
<label for="new-password2">New password once more</label>
<input class="form-control" id="new-password2" type="password">
</div>
<button class="btn btn-sm">Change password</button>
</form>
</div>
<div id="protected-session-timeout">
<p>Protected session timeout is a time period after which the protected session is wiped out from
browser's memory. This is measured from the last interaction with protected notes.</p>
2017-10-16 07:10:36 +08:00
<form id="protected-session-timeout-form">
2017-10-16 07:10:36 +08:00
<div class="form-group">
<label for="protected-session-timeout-in-seconds">Protected session timeout (in seconds)</label>
<input class="form-control" id="protected-session-timeout-in-seconds" type="number">
2017-10-16 07:10:36 +08:00
</div>
<button class="btn btn-sm">Save</button>
</form>
</div>
<div id="note-revision-snapshot-time-interval">
<p>Note revision snapshot time interval is time in seconds after which new note revision will be created for the note.</p>
2017-10-16 07:10:36 +08:00
<form id="note-revision-snapshot-time-interval-form">
2017-10-16 07:10:36 +08:00
<div class="form-group">
<label for="note-revision-snapshot-time-interval-in-seconds">Note revision snapshot time interval (in seconds)</label>
<input class="form-control" id="note-revision-snapshot-time-interval-in-seconds" type="number">
2017-10-16 07:10:36 +08:00
</div>
<button class="btn btn-sm">Save</button>
</form>
</div>
<div id="advanced">
<h4 style="margin-top: 0px;">Sync</h4>
<button id="force-full-sync-button" class="btn btn-sm">Force full sync</button>
<br/>
<br/>
<button id="fill-sync-rows-button" class="btn btn-sm">Fill sync rows</button>
<h4>Debugging</h4>
<button id="anonymize-button" class="btn btn-sm">Save anonymized database</button><br/><br/>
<p>This action will create a new copy of the database and anonymise it (remove all note content and leave only structure and metadata)
for sharing online for debugging purposes without fear of leaking your personal data.</p>
2018-01-08 03:07:59 +08:00
<h4>Image cleanup</h4>
2018-01-08 03:07:59 +08:00
<p>This will remove all image data of images not used in any current version of note from the database (metadata will remain).
This means that some images can disappear from note revisions.</p>
2018-01-08 03:07:59 +08:00
<button id="cleanup-unused-images-button" class="btn btn-warning btn-sm">Permanently cleanup unused images</button>
<h4>Soft-delete cleanup</h4>
<p>This deletes all soft deleted rows from the database. This change isn't synced and should be done manually on all instances.
<strong>Use this only if you really know what you're doing.</strong></p>
<button id="cleanup-soft-deleted-items-button" class="btn btn-danger btn-sm">Permanently cleanup soft-deleted items</button>
<h4>Vacuum database</h4>
<p>This will rebuild database which will typically result in smaller database file. No data will be actually changed.</p>
<button id="vacuum-database-button" class="btn btn-sm">Vacuum database</button>
2017-12-16 13:05:37 +08:00
</div>
2017-11-14 12:35:23 +08:00
<div id="about">
<table class="table">
<tr>
<th>App version:</th>
<td id="app-version"></td>
</tr>
<tr>
<th>DB version:</th>
<td id="db-version"></td>
</tr>
2017-11-14 12:35:23 +08:00
<tr>
<th>Build date:</th>
<td id="build-date"></td>
</tr>
<tr>
<th>Build revision:</th>
<td><a href="" target="_blank" id="build-revision"></a></td>
</tr>
</table>
</div>
2017-10-16 07:10:36 +08:00
</div>
</div>
<div id="note-revisions-dialog" title="Note revisions" style="display: none;">
2017-10-16 07:10:36 +08:00
<div style="display: flex;">
<select id="note-revision-list" size="25" style="width: 150px; height: 630px;">
2017-10-16 07:10:36 +08:00
</select>
<div id="note-revision-content-wrapper" style="flex-grow: 1; margin-left: 20px;">
<h3 id="note-revision-title" style="margin: 3px;"></h3>
2017-10-16 07:10:36 +08:00
<div id="note-revision-content" style="height: 600px; width: 600px; overflow: auto;"></div>
2017-10-16 07:10:36 +08:00
</div>
</div>
</div>
<div id="recent-changes-dialog" title="Recent changes" style="display: none; padding: 20px;">
</div>
2017-11-04 11:00:35 +08:00
<div id="event-log-dialog" title="Event log" style="display: none; padding: 20px;">
<ul id="event-log-list"></ul>
</div>
2017-11-27 11:34:25 +08:00
<div id="edit-tree-prefix-dialog" title="Edit tree prefix" style="display: none; padding: 20px;">
<form id="edit-tree-prefix-form">
<div class="form-group">
<label for="tree-prefix-input">Prefix</label>
<input id="tree-prefix-input" style="width: 20em;"> - <span id="tree-prefix-note-title"></span>
</div>
<button name="action" class="btn btn-sm">Save</button>
</form>
</div>
2017-12-19 10:58:46 +08:00
<div id="sql-console-dialog" title="SQL console" style="display: none; padding: 20px;">
2018-05-22 08:12:46 +08:00
<div id="sql-console-query"></div>
2018-02-10 22:14:18 +08:00
<div style="text-align: center">
<button class="btn btn-danger" id="sql-console-execute">Execute <kbd>CTRL+ENTER</kbd></button>
</div>
2017-12-15 09:38:56 +08:00
<table id="sql-console-results" class="table table-striped" style="overflow: scroll; width: 100%;">
<thead></thead>
<tbody></tbody>
</table>
</div>
2017-12-27 07:15:29 +08:00
<div id="note-source-dialog" title="Note source" style="display: none; padding: 20px;">
<textarea id="note-source" readonly="readonly"></textarea>
2017-12-27 07:15:29 +08:00
</div>
<div id="labels-dialog" title="Note labels" style="display: none; padding: 20px;">
2018-01-20 08:39:37 +08:00
<form data-bind="submit: save">
2018-02-05 06:22:21 +08:00
<div style="text-align: center">
<button class="btn btn-large" style="width: 200px;" id="save-labels-button" type="submit">Save changes <kbd>enter</kbd></button>
2018-01-12 10:40:09 +08:00
</div>
<div style="height: 97%; overflow: auto">
<table id="labels-table" class="table">
2018-01-12 10:40:09 +08:00
<thead>
<tr>
2018-02-10 21:37:14 +08:00
<th></th>
2018-01-12 10:40:09 +08:00
<th>ID</th>
<th>Name</th>
<th>Value</th>
2018-02-07 12:09:19 +08:00
<th></th>
2018-01-12 10:40:09 +08:00
</tr>
</thead>
<tbody data-bind="foreach: labels">
2018-02-10 21:37:14 +08:00
<tr data-bind="if: isDeleted == 0">
<td class="handle">
<span class="glyphicon glyphicon-resize-vertical"></span>
<input type="hidden" name="position" data-bind="value: position"/>
</td>
<!-- ID column has specific width because if it's empty its size can be deformed when dragging -->
<td data-bind="text: labelId" style="width: 150px;"></td>
2018-01-12 10:40:09 +08:00
<td>
<!-- Change to valueUpdate: blur is necessary because jQuery UI autocomplete hijacks change event -->
<input type="text" class="label-name" data-bind="value: name, valueUpdate: 'blur', event: { blur: $parent.labelChanged }"/>
<div style="color: yellowgreen" data-bind="if: $parent.isNotUnique($index())"><span class="glyphicon glyphicon-info-sign"></span> Duplicate label.</div>
<div style="color: red" data-bind="if: $parent.isEmptyName($index())">Label name can't be empty.</div>
2018-01-12 10:40:09 +08:00
</td>
<td>
<input type="text" class="label-value" data-bind="value: value, valueUpdate: 'blur', event: { blur: $parent.labelChanged }" style="width: 300px"/>
2018-01-12 10:40:09 +08:00
</td>
2018-02-07 12:09:19 +08:00
<td title="Delete" style="padding: 13px;">
<span class="glyphicon glyphicon-trash" data-bind="click: $parent.deleteLabel"></span>
2018-02-07 12:09:19 +08:00
</td>
2018-01-12 10:40:09 +08:00
</tr>
</tbody>
</table>
</div>
2018-01-20 08:39:37 +08:00
</form>
</div>
2017-10-16 07:10:36 +08:00
<div id="tooltip" style="display: none;"></div>
<script type="text/javascript">
2018-03-26 08:18:08 +08:00
window.baseApiUrl = 'api/';
window.glob = {
activeDialog: null,
sourceId: '<%= sourceId %>',
2018-04-03 09:34:28 +08:00
maxSyncIdAtLoad: <%= maxSyncIdAtLoad %>,
instanceName: '<%= instanceName %>'
};
2017-10-16 07:10:36 +08:00
</script>
2017-10-21 11:43:20 +08:00
<!-- Required for correct loading of scripts in Electron -->
<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script>
2018-03-25 00:52:58 +08:00
<script src="/libraries/jquery.min.js"></script>
2017-10-16 07:10:36 +08:00
<!-- bootstrap needs to be included before jQuery UI, otherwise close icon in the dialog will be missing -->
2018-03-25 00:52:58 +08:00
<link href="/libraries/bootstrap/css/bootstrap.css" rel="stylesheet">
<script src="/libraries/bootstrap/js/bootstrap.js"></script>
2017-10-16 07:10:36 +08:00
2018-03-25 00:52:58 +08:00
<link href="/libraries/jqueryui/jquery-ui.min.css" rel="stylesheet">
<script src="/libraries/jqueryui/jquery-ui.min.js"></script>
2017-10-16 07:10:36 +08:00
2018-03-25 00:52:58 +08:00
<script src="/libraries/bootstrap-notify.min.js"></script>
2017-10-16 07:10:36 +08:00
<!-- Include Fancytree skin and library -->
2018-03-25 00:52:58 +08:00
<link href="/libraries/fancytree/skin-win8/ui.fancytree.css" rel="stylesheet">
<script src="/libraries/fancytree/jquery.fancytree-all.min.js"></script>
2017-10-16 07:10:36 +08:00
2018-03-25 00:52:58 +08:00
<script src="/libraries/jquery.hotkeys.js"></script>
<script src="/libraries/jquery.fancytree.hotkeys.js"></script>
2017-10-16 07:10:36 +08:00
2018-03-25 00:52:58 +08:00
<script src="/libraries/jquery.ui-contextmenu.min.js"></script>
2017-10-16 07:10:36 +08:00
2018-03-25 00:52:58 +08:00
<script src="/libraries/knockout.min.js"></script>
2018-03-25 00:52:58 +08:00
<link href="/stylesheets/style.css" rel="stylesheet">
2017-10-16 07:10:36 +08:00
<script src="/javascripts/services/bootstrap.js" type="module"></script>
2018-03-24 23:18:46 +08:00
<script type="text/javascript">
// we hide container initally because otherwise it is rendered first without CSS and then flickers into
// final form which is pretty ugly.
$("#container").show();
</script>
<style type="text/css">
<%= appCss %>
</style>
</body>
2017-10-16 07:10:36 +08:00
</html>