Giter VIP home page Giter VIP logo

workshops's People

Contributors

alielbashir avatar d-loose avatar fitojb avatar jpnurmi avatar kenvandine avatar madsrh avatar nathanbnm avatar renovate[bot] avatar robert-ancell avatar sukso96100 avatar t-cangussu avatar weblate avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

workshops's Issues

Project info UI enhancements

I just saw this info UI PR and was wondering about the color. I don't believe adding color to the "title" nor the expansion arrow is normal practice. I would keep everything monochrome, add a divider/line below the expansion panel and add a bit padding around the content.

Just my 2 cent ๐Ÿ˜„

image

mockup

Shared preferences

There's some old code in remote_store.dart that uses SharedPreferences. We should port that to the new JSON settings to get rid of the SharedPreferences dependency.

Home tab name is "Terminal"

If you right click on any page and choose "New Tab" then the title of the home tab is "Terminal" - seems like it should be "Select Image" or something.

Context menus

Make it contextual instead of having the same items everywhere. :)

image

Shortcut editor

There will be a lot of shortcuts and it would be nice to have them customizable.

edit

  • copy (ctrl+shift+c)
  • paste (ctrl+shift+v)
  • select all

scrolling

  • scroll up/down (ctrl+shift+up/down)
  • scroll page up/down (ctrl+shift+page up/down)
  • scroll to top/bottom (ctrl+shift+home/end)

tabs

  • new tab (ctrl+shift+t)
  • close tab (ctrl+shift+w)
  • next/previous tab (ctrl+page up/down)

panes

  • split tab (horizontal / vertical)
  • close split
  • move focus up/down/left/right (alt+up/down/left/right)

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Rate-Limited

These updates are currently rate-limited. Click on a checkbox below to force their creation now.

  • chore(deps): update dependency ubuntu_service to ^0.3.0
  • chore(deps): update actions/checkout action to v4
  • chore(deps): update actions/upload-artifact action to v4
  • chore(deps): update codecov/codecov-action action to v4
  • chore(deps): update dependency dart to v3
  • chore(deps): update dependency ffigen to v11
  • chore(deps): update dependency flutter_lints to v3
  • chore(deps): update dependency lints to v3
  • chore(deps): update dependency melos to v5
  • chore(deps): update dependency ubuntu to v22
  • chore(deps): update dependency wizard_router to v1
  • chore(deps): update dependency yaru to v4
  • chore(deps): update dependency yaru_icons to v2
  • chore(deps): update dependency yaru_widgets to v3
  • chore(deps): update peter-evans/create-pull-request action to v6
  • ๐Ÿ” Create all rate-limited PRs at once ๐Ÿ”

Warning

Renovate failed to look up the following dependencies: Failed to look up dart package simplestreams.

Files affected: pubspec.yaml


Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

github-actions
.github/workflows/analysis.yaml
  • actions/checkout v2
  • subosito/flutter-action v2
  • actions/checkout v2
  • subosito/flutter-action v2
  • actions/checkout v2
  • subosito/flutter-action v2
  • ubuntu 22.04
  • ubuntu 22.04
  • ubuntu 22.04
.github/workflows/build.yaml
  • actions/checkout v2
  • subosito/flutter-action v2
  • actions/checkout v2
  • dart-lang/setup-dart v1
  • ubuntu 22.04
  • ubuntu 22.04
.github/workflows/cla-check.yaml
  • canonical/has-signed-canonical-cla v1
  • ubuntu 20.04
.github/workflows/generate.yaml
  • actions/checkout v2
  • subosito/flutter-action v2
  • actions/checkout v2
  • subosito/flutter-action v2
  • actions/checkout v2
  • subosito/flutter-action v2
  • peter-evans/create-pull-request v4
  • ubuntu 22.04
  • ubuntu 22.04
  • ubuntu 22.04
.github/workflows/snap.yaml
  • actions/checkout v2
  • snapcore/action-build v1
  • actions/upload-artifact v3
  • ubuntu 20.04
.github/workflows/test.yaml
  • actions/checkout v2
  • subosito/flutter-action v2
  • codecov/codecov-action v3
  • actions/checkout v2
  • subosito/flutter-action v2
  • actions/checkout v2
  • subosito/flutter-action v2
  • ubuntu 22.04
  • ubuntu 22.04
  • ubuntu 22.04
