diff --git a/web/multinode/src/app/components/common/PagesBlock.vue b/web/multinode/src/app/components/common/PagesBlock.vue new file mode 100644 index 000000000..c7335199b --- /dev/null +++ b/web/multinode/src/app/components/common/PagesBlock.vue @@ -0,0 +1,65 @@ +// Copyright (C) 2019 Storj Labs, Inc. +// See LICENSE for copying information. + + + + + + diff --git a/web/multinode/src/app/components/common/VPagination.vue b/web/multinode/src/app/components/common/VPagination.vue new file mode 100644 index 000000000..24e67eb45 --- /dev/null +++ b/web/multinode/src/app/components/common/VPagination.vue @@ -0,0 +1,316 @@ +// Copyright (C) 2019 Storj Labs, Inc. +// See LICENSE for copying information. + + + + + + diff --git a/web/multinode/src/app/components/navigation/NavigationArea.vue b/web/multinode/src/app/components/navigation/NavigationArea.vue index d7b6b729d..d3667e99f 100644 --- a/web/multinode/src/app/components/navigation/NavigationArea.vue +++ b/web/multinode/src/app/components/navigation/NavigationArea.vue @@ -54,7 +54,8 @@ export default class NavigationArea extends Vue { * Array of navigation links with icons. */ public readonly navigation: NavigationLink[] = [ - new NavigationLink('My Nodes', RouterConfig.MyNodes.path, MyNodesIcon), + new NavigationLink(RouterConfig.MyNodes.name, RouterConfig.MyNodes.path, MyNodesIcon), + new NavigationLink(RouterConfig.Wallets.name, RouterConfig.Wallets.with(RouterConfig.WalletsSummary).path, PayoutsIcon), new NavigationLink(RouterConfig.Payouts.name, RouterConfig.Payouts.path, PayoutsIcon), new NavigationLink(RouterConfig.Bandwidth.name, RouterConfig.Bandwidth.path, TrafficIcon), new NavigationLink('Reputation', '/reputation', ReputationIcon), diff --git a/web/multinode/src/app/components/payouts/PayoutPeriodCalendarButton.vue b/web/multinode/src/app/components/payouts/PayoutPeriodCalendarButton.vue index 3290c318b..e7b382571 100644 --- a/web/multinode/src/app/components/payouts/PayoutPeriodCalendarButton.vue +++ b/web/multinode/src/app/components/payouts/PayoutPeriodCalendarButton.vue @@ -22,7 +22,7 @@ import PayoutPeriodCalendar from './PayoutPeriodCalendar.vue'; @Component({ components: { PayoutPeriodCalendar }, }) -export default class Payout extends Vue { +export default class PayoutPeriodCalendarButton extends Vue { @Prop({default: ''}) public period: string; diff --git a/web/multinode/src/app/components/wallets/tables/walletDetails/WalletDetailsTable.vue b/web/multinode/src/app/components/wallets/tables/walletDetails/WalletDetailsTable.vue new file mode 100644 index 000000000..c2c2f414f --- /dev/null +++ b/web/multinode/src/app/components/wallets/tables/walletDetails/WalletDetailsTable.vue @@ -0,0 +1,28 @@ +// Copyright (C) 2021 Storj Labs, Inc. +// See LICENSE for copying information. + + + + diff --git a/web/multinode/src/app/components/wallets/tables/walletsSummary/WalletsTable.vue b/web/multinode/src/app/components/wallets/tables/walletsSummary/WalletsTable.vue new file mode 100644 index 000000000..ac9c92514 --- /dev/null +++ b/web/multinode/src/app/components/wallets/tables/walletsSummary/WalletsTable.vue @@ -0,0 +1,135 @@ +// Copyright (C) 2021 Storj Labs, Inc. +// See LICENSE for copying information. + + + + + + diff --git a/web/multinode/src/app/router/index.ts b/web/multinode/src/app/router/index.ts index 1aa1ec7bb..29d6b9af3 100644 --- a/web/multinode/src/app/router/index.ts +++ b/web/multinode/src/app/router/index.ts @@ -7,10 +7,13 @@ import { Component } from 'vue-router/types/router'; import AddFirstNode from '@/app/views/AddFirstNode.vue'; import BandwidthPage from '@/app/views/bandwidth/BandwidthPage.vue'; import Dashboard from '@/app/views/Dashboard.vue'; -import MyNodes from '@/app/views/MyNodes.vue'; -import PayoutsByNode from '@/app/views/PayoutsByNode.vue'; -import PayoutsPage from '@/app/views/PayoutsPage.vue'; -import PayoutsRoot from '@/app/views/PayoutsRoot.vue'; +import MyNodes from '@/app/views/myNodes/MyNodes.vue'; +import PayoutsByNode from '@/app/views/payouts/PayoutsByNode.vue'; +import PayoutsPage from '@/app/views/payouts/PayoutsPage.vue'; +import PayoutsRoot from '@/app/views/payouts/PayoutsRoot.vue'; +import WalletDetailsPage from '@/app/views/wallets/WalletDetailsPage.vue'; +import WalletsPage from '@/app/views/wallets/WalletsPage.vue'; +import WalletsRoot from '@/app/views/wallets/WalletsRoot.vue'; import WelcomeScreen from '@/app/views/WelcomeScreen.vue'; /** @@ -62,10 +65,17 @@ export class Route { return this; } + /** + * indicates if this route is a child route. + */ public isChild(): boolean { return this.path[0] !== '/'; } + /** + * combines child route with its ancestor. + * @param child + */ public with(child: Route): Route { if (!child.isChild()) { throw new Error('provided child root is not defined'); @@ -81,12 +91,19 @@ export class Route { export class Config { public static Root: Route = new Route('/', 'Root', Dashboard, {requiresAuth: true}); public static Welcome: Route = new Route('/welcome', 'Welcome', WelcomeScreen); + // nodes. public static AddFirstNode: Route = new Route('/add-first-node', 'AddFirstNode', AddFirstNode); public static MyNodes: Route = new Route('/my-nodes', 'MyNodes', MyNodes); + // payouts. public static PayoutsSummary: Route = new Route('summary', 'PayoutsSummary', PayoutsPage); public static PayoutsByNode: Route = new Route('by-node/:id', 'PayoutsByNode', PayoutsByNode); public static Payouts: Route = new Route('/payouts', 'Payouts', PayoutsRoot, undefined, Config.PayoutsSummary); + // bandwidth and disk. public static Bandwidth: Route = new Route('/bandwidth', 'Bandwidth & Disk', BandwidthPage); + // wallets. + public static WalletsSummary: Route = new Route('summary', 'WalletsSummary', WalletsPage); + public static WalletDetails: Route = new Route('details/:address', 'WalletDetails', WalletDetailsPage); + public static Wallets: Route = new Route('/wallets', 'Wallets', WalletsRoot, undefined, Config.WalletsSummary); public static mode: RouterMode = 'history'; public static routes: Route[] = [ @@ -96,6 +113,10 @@ export class Config { Config.PayoutsByNode, Config.PayoutsSummary, ]), + Config.Wallets.addChildren([ + Config.WalletDetails, + Config.WalletsSummary, + ]), Config.Bandwidth, ]), Config.Welcome, diff --git a/web/multinode/src/app/types/pagination.ts b/web/multinode/src/app/types/pagination.ts new file mode 100644 index 000000000..a1bd47ecd --- /dev/null +++ b/web/multinode/src/app/types/pagination.ts @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Storj Labs, Inc. +// See LICENSE for copying information. + +export type OnPageClickCallback = (search: number) => Promise; + +export type CheckSelected = (index: number) => boolean; + +/** + * Describes paginator page. + */ +export class Page { + private readonly pageIndex: number = 1; + private readonly onClick: OnPageClickCallback; + + constructor(index: number, callback: OnPageClickCallback) { + this.pageIndex = index; + this.onClick = callback; + } + + public get index() { + return this.pageIndex; + } + + public async select(): Promise { + await this.onClick(this.pageIndex); + } +} diff --git a/web/multinode/src/app/views/MyNodes.vue b/web/multinode/src/app/views/myNodes/MyNodes.vue similarity index 100% rename from web/multinode/src/app/views/MyNodes.vue rename to web/multinode/src/app/views/myNodes/MyNodes.vue diff --git a/web/multinode/src/app/views/PayoutsByNode.vue b/web/multinode/src/app/views/payouts/PayoutsByNode.vue similarity index 100% rename from web/multinode/src/app/views/PayoutsByNode.vue rename to web/multinode/src/app/views/payouts/PayoutsByNode.vue diff --git a/web/multinode/src/app/views/PayoutsPage.vue b/web/multinode/src/app/views/payouts/PayoutsPage.vue similarity index 100% rename from web/multinode/src/app/views/PayoutsPage.vue rename to web/multinode/src/app/views/payouts/PayoutsPage.vue diff --git a/web/multinode/src/app/views/PayoutsRoot.vue b/web/multinode/src/app/views/payouts/PayoutsRoot.vue similarity index 100% rename from web/multinode/src/app/views/PayoutsRoot.vue rename to web/multinode/src/app/views/payouts/PayoutsRoot.vue diff --git a/web/multinode/src/app/views/wallets/WalletDetailsPage.vue b/web/multinode/src/app/views/wallets/WalletDetailsPage.vue new file mode 100644 index 000000000..765b8c7f3 --- /dev/null +++ b/web/multinode/src/app/views/wallets/WalletDetailsPage.vue @@ -0,0 +1,205 @@ +// Copyright (C) 2021 Storj Labs, Inc. +// See LICENSE for copying information. + + + + + + diff --git a/web/multinode/src/app/views/wallets/WalletsPage.vue b/web/multinode/src/app/views/wallets/WalletsPage.vue new file mode 100644 index 000000000..317acb53a --- /dev/null +++ b/web/multinode/src/app/views/wallets/WalletsPage.vue @@ -0,0 +1,140 @@ +// Copyright (C) 2021 Storj Labs, Inc. +// See LICENSE for copying information. + + + + + + diff --git a/web/multinode/src/app/views/wallets/WalletsRoot.vue b/web/multinode/src/app/views/wallets/WalletsRoot.vue new file mode 100644 index 000000000..8cd11137c --- /dev/null +++ b/web/multinode/src/app/views/wallets/WalletsRoot.vue @@ -0,0 +1,15 @@ +// Copyright (C) 2021 Storj Labs, Inc. +// See LICENSE for copying information. + + + + diff --git a/web/multinode/static/styles/_variables.scss b/web/multinode/static/styles/_variables.scss index 33b28fc28..d47b317bf 100644 --- a/web/multinode/static/styles/_variables.scss +++ b/web/multinode/static/styles/_variables.scss @@ -26,6 +26,7 @@ --c-button-disabled: #dadde5; --c-button-gray: #e7e9eb; --c-payout-period: #444c63; + --wallet-feature-opted-in: #00ce7d; // borders --b-button-white: 1px solid #afb7c1; diff --git a/web/multinode/tests/unit/components/payouts/PayoutsByNodeTable.spec.ts b/web/multinode/tests/unit/components/payouts/PayoutsByNodeTable.spec.ts index 6fe9bed79..34ec65627 100644 --- a/web/multinode/tests/unit/components/payouts/PayoutsByNodeTable.spec.ts +++ b/web/multinode/tests/unit/components/payouts/PayoutsByNodeTable.spec.ts @@ -1,7 +1,6 @@ // Copyright (C) 2021 Storj Labs, Inc. // See LICENSE for copying information. -import Vue from 'vue'; import Vuex from 'vuex'; import PayoutsByNodeTable from '@/app/components/payouts/tables/payoutsByNode/PayoutsByNodeTable.vue'; diff --git a/web/multinode/tests/unit/components/views/PayoutsByNode.spec.ts b/web/multinode/tests/unit/components/views/PayoutsByNode.spec.ts index 014a5dd04..0e1f06440 100644 --- a/web/multinode/tests/unit/components/views/PayoutsByNode.spec.ts +++ b/web/multinode/tests/unit/components/views/PayoutsByNode.spec.ts @@ -4,7 +4,7 @@ import Vuex from 'vuex'; import { Currency } from '@/app/utils/currency'; -import PayoutsByNode from '@/app/views/PayoutsByNode.vue'; +import PayoutsByNode from '@/app/views/payouts/PayoutsByNode.vue'; import { createLocalVue, shallowMount } from '@vue/test-utils'; import store from '../../mock/store'; diff --git a/web/multinode/tests/unit/components/views/PayoutsPage.spec.ts b/web/multinode/tests/unit/components/views/PayoutsPage.spec.ts index 16d88bd5b..822ff33e3 100644 --- a/web/multinode/tests/unit/components/views/PayoutsPage.spec.ts +++ b/web/multinode/tests/unit/components/views/PayoutsPage.spec.ts @@ -3,7 +3,7 @@ import Vuex from 'vuex'; -import PayoutsPage from '@/app/views/PayoutsPage.vue'; +import PayoutsPage from '@/app/views/payouts/PayoutsPage.vue'; import { createLocalVue, shallowMount } from '@vue/test-utils'; import store from '../../mock/store';