diff --git a/satellite/console/consoleweb/server.go b/satellite/console/consoleweb/server.go
index 77e1fa944..e80ed10cc 100644
--- a/satellite/console/consoleweb/server.go
+++ b/satellite/console/consoleweb/server.go
@@ -94,7 +94,7 @@ type Config struct {
PathwayOverviewEnabled bool `help:"indicates if the overview onboarding step should render with pathways" default:"true"`
NewProjectDashboard bool `help:"indicates if new project dashboard should be used" default:"false"`
NewNavigation bool `help:"indicates if new navigation structure should be rendered" default:"true"`
- NewObjectsFlow bool `help:"indicates if new objects flow should be used" default:"true"`
+ NewObjectsFlow bool `help:"indicates if new objects flow should be used" default:"false"`
NewAccessGrantFlow bool `help:"indicates if new access grant flow should be used" default:"false"`
GeneratedAPIEnabled bool `help:"indicates if generated console api should be used" default:"false"`
InactivityTimerEnabled bool `help:"indicates if session can be timed out due inactivity" default:"false"`
diff --git a/scripts/testdata/satellite-config.yaml.lock b/scripts/testdata/satellite-config.yaml.lock
index 1c999b9ce..0319f6d76 100755
--- a/scripts/testdata/satellite-config.yaml.lock
+++ b/scripts/testdata/satellite-config.yaml.lock
@@ -242,7 +242,7 @@ compensation.withheld-percents: 75,75,75,50,50,50,25,25,25,0,0,0,0,0,0
# console.new-navigation: true
# indicates if new objects flow should be used
-# console.new-objects-flow: true
+# console.new-objects-flow: false
# indicates if new project dashboard should be used
# console.new-project-dashboard: false
diff --git a/testsuite/ui/satellite/browser_test.go b/testsuite/ui/satellite/browser_test.go
index 479f280fc..c7674aa2c 100644
--- a/testsuite/ui/satellite/browser_test.go
+++ b/testsuite/ui/satellite/browser_test.go
@@ -28,11 +28,15 @@ func TestBrowser_Features(t *testing.T) {
// Navigate into browser with new onboarding.
page.MustElementR("a", "Skip and go directly to dashboard").MustClick()
page.MustElementR("p", "Buckets").MustClick()
- wait := page.MustWaitRequestIdle()
- page.MustElementR("p", "demo-bucket").MustClick()
- wait()
+ page.MustElementR("[aria-roledescription=title]", "Create a bucket")
+ page.MustElementR("span", "Continue").MustClick()
+ waitVueTick(page)
+ page.MustElementR("[aria-roledescription=title]", "Encrypt your bucket")
+ page.MustElementR("span", "Continue").MustClick()
+ waitVueTick(page)
+ page.MustElementR("[aria-roledescription=title]", "Generate a passphrase")
page.MustElementR("label", "I understand, and I have saved the passphrase.").MustClick()
- page.MustElementR("span", "Next >").MustClick()
+ page.MustElementR("span", "Continue").MustClick()
// Verify that browser component has loaded and that the dropzone is present.
page.MustElementR("p", "Drop Files Here to Upload")
@@ -64,6 +68,7 @@ func TestBrowser_Features(t *testing.T) {
page.MustElementR("button", "Cancel").MustClick()
// Add a file into folder and check that dropzone is still visible.
+ page.MustElementR("button", "Upload").MustClick()
wait1 := page.MustWaitRequestIdle()
page.MustElement("input[aria-roledescription=file-upload]").MustSetFiles("./testdata/img.png")
wait1()
@@ -74,7 +79,7 @@ func TestBrowser_Features(t *testing.T) {
// Click on the file name.
page.MustElementR("[aria-roledescription=file]", "img.png").MustClick()
- require.Contains(t, page.MustElement("[aria-roledescription=image-preview]").MustProperty("src").Str(), "img.png", "The modal did not open on file click")
+ page.MustElement("[aria-roledescription=image-preview]")
// Share a file.
page.MustElementR("span", "Share").MustClick()
@@ -90,7 +95,7 @@ func TestBrowser_Features(t *testing.T) {
// Click on the hamburger and then details.
page.MustElement("button[aria-roledescription=dropdown]").MustClick()
page.MustElementR("button", "Details").MustClick()
- require.Contains(t, page.MustElement("[aria-roledescription=image-preview]").MustProperty("src").Str(), "img.png", "The dropdown details functionality is not working")
+ page.MustElement("[aria-roledescription=image-preview]")
page.MustElementR("span", "Share").MustClick()
page.MustElement("#generateShareLink")
page.MustElement("#close-modal").MustClick()
@@ -106,6 +111,7 @@ func TestBrowser_Features(t *testing.T) {
page.MustElementR("[aria-roledescription=folder]", "go-rod-test3")
// Add two files.
+ page.MustElementR("button", "Upload").MustClick()
page.MustElement("input[aria-roledescription=file-upload]").MustSetFiles("./testdata/img2.png")
page.MustElement("#close-modal").MustClick()
page.MustElement("input[aria-roledescription=file-upload]").MustSetFiles("./testdata/img.png")
@@ -225,6 +231,7 @@ func TestBrowser_Features(t *testing.T) {
page.MustElementR("[aria-roledescription=folder]", "Свобода")
// upload a video.
+ page.MustElementR("button", "Upload").MustClick()
wait3 := page.MustWaitRequestIdle()
page.MustElement("input[aria-roledescription=file-upload]").MustSetFiles("./testdata/movie.mp4")
wait3()
@@ -234,7 +241,7 @@ func TestBrowser_Features(t *testing.T) {
page.MustElementR("[aria-roledescription=file-size]", "1.48 kB")
page.MustElement("[aria-roledescription=file-upload-date]")
page.MustElementR("[aria-roledescription=file]", "movie.mp4").MustClick()
- require.Contains(t, page.MustElement("[aria-roledescription=video-preview]").MustProperty("src").Str(), "movie.mp4", "The modal did not open on video file click")
+ page.MustElement("[aria-roledescription=video-preview]")
page.MustElement("#close-modal").MustClick()
// Upload an audio file.
@@ -242,7 +249,7 @@ func TestBrowser_Features(t *testing.T) {
page.MustElement("input[aria-roledescription=file-upload]").MustSetFiles("./testdata/audio.mp3")
wait4()
page.MustElementR("[aria-roledescription=file]", "audio.mp3").MustClick()
- require.Contains(t, page.MustElement("[aria-roledescription=audio-preview]").MustProperty("src").Str(), "audio.mp3", "The modal did not open on video file click")
+ page.MustElement("[aria-roledescription=audio-preview]")
page.MustElement("#close-modal").MustClick()
// Navigate out of nested folder and delete everything.
@@ -266,11 +273,15 @@ func TestBrowser_FolderAndDifferentFileSizesUpload(t *testing.T) {
// Navigate into browser with new onboarding.
page.MustElementR("a", "Skip and go directly to dashboard").MustClick()
page.MustElementR("p", "Buckets").MustClick()
- wait := page.MustWaitRequestIdle()
- page.MustElementR("p", "demo-bucket").MustClick()
- wait()
+ page.MustElementR("[aria-roledescription=title]", "Create a bucket")
+ page.MustElementR("span", "Continue").MustClick()
+ waitVueTick(page)
+ page.MustElementR("[aria-roledescription=title]", "Encrypt your bucket")
+ page.MustElementR("span", "Continue").MustClick()
+ waitVueTick(page)
+ page.MustElementR("[aria-roledescription=title]", "Generate a passphrase")
page.MustElementR("label", "I understand, and I have saved the passphrase.").MustClick()
- page.MustElementR("span", "Next >").MustClick()
+ page.MustElementR("span", "Continue").MustClick()
// Verify that browser component has loaded and that the dropzone is present.
page.MustElementR("p", "Drop Files Here to Upload")
@@ -307,6 +318,7 @@ func TestBrowser_FolderAndDifferentFileSizesUpload(t *testing.T) {
require.Equal(t, " ", page.MustElement("[placeholder=\"Name of the folder\"]").MustText(), "Folder input does not contain the empty invalid name")
page.MustElementR("button", "Cancel").MustClick()
+ page.MustElementR("button", "Upload").MustClick()
wait1 := page.MustWaitRequestIdle()
page.MustElement("input[aria-roledescription=file-upload]").MustSetFiles("./testdata/test0bytes.txt")
wait1()
@@ -315,6 +327,7 @@ func TestBrowser_FolderAndDifferentFileSizesUpload(t *testing.T) {
page.MustElementR("[aria-roledescription=file]", "test0bytes.txt").MustClick()
require.Contains(t, page.MustElement("[aria-roledescription=preview-placeholder]").String(), "svg", "The modal did not open upon clicking the test0bytes.txt file")
} else {
+ page.MustElementR("button", "Upload").MustClick()
wait2 := page.MustWaitRequestIdle()
page.MustElement("input[aria-roledescription=folder-upload]").MustSetFiles("./testdata")
wait2()
@@ -345,6 +358,7 @@ func TestBrowser_FolderAndDifferentFileSizesUpload(t *testing.T) {
require.Equal(t, " ", page.MustElement("[placeholder=\"Name of the folder\"]").MustText(), "Folder input does not contain the empty invalid name")
page.MustElementR("button", "Cancel").MustClick()
+ page.MustElementR("button", "Upload").MustClick()
wait3 := page.MustWaitRequestIdle()
page.MustElement("input[aria-roledescription=file-upload]").MustSetFiles("./testdata/test0bytes.txt")
wait3()
@@ -353,11 +367,13 @@ func TestBrowser_FolderAndDifferentFileSizesUpload(t *testing.T) {
page.MustElementR("[aria-roledescription=file]", "test0bytes.txt").MustClick()
require.Contains(t, page.MustElement("[aria-roledescription=preview-placeholder]").String(), "svg", "The modal did not open upon clicking the test0bytes.txt file")
} else {
+ page.MustElementR("button", "Upload").MustClick()
wait4 := page.MustWaitRequestIdle()
page.MustElement("input[aria-roledescription=folder-upload]").MustSetFiles("./testdata")
wait4()
page.MustElementR("table > tbody > tr:nth-child(1) > td", "..")
page.MustElementR("[aria-roledescription=folder]", "testdata \\(1\\)").MustClick()
+ waitVueTick(page)
page.MustElementR("[aria-roledescription=file]", "test0bytes.txt").MustClick()
require.Contains(t, page.MustElement("[aria-roledescription=preview-placeholder]").String(), "svg", "The uploaded folder did not upload the files correctly")
}
@@ -366,6 +382,7 @@ func TestBrowser_FolderAndDifferentFileSizesUpload(t *testing.T) {
page.MustElement("#navigate-back").MustClick()
// Upload a 0 byte file.
+ page.MustElementR("button", "Upload").MustClick()
page.MustElement("input[aria-roledescription=file-upload]").MustSetFiles("./testdata/test0bytes.txt")
page.MustElementR("span", "testing/test0bytes.txt")
page.MustElement("#close-modal").MustClick()
@@ -382,7 +399,7 @@ func TestBrowser_FolderAndDifferentFileSizesUpload(t *testing.T) {
if !testing.Short() {
slowpage := page.Sleeper(uitest.MaxDuration(20 * time.Second))
- // Upload a 50 MB file.
+ // Upload a 5 MB file.
testFile := generateEmptyFile(t, ctx, "testFile", 5*memory.MiB)
wait5 := slowpage.MustWaitRequestIdle()
slowpage.MustElement("input[aria-roledescription=file-upload]").MustSetFiles(testFile)
@@ -403,6 +420,7 @@ func TestBrowser_FolderAndDifferentFileSizesUpload(t *testing.T) {
slowpage.MustElement("#close-modal").MustClick()
// Upload a 130MB file.
+ page.MustElementR("button", "Upload").MustClick()
wait6 := slowpage.MustWaitRequestIdle()
slowpage.MustElement("input[aria-roledescription=file-upload]").MustSetFiles(testFile2)
require.Equal(t, " testing/testFile2", slowpage.MustElement("[aria-roledescription=file-uploading]").MustText(), "The testFile2 file has not started uploading")
diff --git a/testsuite/ui/satellite/onboarding_test.go b/testsuite/ui/satellite/onboarding_test.go
index 949d8d943..f41afce1c 100644
--- a/testsuite/ui/satellite/onboarding_test.go
+++ b/testsuite/ui/satellite/onboarding_test.go
@@ -29,25 +29,26 @@ func TestOnboarding_WizardBrowser(t *testing.T) {
// Buckets Page
bucketsTitle := page.MustElement("[aria-roledescription=title]").MustText()
- require.Contains(t, bucketsTitle, "Buckets")
- page.Race().ElementR("p", "demo-bucket").MustHandle(func(el *rod.Element) {
- el.MustClick()
- waitVueTick(page)
- }).MustDo()
-
- // Passphrase screen
- encryptionTitle := page.MustElement("[aria-roledescription=objects-title]").MustText()
- require.Contains(t, encryptionTitle, "The object browser uses server side encryption.")
- customPassphrase := page.MustElement("[aria-roledescription=enter-passphrase-label]")
- customPassphraseLabel := customPassphrase.MustText()
- require.Contains(t, customPassphraseLabel, "Enter your own passphrase")
- customPassphrase.MustClick()
+ require.Contains(t, bucketsTitle, "Create a bucket")
+ page.MustElementR("[aria-roledescription=title]", "Create a bucket")
+ page.MustElementR("span", "Continue").MustClick()
waitVueTick(page)
- page.MustElement("[aria-roledescription=passphrase] input").MustInput("password123")
- page.MustElement(".checkmark").MustClick()
+ page.MustElementR("[aria-roledescription=title]", "Encrypt your bucket")
+ page.MustElementR("span", "Continue").MustClick()
waitVueTick(page)
- page.MustElementX("(//span[text()=\"Next >\"])").MustClick()
+ page.MustElementR("[aria-roledescription=title]", "Generate a passphrase")
+ mnemonic := page.MustElement("[aria-roledescription=mnemonic]").MustText()
+ require.NotEmpty(t, mnemonic)
+ page.MustElementR("span", "Back").MustClick()
waitVueTick(page)
+ page.MustElementR("[aria-roledescription=title]", "Encrypt your bucket")
+ page.MustElement("[aria-roledescription=manual]").MustClick()
+ page.MustElementR("span", "Continue").MustClick()
+ waitVueTick(page)
+ page.MustElementR("[aria-roledescription=title]", "Enter a passphrase")
+ page.MustElement("[aria-roledescription=passphrase] input").MustInput("1")
+ page.MustElementR("label", "I understand, and I have saved the passphrase.").MustClick()
+ page.MustElementR("span", "Continue").MustClick()
// Verify that browser component has loaded and that the dropzone is present
page.MustElementR("p", "Drop Files Here to Upload")
diff --git a/web/satellite/src/components/common/HeaderedInput.vue b/web/satellite/src/components/common/HeaderedInput.vue
index 64fd73cce..c0353d8ac 100644
--- a/web/satellite/src/components/common/HeaderedInput.vue
+++ b/web/satellite/src/components/common/HeaderedInput.vue
@@ -58,9 +58,8 @@ import HeaderlessInput from './HeaderlessInput.vue';
ErrorIcon,
},
})
+// TODO: merge these two components to have one single source of truth.
export default class HeaderedInput extends HeaderlessInput {
- @Prop({default: ''})
- private readonly initValue: string;
@Prop({default: ''})
private readonly additionalLabel: string;
@Prop({default: 0})
@@ -73,10 +72,6 @@ export default class HeaderedInput extends HeaderlessInput {
private readonly isMultiline: boolean;
@Prop({default: false})
private readonly isLoading: boolean;
-
- public created() {
- this.setValue(this.initValue);
- }
}
diff --git a/web/satellite/src/components/common/HeaderlessInput.vue b/web/satellite/src/components/common/HeaderlessInput.vue
index 09e11f1e5..1236af7f8 100644
--- a/web/satellite/src/components/common/HeaderlessInput.vue
+++ b/web/satellite/src/components/common/HeaderlessInput.vue
@@ -78,8 +78,10 @@ export default class HeaderlessInput extends Vue {
private type: string = this.textType;
private isPasswordShown = false;
+ public value: string;
+
@Prop({default: ''})
- protected value: string;
+ protected readonly initValue: string;
@Prop({default: ''})
protected readonly label: string;
@@ -111,6 +113,7 @@ export default class HeaderlessInput extends Vue {
public created() {
this.type = this.isPassword ? this.passwordType : this.textType;
+ this.value = this.initValue;
}
/**
diff --git a/web/satellite/src/components/objects/BucketCreation.vue b/web/satellite/src/components/objects/BucketCreation.vue
new file mode 100644
index 000000000..c8a266e18
--- /dev/null
+++ b/web/satellite/src/components/objects/BucketCreation.vue
@@ -0,0 +1,203 @@
+// Copyright (C) 2022 Storj Labs, Inc.
+// See LICENSE for copying information.
+
+
+
+ Encrypt your bucket
+
+ We encourage you to generate the encryption passphrase.
+ You can also enter your own passphrase for this bucket.
+ Automatically generate 12-word passphrase. You can also enter your own passphrase.
+ {{ generationStep === GenerationSteps.Generation ? 'Generate a passphrase' : 'Enter a passphrase' }}
+
+ Please note that Storj does not know or store your encryption passphrase.
+ If you lose it, you will not be able to recover your files.
+ {{ passphrase }}
+ Create a bucket
+
+ Buckets are used to store your files. It’s recommended that every bucket should have it’s own encryption passphrase.
+ Generate passphrase
+ Enter passphrase
+ Bucket
+
+ Encryption
+
+ Upload
+