packages/lxd/.github/workflows/analyze.yml
  • actions/checkout v2
  • ubuntu 20.04
packages/lxd/.github/workflows/cla-check.yaml
  • canonical/has-signed-canonical-cla v1
packages/lxd/.github/workflows/format.yml
  • actions/checkout v2
  • ubuntu 20.04
packages/lxd/.github/workflows/test.yml
  • actions/checkout v2
  • actions/checkout v2
  • subosito/flutter-action v2
  • codecov/codecov-action v1
  • ubuntu 20.04
  • ubuntu 20.04
pub
packages/accel_key/pubspec.yaml
  • ffi ^2.0.1
  • flutter
  • ubuntu_localizations ^0.1.6
  • ffigen ^7.1.0
  • flutter_lints ^2.0.0
  • dart >=2.17.0 <3.0.0
  • flutter >=3.0.0
packages/async_value/pubspec.yaml
  • riverpod ^2.0.0
  • dart >=2.17.0 <3.0.0
packages/command_store/pubspec.yaml
  • flutter
  • flutter_jsettings ^0.1.0
  • build_runner ^2.3.0
  • flutter_lints ^2.0.0
  • mockito 5.4.0
  • dart >=2.17.0 <3.0.0
  • flutter >=3.0.0
packages/context_menu/pubspec.yaml
  • flutter
  • flutter_lints ^2.0.0
  • dart >=2.17.0 <3.0.0
  • flutter >=3.0.0
packages/flutter_jsettings/example/pubspec.yaml
  • flutter
  • provider ^6.0.4
  • ubuntu_service ^0.2.0
  • xdg_directories ^0.2.0+2
  • yaru ^0.9.0
  • flutter_lints ^2.0.0
  • dart >=2.18.0 <3.0.0
packages/flutter_jsettings/pubspec.yaml
  • flutter
  • jsettings ^0.1.1
  • build_runner ^2.3.2
  • flutter_lints ^2.0.0
  • mockito ^5.3.2
  • dart >=2.17.0 <3.0.0
  • flutter >=3.0.0
packages/jsettings/pubspec.yaml
  • lints ^2.0.0
  • mockito ^5.3.2
  • test ^1.16.0
  • dart >=2.17.0 <3.0.0
packages/lxd/pubspec.yaml
  • freezed_annotation ^2.0.3
  • json_annotation ^4.5.0
  • build_runner ^2.1.10
  • freezed ^2.3.1
  • json_serializable ^6.2.0
  • lints ^2.0.0
  • mockito 5.4.0
  • test ^1.16.8
  • dart >=2.17.0 <3.0.0
packages/lxd_service/pubspec.yaml
  • freezed_annotation ^2.0.3
  • json_annotation ^4.5.0
  • rxdart ^0.27.3
  • stdlibc ^0.1.0
  • ubuntu_logger ^0.0.2
  • build_runner ^2.1.11
  • freezed ^2.3.1
  • json_serializable ^6.2.0
  • lints ^2.0.0
  • mockito 5.4.0
  • test ^1.16.0
  • dart >=2.17.0 <3.0.0
packages/lxd_test/pubspec.yaml
  • lints ^2.0.0
  • dart >=2.17.0 <3.0.0
packages/lxd_x/pubspec.yaml
  • lints ^2.0.0
  • dart >=2.17.0 <3.0.0
packages/movable_tabs/pubspec.yaml
  • flutter
  • yaru_icons ^1.0.0
  • flutter_lints ^2.0.0
  • dart >=2.17.0 <3.0.0
  • flutter >=3.0.0
packages/nested_split_view/example/pubspec.yaml
  • flutter
  • flutter_lints ^2.0.0
  • dart >=2.18.1 <3.0.0
packages/nested_split_view/pubspec.yaml
  • flutter
  • split_view ^3.2.1
  • flutter_lints ^2.0.0
  • dart >=2.17.0 <3.0.0
  • flutter >=3.0.0
