Skip to content

Commit

Permalink
Merge branch 'develop' into wip/procrat/home-button-6399
Browse files Browse the repository at this point in the history
* develop:
  Limit the number of reported warnings (#6577)
  Add COOP+COEP+CORP headers (#6597)
  Fix issues with missing sourcemaps (#6572)
  Fix asset delete; implement project delete and project rename (#6566)
  Fix #6377: Change ctrl-r shortcut (#6620)
  • Loading branch information
Procrat committed May 10, 2023
2 parents b4d24d0 + cf3624c commit 2a548d3
Show file tree
Hide file tree
Showing 56 changed files with 717 additions and 221 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,11 +146,19 @@
- [Fixed text visualisations which were being cut off at the last line.][6421]
- [Fixed a bug where, when scrolling or dragging on a full-screen visualization,
the view of the graph changed as well.][6530]
- [Changed the shortcut for restoring to the last saved version of a project
from <kbd>cmd</kbd>+<kbd>r</kbd> to
<kbd>cmd</kbd>+<kbd>shift</kbd>+<kbd>r</kbd>][6620] to make it less likely
that it would be triggered by accident. As a consequence, the program
execution shortcuts changed from
<kbd>cmd</kbd>+<kbd>shift</kbd>+<kbd>t</kbd>/<kbd>r</kbd> to
<kbd>cmd</kbd>+<kbd>alt</kbd>+<kbd>t</kbd>/<kbd>r</kbd>.
- [Added a button to return from an opened project back to the project
dashboard.][6474]

[6421]: https://github.com/enso-org/enso/pull/6421
[6530]: https://github.com/enso-org/enso/pull/6530
[6620]: https://github.com/enso-org/enso/pull/6620
[6474]: https://github.com/enso-org/enso/pull/6474

#### EnsoGL (rendering engine)
Expand Down Expand Up @@ -743,6 +751,7 @@
finalizers][6335]
- [Warning.get_all returns only unique warnings][6372]
- [Reimplement `enso_project` as a proper builtin][6352]
- [Limit number of reported warnings per value][6577]

[3227]: https://github.com/enso-org/enso/pull/3227
[3248]: https://github.com/enso-org/enso/pull/3248
Expand Down Expand Up @@ -852,6 +861,7 @@
[6335]: https://github.com/enso-org/enso/pull/6335
[6372]: https://github.com/enso-org/enso/pull/6372
[6352]: https://github.com/enso-org/enso/pull/6352
[6577]: https://github.com/enso-org/enso/pull/6577

# Enso 2.0.0-alpha.18 (2021-10-12)

Expand Down
5 changes: 3 additions & 2 deletions app/gui/docs/product/shortcuts.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ broken and require further investigation.
| <kbd>ctrl</kbd>+<kbd>`</kbd> | Show Code Editor. Please note that the Code Editor implementation is in a very early stage and you should not use it. Even just openning it can cause errors in the IDE. Do not try using the graph editor while having the code editor tab openned. |
| <kbd>cmd</kbd>+<kbd>o</kbd> | Open project |
| <kbd>cmd</kbd>+<kbd>s</kbd> | Save module |
| <kbd>cmd</kbd>+<kbd>shift</kbd>+<kbd>r</kbd> | Restore module from last save |
| <kbd>cmd</kbd>+<kbd>z</kbd> | Undo last action |
| <kbd>cmd</kbd>+<kbd>y</kbd> or <kbd>cmd</kbd> + <kbd>shift</kbd> + <kbd>z</kbd> | Redo last undone action |
| <kbd>cmd</kbd>+<kbd>q</kbd> | Close the application (MacOS) |
Expand All @@ -48,8 +49,8 @@ broken and require further investigation.
| <kbd>ctrl</kbd>+<kbd>w</kbd> | Close the application (Windows, Linux) |
| :warning: <kbd>ctrl</kbd>+<kbd>p</kbd> | Toggle profiling mode |
| <kbd>escape</kbd> | Cancel current action. For example, drop currently dragged connection. |
| <kbd>cmd</kbd>+<kbd>shift</kbd>+<kbd>t</kbd> | Terminate the program execution |
| <kbd>cmd</kbd>+<kbd>shift</kbd>+<kbd>r</kbd> | Re-execute the program |
| <kbd>cmd</kbd>+<kbd>alt</kbd>+<kbd>t</kbd> | Terminate the program execution |
| <kbd>cmd</kbd>+<kbd>alt</kbd>+<kbd>r</kbd> | Re-execute the program |
| <kbd>cmd</kbd>+<kbd>shift</kbd>+<kbd>k</kbd> | Switch the execution environment to Design. |
| <kbd>cmd</kbd>+<kbd>shift</kbd>+<kbd>l</kbd> | Switch the execution environment to Live. |

Expand Down
6 changes: 3 additions & 3 deletions app/gui/view/src/project.rs
Original file line number Diff line number Diff line change
Expand Up @@ -744,14 +744,14 @@ impl application::View for View {
(Press, "", "cmd alt shift t", "toggle_style"),
(Press, "", "cmd alt p", "toggle_component_browser_private_entries_visibility"),
(Press, "", "cmd s", "save_project_snapshot"),
(Press, "", "cmd r", "restore_project_snapshot"),
(Press, "", "cmd shift r", "restore_project_snapshot"),
(Press, "", "cmd z", "undo"),
(Press, "", "cmd y", "redo"),
(Press, "", "cmd shift z", "redo"),
(Press, "!debug_mode", DEBUG_MODE_SHORTCUT, "enable_debug_mode"),
(Press, "debug_mode", DEBUG_MODE_SHORTCUT, "disable_debug_mode"),
(Press, "", "cmd shift t", "execution_context_interrupt"),
(Press, "", "cmd shift r", "execution_context_restart"),
(Press, "", "cmd alt t", "execution_context_interrupt"),
(Press, "", "cmd alt r", "execution_context_restart"),
// TODO(#6179): Remove this temporary shortcut when Play button is ready.
(Press, "", "ctrl shift b", "toggle_read_only"),
]
Expand Down
28 changes: 13 additions & 15 deletions app/ide-desktop/lib/client/src/bin/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ import * as mime from 'mime-types'
import * as portfinder from 'portfinder'
import createServer from 'create-servers'

import * as common from 'enso-common'
import * as contentConfig from 'enso-content-config'

import * as paths from '../paths'

const logger = contentConfig.logger

// =================
Expand All @@ -18,20 +21,6 @@ const logger = contentConfig.logger

const HTTP_STATUS_OK = 200

// ======================
// === URL Parameters ===
// ======================

/** Construct URL query with the given parameters. For each `key` - `value` pair,
* `key=value` will be added to the query. */
export function urlParamsFromObject(obj: Record<string, string>) {
const params = []
for (const [key, value] of Object.entries(obj)) {
params.push(`${key}=${encodeURIComponent(value)}`)
}
return params.length === 0 ? '' : '?' + params.join('&')
}

// ==============
// === Config ===
// ==============
Expand Down Expand Up @@ -110,7 +99,16 @@ export class Server {
} else {
const url = requestUrl.split('?')[0]
const resource = url === '/' ? '/index.html' : requestUrl
const resourceFile = `${this.config.dir}${resource}`
// `preload.cjs` must be specialcased here as it is loaded by electron from the root,
// in contrast to all assets loaded by the window, which are loaded from `assets/` via
// this server.
const resourceFile =
resource === '/preload.cjs.map'
? `${paths.APP_PATH}${resource}`
: `${this.config.dir}${resource}`
for (const [header, value] of common.COOP_COEP_CORP_HEADERS) {
response.setHeader(header, value)
}
fs.readFile(resourceFile, (err, data) => {
if (err) {
logger.error(`Resource '${resource}' not found.`)
Expand Down
15 changes: 8 additions & 7 deletions app/ide-desktop/lib/client/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -345,16 +345,17 @@ class App {
/** Redirect the web view to `localhost:<port>` to see the served website. */
loadWindowContent() {
if (this.window != null) {
const urlCfg: Record<string, string> = {}
const searchParams: Record<string, string> = {}
for (const option of this.args.optionsRecursive()) {
if (option.value !== option.default && option.passToWebApplication) {
urlCfg[option.qualifiedName()] = String(option.value)
searchParams[option.qualifiedName()] = option.value.toString()
}
}
const params = server.urlParamsFromObject(urlCfg)
const address = `http://localhost:${this.serverPort()}${params}`
logger.log(`Loading the window address '${address}'.`)
void this.window.loadURL(address)
const address = new URL('http://localhost')
address.port = this.serverPort().toString()
address.search = new URLSearchParams(searchParams).toString()
logger.log(`Loading the window address '${address.toString()}'.`)
void this.window.loadURL(address.toString())
}
}

Expand Down Expand Up @@ -423,7 +424,7 @@ class App {
// ===================

process.on('uncaughtException', (err, origin) => {
console.error(`Uncaught exception: ${String(err)}\nException origin: ${origin}`)
console.error(`Uncaught exception: ${err.toString()}\nException origin: ${origin}`)
electron.dialog.showErrorBox(common.PRODUCT_NAME, err.stack ?? err.toString())
electron.app.exit(1)
})
Expand Down
13 changes: 12 additions & 1 deletion app/ide-desktop/lib/common/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/** @file This module contains metadata about the product and distribution.
/** @file This module contains metadata about the product and distribution,
* and various other constants that are needed in multiple sibling packages.
*
* Code in this package is used by two or more sibling packages of this package. The code is defined
* here when it is not possible for a sibling package to own that code without introducing a
Expand All @@ -12,3 +13,13 @@ export const DEEP_LINK_SCHEME = 'enso'

/** Name of the product. */
export const PRODUCT_NAME = 'Enso'

/** COOP, COEP, and CORP headers: https://web.dev/coop-coep/
*
* These are required to increase the resolution of `performance.now()` timers,
* making profiling a lot more accurate and consistent. */
export const COOP_COEP_CORP_HEADERS: [header: string, value: string][] = [
['Cross-Origin-Embedder-Policy', 'require-corp'],
['Cross-Origin-Opener-Policy', 'same-origin'],
['Cross-Origin-Resource-Policy', 'same-origin'],
]
7 changes: 6 additions & 1 deletion app/ide-desktop/lib/content/esbuild-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,11 @@ import esbuildPluginYaml from 'esbuild-plugin-yaml'
import * as utils from '../../utils'
import BUILD_INFO from '../../build.json' assert { type: 'json' }

export const THIS_PATH = pathModule.resolve(pathModule.dirname(url.fileURLToPath(import.meta.url)))
// =================
// === Constants ===
// =================

const THIS_PATH = pathModule.resolve(pathModule.dirname(url.fileURLToPath(import.meta.url)))

// =============================
// === Environment variables ===
Expand Down Expand Up @@ -88,6 +92,7 @@ export function bundlerOptions(args: Arguments) {
loader: {
'.html': 'copy',
'.css': 'copy',
'.map': 'copy',
'.wasm': 'copy',
'.svg': 'copy',
'.png': 'copy',
Expand Down
4 changes: 4 additions & 0 deletions app/ide-desktop/lib/content/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ const logger = app.log.logger
const ESBUILD_PATH = '/esbuild'
/** SSE event indicating a build has finished. */
const ESBUILD_EVENT_NAME = 'change'
/** Path to the service worker that resolves all extensionless paths to `/index.html`.
* This service worker is required for client-side routing to work when doing local development. */
const SERVICE_WORKER_PATH = '/serviceWorker.js'
/** One second in milliseconds. */
const SECOND = 1000
/** Time in seconds after which a `fetchTimeout` ends. */
Expand All @@ -33,6 +36,7 @@ if (IS_DEV_MODE) {
new EventSource(ESBUILD_PATH).addEventListener(ESBUILD_EVENT_NAME, () => {
location.reload()
})
void navigator.serviceWorker.register(SERVICE_WORKER_PATH)
}

// =============
Expand Down
32 changes: 32 additions & 0 deletions app/ide-desktop/lib/content/src/serviceWorker.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/** @file A service worker that redirects paths without extensions to `/index.html`.
* This is required for paths like `/login`, which are handled by client-side routing,
* to work when developing locally on `localhost:8080`. */
// Bring globals and interfaces specific to Web Workers into scope.
/// <reference lib="WebWorker" />
import * as common from 'enso-common'

// =====================
// === Fetch handler ===
// =====================

// We `declare` a variable here because Service Workers have a different global scope.
// eslint-disable-next-line no-restricted-syntax
declare const self: ServiceWorkerGlobalScope

self.addEventListener('fetch', event => {
const url = new URL(event.request.url)
if (url.hostname === 'localhost' && url.pathname !== '/esbuild') {
event.respondWith(
fetch(event.request.url).then(response => {
const clonedResponse = new Response(response.body, response)
for (const [header, value] of common.COOP_COEP_CORP_HEADERS) {
clonedResponse.headers.set(header, value)
}
return clonedResponse
})
)
return
} else {
return false
}
})
8 changes: 8 additions & 0 deletions app/ide-desktop/lib/content/watch.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
/** @file File watch and compile service. */
import * as path from 'node:path'
import * as url from 'node:url'

import * as esbuild from 'esbuild'
import * as portfinder from 'portfinder'
import chalk from 'chalk'
Expand All @@ -12,6 +15,7 @@ import * as dashboardBundler from '../dashboard/esbuild-config'

const PORT = 8080
const HTTP_STATUS_OK = 200
const THIS_PATH = path.resolve(path.dirname(url.fileURLToPath(import.meta.url)))

// ===============
// === Watcher ===
Expand All @@ -29,6 +33,10 @@ async function watch() {
...bundler.argumentsFromEnv(),
devMode: true,
})
opts.entryPoints.push({
in: path.resolve(THIS_PATH, 'src', 'serviceWorker.ts'),
out: 'serviceWorker',
})
const builder = await esbuild.context(opts)
await builder.watch()
await builder.serve({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,16 @@ export const COMPUTER_ICON = (
</svg>
)

/** An icon representing a user without a profile picture. */
export const DEFAULT_USER_ICON = (
<svg height={32} width={32} viewBox="2 2 20 20" xmlns="http://www.w3.org/2000/svg">
<path
d="M6 20a10 10 0 0 1 6 -18 10 10 0 0 1 6 18 6 6 0 0 0 -4 -5 4.3 4.3 0 0 0 -2 -8 4.3 4.3 0 0 0 -2 8 6 6 0 0 0 -4 5"
fill="#888888"
/>
</svg>
)

export interface StopIconProps {
className?: string
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ function ChangePasswordModal() {
onClick={event => {
event.stopPropagation()
}}
onSubmit={async event => {
event.preventDefault()
await onSubmit()
}}
className="flex flex-col bg-white shadow-md px-4 sm:px-6 md:px-8 lg:px-10 py-8 rounded-md w-full max-w-md"
>
<div className="font-medium self-center text-xl sm:text-2xl uppercase text-gray-800">
Expand All @@ -63,6 +67,8 @@ function ChangePasswordModal() {
</div>

<input
autoFocus
required
id="old_password"
type="password"
name="old_password"
Expand All @@ -88,6 +94,7 @@ function ChangePasswordModal() {
</div>

<input
required
id="new_password"
type="password"
name="new_password"
Expand All @@ -113,6 +120,7 @@ function ChangePasswordModal() {
</div>

<input
required
id="confirm_new_password"
type="password"
name="confirm_new_password"
Expand Down
Loading

0 comments on commit 2a548d3

Please sign in to comment.