packages/os_logo/pubspec.yaml
  • flutter
  • flutter_svg ^1.1.0
  • build_runner ^2.1.11
  • flutter_lints ^2.0.0
  • mockito 5.4.0
  • dart >=2.17.0 <3.0.0
  • flutter >=3.0.0
packages/osarch/pubspec.yaml
  • stdlibc ^0.1.0
  • mockito 5.4.0
  • test ^1.21.1
  • dart >=2.17.0 <3.0.0
packages/petname/pubspec.yaml
  • test ^1.21.1
  • dart >=2.17.0 <3.0.0
packages/terminal_view/pubspec.yaml
  • flutter
  • xterm
  • flutter_lints ^2.0.0
  • dart >=2.17.0 <3.0.0
  • flutter >=3.0.0
pubspec.yaml
  • command_palette
  • data_size ^0.2.0
  • data_table_2 ^2.3.8
  • fake_async ^1.3.1
  • flutter
  • flutter_jsettings ^0.1.0
  • flutter_staggered_grid_view ^0.6.1
  • freezed_annotation ^2.0.3
  • handy_window ^0.2.0
  • jsettings ^0.1.1
  • json_annotation ^4.5.0
  • provider ^6.0.3
  • safe_change_notifier ^0.2.0
  • simplestreams
  • substring_highlight ^1.0.33
  • ubuntu_localizations ^0.1.6
  • ubuntu_logger ^0.0.2
  • ubuntu_service ^0.2.0
  • ubuntu_widgets
  • window_manager ^0.3.0
  • wizard_router ^0.9.0
  • xdg_directories ^0.2.0+2
  • yaml ^3.1.1
  • yaru ^0.5.0
  • yaru_icons ^1.0.0
  • yaru_widgets ^2.0.0
  • build_runner ^2.1.11
  • flutter_lints ^2.0.0
  • freezed ^2.3.1
  • json_serializable ^6.2.0
  • melos ^3.0.1
  • mockito 5.4.0
  • dart >=2.17.0 <3.0.0
  • flutter >=3.0.0

  • Check this box to trigger a request for Renovate to run again on this repository

Tabs

  • Make them always visible and not expand to full width.
  • Add "v" button with a drop-down of instances to quickly launch specific instances in new tabs.

image

LXD init

https://linuxcontainers.org/lxd/getting-started-cli/#initial-configuration

$ sudo snap install lxd
[sudo] password for user: 
lxd 5.5-37534be from Canonical\u2713 installed
$ lxc list
If this is your first time running LXD on this machine, you should also run: lxd init
To start your first container, try: lxc launch ubuntu:22.04
Or for a virtual machine: lxc launch ubuntu:22.04 --vm

+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+
$ lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: 
Name of the storage backend to use (lvm, zfs, btrfs, ceph, cephobject, dir) [default=zfs]: 
Create a new ZFS pool? (yes/no) [default=yes]: 
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]: 
Size in GiB of the new loop device (1GiB minimum) [default=16GiB]: 
Would you like to connect to a MAAS server? (yes/no) [default=no]: 
Would you like to create a new local network bridge? (yes/no) [default=yes]: 
What should the new bridge be called? [default=lxdbr0]: 
What IPv4 address should be used? (CIDR subnet notation, \u201cauto\u201d or \u201cnone\u201d) [default=auto]: 
What IPv6 address should be used? (CIDR subnet notation, \u201cauto\u201d or \u201cnone\u201d) [default=auto]: 
Would you like the LXD server to be available over the network? (yes/no) [default=no]: 
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: 
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:

Socket error

When you run workshops, we see this socket permissions error that doesn't seem to stand in the way of the user creating a container. The error is an eyesore that we would like to fix before the Ubuntu Summit, if possible.

image

Config: invalid defaults for integers

Some default integer values have "(minimum)" or "(maximum)" suffixes. Users must erase that part when editing values to avoid invalid integer values. We could try to detect these and move them as part of the input field decoration? Label, helper, suffix, whatever looks reasonable. :)

instance_config_schema.yaml:

...
limits.network.priority:
  Default: 0 (minimum)
  ...
  Type: integer
limits.processes:
  Default: '- (max)'
  ...
  Type: integer
limits.cpu.priority:
  Default: 10 (maximum)
  ...
  Type: integer
limits.disk.priority:
  Default: 5 (medium)
  ...
  Type: integer
...

image

Shortcut serialization

We need LogicalKeyboardKey <=> String conversion for (de-)serializing shortcut settings.

Flutter exposes some relevant bits and pieces but not a complete solution, so we're currently getting some help from GTK:

Storing shortcuts formatted in the usual GTK way made more sense when we were using GSettings. Now that we have human-editable JSON config files, it would be nicer to have more human-friendly VSCode-like formatting for shortcuts.

GTK VS Code
<Control><Shift>Down Control+Shift+Down

Also, if we ever want to support other platforms then using GTK for the conversion might become a real problem. If Flutter doesn't offer a solution, is there any package out there that could help?

Once logged in, not clear how to log out.

Once you are logged into an image, it's not clear how to return (i.e. type exit or ctrl+d). Might be worth having the tabs show by default, and disable them in preferences or using right click (i.e. how gnome-terminal does it).

Empty state

Some graphics/placeholder/instructions would be nice.
image

Instance action button icons

In light theme:

  • disabled delete icons look somehow too light/weak
  • black play and stop icons are a bit too strong compared to the text and other icons

image

In dark theme:

  • the icons look much better which is why this went unnoticed :)

image

Resize terminal pane commands

ID Shortcut
terminal-resize-up Alt+Shift+Up
terminal-resize-down Alt+Shift+Down
terminal-resize-left Alt+Shift+Left
terminal-resize-right Alt+Shift+Right

NOTE: The split commands should be changed to use Alt+Shift+W|A|S|D shortcuts.

Upgrade to xterm.dart v3

xterm.dart version 3 no longer has the TerminalBackend class that version 2 had and that Workshops uses to implement LXD interop.

WSL

2022/11/18 11:04:22.072561 cmd_run.go:1055: WARNING: cannot start document portal: dial unix /run/user/1000/bus: connect: no such file or directory

(workshops:5244): Gdk-WARNING **: 11:04:22.200: Settings portal not found: Could not connect: No such file or directory

(workshops:5244): IBUS-WARNING **: 11:04:22.255: Failed to mkdir /home/user/snap/workshops/213/.config/ibus/bus: Not a directory
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: SocketException: Connection failed (OS Error: Permission denied, errno = 13), address = /var/snap/lxd/common/lxd/unix.socket, port = 0
#0      _NativeSocket.startConnect (dart:io-patch/socket_patch.dart:682)
#1      _RawSocket.startConnect (dart:io-patch/socket_patch.dart:1827)
#2      RawSocket.startConnect (dart:io-patch/socket_patch.dart:27)
#3      Socket._startConnect (dart:io-patch/socket_patch.dart:2048)
#4      Socket.startConnect (dart:io/socket.dart:759)
#5      LxdClient._createClient.<anonymous closure> (package:lxd/src/lxd_client.dart:74)
#6      _ConnectionTarget.connect (dart:_http/http_impl.dart:2443)
#7      _HttpClient._getConnection.connect (dart:_http/http_impl.dart:2867)
#8      _HttpClient._getConnection (dart:_http/http_impl.dart:2872)
#9      _HttpClient._openUrl (dart:_http/http_impl.dart:2727)
#10     _HttpClient.openUrl (dart:_http/http_impl.dart:2591)
#11     LxdClient._requestSync (package:lxd/src/lxd_client.dart:548)
#12     LxdClient._connect (package:lxd/src/lxd_client.dart:532)
#13     LxdClient._requestSync (package:lxd/src/lxd_client.dart:545)
#14     LxdClient.getInstances (package:lxd/src/lxd_client.dart:202)
#15     _LxdService.init (package:lxd_service/src/service.dart:78)
#16     main (package:workshops/main.dart:23)
#17     _runMain.<anonymous closure> (dart:ui/hooks.dart:134)
#18     _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297)
#19     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192) 

Launcher wizard fails to render in `0+git.af9303f` due to missing `Provider<RemoteStore>`

With the version 0+git.af9303f from latest/edge, when attempting to click the + button to create a new container, I am experiencing a failure to render the launch wizard (a grey screen pops up instead, with the associated error shown below output by the process).

My pre-existing containers continue to work OK, can be connected to from Workshops, only thing that seems affected is the ability to create new containers.

flutter: Provider<RemoteStore> not found for LauncherWizard
flutter: #0      Provider._inheritedElementOf (package:provider/src/provider.dart:343)
flutter: #1      SelectContext.select (package:provider/src/inherited_provider.dart:272)
flutter: #2      _LauncherWizardState.build (package:workshops/launcher/launcher_wizard.dart:58)
flutter: #3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4992)
flutter: #4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4878)
flutter: #5      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050)
flutter: #6      Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #7      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #8      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:5041)
flutter: #9      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #10     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #11     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #12     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904)
flutter: #13     Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #14     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #15     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #16     _InheritedProviderScopeElement.mount (package:provider/src/inherited_provider.dart:411)
flutter: #17     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #18     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #19     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904)
flutter: #20     Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #21     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #22     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #23     SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222)
flutter: #24     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #25     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #26     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904)
flutter: #27     Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #28     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #29     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #30     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #31     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #32     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904)
flutter: #33     Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #34     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #35     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #36     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #37     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #38     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904)
flutter: #39     Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #40     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #41     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #42     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #43     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #44     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904)
flutter: #45     Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #46     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #47     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #48     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #49     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #50     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6300)
flutter: #51     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #52     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #53     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904)
flutter: #54     Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #55     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #56     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #57     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #58     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #59     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904)
flutter: #60     Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #61     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #62     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #63     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #64     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #65     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6300)
flutter: #66     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #67     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #68     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904)
flutter: #69     Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #70     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #71     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #72     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #73     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #74     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6300)
flutter: #75     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #76     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #77     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904)
flutter: #78     Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #79     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #80     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #81     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #82     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #83     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6300)
flutter: #84     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #85     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #86     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6300)
flutter: #87     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #88     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #89     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904)
flutter: #90     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050)
flutter: #91     Element.rebuild (package:flutter/src/widgets/framework.dart:4604)
flutter: #92     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4859)
flutter: #93     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:5041)
flutter: #94     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853)
flutter: #95     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #96     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)
flutter: #97     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6300)
flutter: #98     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863)
flutter: #99     Element.updateChild (package:flutter/src/widgets/framework.dart:3592)

I can also see from the grey error state of the app window that the failing component is the launch wizard overlay, since the list of containers and associated controls are faintly visible in the background.

image

New image creation dialog: inconsistent dropdown behavior

When creating a new image and selecting a 'desktop' variant in the dropdown menu the 'type' dropdown keeps its value ('container') but changes it's color, indicating that this option isn't available for desktop images. However, re-selecting 'container' as a type automatically changes the variant back to 'default'. Also, it is possible to simply click 'continue' with a disabled container type selected.

I'd expect:

  • the 'continue' button to be disabled as long as an invalid combination of values is selected in the dropdowns
  • invalid dropdown options to be automatically changed to whatever is possible (i.e. automatically select 'virtual machine' when the 'desktop' variant is chosen)
2022-11-21.10-47-13.mp4

OS logos

  • a few (svg) logos are missing (busybox, funtoo, plamo, springdale)
  • some logos don't look good on a dark background (aws, pld, ...)

light
dark

When LXD is not installed

When LXD is not installed, the app should present an error screen with a nice human-readable error description together with installation instructions.

Analyzer 5.2.0 breaks MockAssetBundle

$ flutter test
00:01 +0: loading /home/jpnurmi/Projects/canonical/workshops/packages/os_logo/test/os_logo_test.dart                                                                                        test/os_logo_test.mocks.dart:56:23: Error: The return type of the method 'MockAssetBundle.loadBuffer' is 'Future<dynamic>', which does not match the return type, 'Future<ImmutableBuffer>',
of the overridden method, 'AssetBundle.loadBuffer'.
 - 'Future' is from 'dart:async'.
 - 'ImmutableBuffer' is from 'dart:ui'.
Change to a subtype of 'Future<ImmutableBuffer>'.
  _i4.Future<dynamic> loadBuffer(String? key) => (super.noSuchMethod(
                      ^
../../../../../.fvm/versions/stable/packages/flutter/lib/src/services/asset_bundle.dart:64:30: Context: This is the overridden method ('loadBuffer').
  Future<ui.ImmutableBuffer> loadBuffer(String key) async {
                             ^
00:04 +0 -1: loading /home/jpnurmi/Projects/canonical/workshops/packages/os_logo/test/os_logo_test.dart [E]                                                                                 
  Failed to load "/home/jpnurmi/Projects/canonical/workshops/packages/os_logo/test/os_logo_test.dart": Compilation failed for testPath=/home/jpnurmi/Projects/canonical/workshops/packages/os_logo/test/os_logo_test.dart

To run this test again: /home/jpnurmi/.fvm/versions/stable/bin/cache/dart-sdk/bin/dart test /home/jpnurmi/Projects/canonical/workshops/packages/os_logo/test/os_logo_test.dart -p vm --plain-name 'loading /home/jpnurmi/Projects/canonical/workshops/packages/os_logo/test/os_logo_test.dart'
00:04 +0 -1: Some tests failed.
diff --git a/packages/os_logo/test/os_logo_test.mocks.dart b/packages/os_logo/test/os_logo_test.mocks.dart
index 39f201f..50ed777 100644
--- a/packages/os_logo/test/os_logo_test.mocks.dart
+++ b/packages/os_logo/test/os_logo_test.mocks.dart
@@ -3,11 +3,10 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i5;
+import 'dart:async' as _i4;
 import 'dart:typed_data' as _i2;
-import 'dart:ui' as _i3;
 
-import 'package:flutter/src/services/asset_bundle.dart' as _i4;
+import 'package:flutter/src/services/asset_bundle.dart' as _i3;
 import 'package:mockito/mockito.dart' as _i1;
 
 // ignore_for_file: type=lint
@@ -31,57 +30,38 @@ class _FakeByteData_0 extends _i1.SmartFake implements _i2.ByteData {
         );
 }
 
-class _FakeImmutableBuffer_1 extends _i1.SmartFake
-    implements _i3.ImmutableBuffer {
-  _FakeImmutableBuffer_1(
-    Object parent,
-    Invocation parentInvocation,
-  ) : super(
-          parent,
-          parentInvocation,
-        );
-}
-
 /// A class which mocks [AssetBundle].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockAssetBundle extends _i1.Mock implements _i4.AssetBundle {
+class MockAssetBundle extends _i1.Mock implements _i3.AssetBundle {
   MockAssetBundle() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i5.Future<_i2.ByteData> load(String? key) => (super.noSuchMethod(
+  _i4.Future<_i2.ByteData> load(String? key) => (super.noSuchMethod(
         Invocation.method(
           #load,
           [key],
         ),
-        returnValue: _i5.Future<_i2.ByteData>.value(_FakeByteData_0(
+        returnValue: _i4.Future<_i2.ByteData>.value(_FakeByteData_0(
           this,
           Invocation.method(
             #load,
             [key],
           ),
         )),
-      ) as _i5.Future<_i2.ByteData>);
+      ) as _i4.Future<_i2.ByteData>);
   @override
-  _i5.Future<_i3.ImmutableBuffer> loadBuffer(String? key) =>
-      (super.noSuchMethod(
+  _i4.Future<dynamic> loadBuffer(String? key) => (super.noSuchMethod(
         Invocation.method(
           #loadBuffer,
           [key],
         ),
-        returnValue:
-            _i5.Future<_i3.ImmutableBuffer>.value(_FakeImmutableBuffer_1(
-          this,
-          Invocation.method(
-            #loadBuffer,
-            [key],
-          ),
-        )),
-      ) as _i5.Future<_i3.ImmutableBuffer>);
+        returnValue: _i4.Future<dynamic>.value(),
+      ) as _i4.Future<dynamic>);
   @override
-  _i5.Future<String> loadString(
+  _i4.Future<String> loadString(
     String? key, {
     bool? cache = true,
   }) =>
@@ -91,12 +71,12 @@ class MockAssetBundle extends _i1.Mock implements _i4.AssetBundle {
           [key],
           {#cache: cache},
         ),
-        returnValue: _i5.Future<String>.value(''),
-      ) as _i5.Future<String>);
+        returnValue: _i4.Future<String>.value(''),
+      ) as _i4.Future<String>);
   @override
-  _i5.Future<T> loadStructuredData<T>(
+  _i4.Future<T> loadStructuredData<T>(
     String? key,
-    _i5.Future<T> Function(String)? parser,
+    _i4.Future<T> Function(String)? parser,
   ) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -106,8 +86,8 @@ class MockAssetBundle extends _i1.Mock implements _i4.AssetBundle {
             parser,
           ],
         ),
-        returnValue: _i5.Future<T>.value(null),
-      ) as _i5.Future<T>);
+        returnValue: _i4.Future<T>.value(null),
+      ) as _i4.Future<T>);
   @override
   void evict(String? key) => super.noSuchMethod(
         Invocation.method(

Quick launch dropdown menu

The "quick launch" dropdown menu doesn't work very well with lots of instances. Especially, the Preferences item is problematic at the bottom. Could favorites be a solution to this?

quick-launch.webm

Terminal themes

#80 took a step towards dynamic terminal themes. At the moment, there are only two themes defined under the hood and the selection is automatic:

  • ubuntu: aubergine background color
  • others: black background color
Ubuntu Others
Screenshot from 2022-09-19 18-59-45 Screenshot from 2022-09-19 18-59-55

Some ideas to improve it further:

  • low effort: predefined distro-specific background colors (ubuntu aubergine, fedora blue, ...)
  • mid effort: selectable predefined themes (ubuntu, light and dark variants of gnome, dracula, solarized, ...)
  • high effort: freely editable themes (implement theme editor UI)

Image name not used

Steps:

  1. Open Workshops
  2. Add new image ("+" button)
  3. Select Image
  4. Press Continue on Select Features page
  5. Note or provide name name, select OK

Expected result:
Image is created with image name from step 5 above.

Observed result:
Image is created with random name.

Tooltip delay

Flutter tooltips are pretty aggressive by default. We could set TooltipThemeData.waitDuration for the whole app.

Screencast.from.2022-12-13.16-41-18.webm

The GNOME screen recorder refused to record the cursor and Kooha refused to record anything at all, so no mouse cursor was recorded this time but imagine it's there... ๐Ÿคฃ

Terminal eats tab navigation shortcuts

Ctrl+PageDn and Ctrl+PageUp are supposed to switch to the next or previous tab, respectively. These no longer work if there's an open terminal in any tab but only if all are showing the home page.

Screencast.from.2022-10-10.08-19-30.webm

Ref: #108

Wayland support

Proxying the Wayland socket is problematic because:

  • The Wayland socket must be $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY (or $XDG_RUNTIME_DIR/wayland-0).
  • According to the specs, files in $XDG_RUNTIME_DIR must not survive a reboot.
devices:
  wayland:
    bind: instance
    connect: unix:/run/user/1000/wayland-0
    gid: "1000"
    listen: unix:/run/user/1000/wayland-0
    security.gid: "1000"
    security.uid: "1000"
    type: proxy
    uid: "1000"

After reboot:

Error occurred when starting proxy device: Error: Failed to listen on /run/user/1000/wayland-0: listen unix /run/user/1000/wayland-0: bind: no such file or directory

Click area for close/stop image is small

The click area for close/stop image is small, if you are a few pixels off then you accidentally select that image and log into it. Suggest using the whole end of the row as a click area or at least make it not log in if clicked in that area.

workshops snap cannot be seeded

I had trouble adding workshops as a pre-installed snap to an Ubuntu Core image: with it included, the system fails to complete the seeding process.

The cause seems to be this plug on the snap:

# this is not used or needed for anything other than to trigger automatic
# installation of the lxd snap via "default-provider: lxd"
plugs:
foo-install-lxd:
default-provider: lxd
interface: content
content: foo
target: $SNAP_DATA/foo

While all the prerequisite snaps were also included in the image, the lxd snap doesn't include a matching plug here. Upgrading lxd from the store doesn't change this, so it never installs workshops. As the system hasn't completed seeding, this causes a bunch of follow-on problems for the system.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.