From 58838f225c8425436b83b4aff98a33ad41218e61 Mon Sep 17 00:00:00 2001 From: Anbraten Date: Wed, 3 Nov 2021 17:40:31 +0100 Subject: [PATCH] Rewrite of WebUI (#245) Rewrite of the UI using Typescript, Vue3, Windicss and Vite. The design should be close to the current one with some changes: - latest pipeline in a sidebar on the right - secrets and registry as part of the repo-settings (secrets and registry entries shouldn't be used as much so they can be "hidden" under settings IMO) - start page shows list of active repositories with button to enable / add new ones (currently you see all repositories and in most cases you only add new repositories once in a while) --- .vscode/launch.json | 18 + .woodpecker/main.yml | 67 +- Makefile | 10 +- server/api/hook.go | 2 +- server/router/router.go | 1 - server/web/web.go | 2 +- web/.babelrc | 16 - web/.eslintignore | 6 + web/.eslintrc.js | 155 +- web/.gitignore | 5 + web/.lesshintrc | 17 - web/.prettierignore | 4 + web/.prettierrc.js | 8 + web/README.md | 57 - web/dist/.gitkeep | 0 web/index.html | 14 + web/package.json | 152 +- web/{src => }/public/favicon.svg | 0 web/src/App.vue | 115 + web/src/assets/logo.svg | 1 + web/src/assets/woodpecker.svg | 3 + web/src/components/atomic/Button.vue | 134 + web/src/components/atomic/DocsLink.vue | 32 + web/src/components/atomic/Icon.vue | 83 + web/src/components/atomic/IconButton.vue | 60 + web/src/components/atomic/ListItem.vue | 32 + .../components/build-feed/BuildFeedItem.vue | 48 + .../build-feed/BuildFeedSidebar.vue | 48 + web/src/components/form/Checkbox.vue | 108 + web/src/components/form/CheckboxesField.vue | 65 + web/src/components/form/InputField.vue | 38 + web/src/components/form/NumberField.vue | 48 + web/src/components/form/RadioField.vue | 105 + web/src/components/form/SelectField.vue | 63 + web/src/components/form/TextField.vue | 74 + web/src/components/form/form.types.ts | 9 + web/src/components/layout/FluidContainer.vue | 13 + web/src/components/layout/Panel.vue | 17 + .../components/layout/header/ActiveBuilds.vue | 72 + web/src/components/layout/header/Navbar.vue | 69 + web/src/components/repo/build/BuildItem.vue | 86 + web/src/components/repo/build/BuildList.vue | 41 + web/src/components/repo/build/BuildLogs.vue | 86 + .../repo/build/BuildProcDuration.vue | 54 + web/src/components/repo/build/BuildProcs.vue | 67 + .../repo/build/BuildRunningIcon.vue | 43 + .../components/repo/build/BuildStatusIcon.vue | 43 + web/src/components/repo/build/build-status.ts | 27 + .../components/repo/settings/ActionsTab.vue | 85 + web/src/components/repo/settings/BadgeTab.vue | 61 + .../components/repo/settings/GeneralTab.vue | 159 + .../repo/settings/RegistriesTab.vue | 130 + .../components/repo/settings/SecretsTab.vue | 163 + web/src/components/tabs/Tab.vue | 51 + web/src/components/tabs/Tabs.vue | 107 + web/src/components/tabs/types.ts | 4 + web/src/compositions/useApiClient.ts | 18 + web/src/compositions/useAsyncAction.ts | 37 + web/src/compositions/useAuthentication.ts | 13 + web/src/compositions/useBuild.ts | 84 + web/src/compositions/useBuildFeed.ts | 30 + web/src/compositions/useBuildProc.ts | 48 + web/src/compositions/useConfig.ts | 19 + web/src/compositions/useDarkMode.ts | 43 + web/src/compositions/useElapsedTime.ts | 50 + web/src/compositions/useEvents.ts | 42 + web/src/compositions/useNotifications.ts | 5 + web/src/compositions/useRepoSearch.ts | 27 + web/src/compositions/useUserConfig.ts | 30 + web/src/config/client/index.js | 3 - web/src/config/client/inject.js | 36 - web/src/config/state.js | 78 - web/src/index.html | 12 - web/src/index.js | 14 - web/src/lib/api/client.ts | 136 + web/src/lib/api/index.ts | 141 + web/src/lib/api/types/build.ts | 124 + web/src/lib/api/types/index.ts | 6 + web/src/lib/api/types/registry.ts | 6 + web/src/lib/api/types/repo.ts | 72 + web/src/lib/api/types/secret.ts | 9 + web/src/lib/api/types/user.ts | 20 + web/src/lib/api/types/webhook.ts | 6 + web/src/main.ts | 18 + web/src/router.ts | 120 + web/src/screens/drone.js | 52 - web/src/screens/drone.less | 15 - web/src/screens/feed/components/index.js | 3 - web/src/screens/feed/components/list.js | 55 - web/src/screens/feed/components/list.less | 67 - web/src/screens/feed/index.js | 192 - web/src/screens/feed/index.less | 70 - web/src/screens/layout.js | 224 - web/src/screens/layout.less | 85 - web/src/screens/login/screens/error/index.js | 34 - .../screens/login/screens/error/index.less | 34 - web/src/screens/login/screens/form/index.js | 21 - web/src/screens/login/screens/form/index.less | 69 - web/src/screens/login/screens/index.js | 4 - web/src/screens/redirect.js | 41 - .../repo/screens/build/components/approval.js | 10 - .../screens/build/components/approval.less | 34 - .../repo/screens/build/components/details.js | 47 - .../screens/build/components/details.less | 34 - .../repo/screens/build/components/elapsed.js | 63 - .../repo/screens/build/components/index.js | 5 - .../repo/screens/build/components/procs.js | 100 - .../repo/screens/build/components/procs.less | 76 - web/src/screens/repo/screens/build/index.js | 256 - web/src/screens/repo/screens/build/index.less | 51 - .../screens/build/logs/components/anchor.js | 15 - .../screens/build/logs/components/anchor.less | 4 - .../screens/build/logs/components/term.js | 93 - .../screens/build/logs/components/term.less | 88 - .../screens/repo/screens/build/logs/index.js | 143 - .../repo/screens/build/logs/index.less | 105 - web/src/screens/repo/screens/build/menu.js | 78 - .../repo/screens/builds/components/index.js | 3 - .../repo/screens/builds/components/list.js | 55 - .../repo/screens/builds/components/list.less | 163 - web/src/screens/repo/screens/builds/header.js | 20 - web/src/screens/repo/screens/builds/index.js | 153 - .../screens/repo/screens/builds/index.less | 28 - web/src/screens/repo/screens/builds/menu.js | 15 - web/src/screens/repo/screens/builds/menu.less | 16 - .../repo/screens/registry/components/form.js | 80 - .../screens/registry/components/form.less | 65 - .../repo/screens/registry/components/index.js | 4 - .../repo/screens/registry/components/list.js | 15 - .../screens/registry/components/list.less | 45 - .../screens/repo/screens/registry/index.js | 103 - .../screens/repo/screens/registry/index.less | 34 - .../repo/screens/secrets/components/form.js | 140 - .../repo/screens/secrets/components/form.less | 121 - .../repo/screens/secrets/components/index.js | 4 - .../repo/screens/secrets/components/list.js | 20 - .../repo/screens/secrets/components/list.less | 65 - web/src/screens/repo/screens/secrets/index.js | 99 - .../screens/repo/screens/secrets/index.less | 34 - .../screens/repo/screens/settings/index.js | 192 - .../screens/repo/screens/settings/index.less | 72 - web/src/screens/titles.js | 29 - .../user/screens/repos/components/index.js | 3 - .../user/screens/repos/components/list.js | 40 - .../user/screens/repos/components/list.less | 39 - .../user/screens/repos/components/switch.js | 13 - .../user/screens/repos/components/switch.less | 62 - web/src/screens/user/screens/repos/index.js | 137 - web/src/screens/user/screens/repos/index.less | 31 - web/src/screens/user/screens/repos/menu.js | 41 - web/src/screens/user/screens/tokens/index.js | 59 - .../screens/user/screens/tokens/index.less | 25 - .../components/__tests__/status.test.js | 32 - web/src/shared/components/avatar.js | 12 - web/src/shared/components/avatar.less | 15 - web/src/shared/components/breadcrumb.js | 21 - web/src/shared/components/breadcrumb.less | 38 - web/src/shared/components/build_event.js | 73 - web/src/shared/components/build_event.less | 34 - web/src/shared/components/build_time.js | 37 - web/src/shared/components/build_time.less | 23 - web/src/shared/components/drawer/drawer.js | 62 - web/src/shared/components/drawer/drawer.less | 182 - web/src/shared/components/duration.js | 10 - web/src/shared/components/icons/back.js | 17 - web/src/shared/components/icons/branch.js | 11 - web/src/shared/components/icons/check.js | 17 - web/src/shared/components/icons/clock.js | 17 - web/src/shared/components/icons/close.js | 17 - web/src/shared/components/icons/commit.js | 16 - web/src/shared/components/icons/deploy.js | 11 - web/src/shared/components/icons/expand.js | 17 - web/src/shared/components/icons/index.js | 45 - web/src/shared/components/icons/launch.js | 12 - web/src/shared/components/icons/link.js | 17 - web/src/shared/components/icons/menu.js | 17 - web/src/shared/components/icons/merge.js | 16 - web/src/shared/components/icons/pause.js | 17 - web/src/shared/components/icons/play.js | 17 - web/src/shared/components/icons/refresh.js | 17 - web/src/shared/components/icons/remove.js | 17 - web/src/shared/components/icons/report.js | 12 - web/src/shared/components/icons/schedule.js | 18 - web/src/shared/components/icons/star.js | 20 - web/src/shared/components/icons/sync.js | 12 - web/src/shared/components/icons/tag.js | 11 - web/src/shared/components/icons/timelapse.js | 17 - web/src/shared/components/logo.js | 17 - web/src/shared/components/menu.js | 32 - web/src/shared/components/menu.less | 65 - web/src/shared/components/snackbar.js | 47 - web/src/shared/components/snackbar.less | 78 - web/src/shared/components/status.js | 100 - web/src/shared/components/status.less | 204 - web/src/shared/components/status_number.js | 12 - web/src/shared/components/status_number.less | 54 - web/src/shared/components/sync.js | 16 - web/src/shared/components/sync.less | 46 - web/src/shared/constants/events.js | 6 - web/src/shared/constants/status.js | 23 - web/src/shared/constants/visibility.js | 5 - web/src/shared/styles/ansi.less | 35 - web/src/shared/styles/colors.less | 12 - web/src/shared/styles/utils.less | 5 - web/src/shared/utils/build.js | 187 - web/src/shared/utils/feed.js | 91 - web/src/shared/utils/logs.js | 49 - web/src/shared/utils/message.js | 22 - web/src/shared/utils/proc.js | 46 - web/src/shared/utils/registry.js | 75 - web/src/shared/utils/repository.js | 186 - web/src/shared/utils/secrets.js | 75 - web/src/shared/utils/users.js | 19 - web/src/store/builds.ts | 99 + web/src/store/repos.ts | 43 + web/src/utils/duration.ts | 42 + web/src/utils/emoji.ts | 5 + web/src/utils/helpers.ts | 66 + web/src/utils/timeAgo.ts | 8 + web/src/views/Login.vue | 69 + web/src/views/NotFound.vue | 14 + web/src/views/RepoAdd.vue | 103 + web/src/views/Repos.vue | 56 + web/src/views/User.vue | 80 + web/src/views/admin/Admin.vue | 24 + web/src/views/repo/RepoBranch.vue | 42 + web/src/views/repo/RepoBranches.vue | 58 + web/src/views/repo/RepoBuild.vue | 246 + web/src/views/repo/RepoBuilds.vue | 28 + web/src/views/repo/RepoSettings.vue | 76 + web/src/views/repo/RepoWrapper.vue | 123 + web/src/vite-env.d.ts | 1 + web/tsconfig.eslint.json | 4 + web/tsconfig.json | 20 + web/vendor/drone-js/index.js | 431 - web/vite.config.ts | 27 + web/webpack.config.js | 160 - web/windi.config.ts | 25 + web/yarn.lock | 8696 +++++------------ 239 files changed, 7765 insertions(+), 13633 deletions(-) delete mode 100644 web/.babelrc create mode 100644 web/.eslintignore create mode 100644 web/.gitignore delete mode 100644 web/.lesshintrc create mode 100644 web/.prettierignore create mode 100644 web/.prettierrc.js delete mode 100644 web/README.md delete mode 100644 web/dist/.gitkeep create mode 100644 web/index.html rename web/{src => }/public/favicon.svg (100%) create mode 100644 web/src/App.vue create mode 100644 web/src/assets/logo.svg create mode 100644 web/src/assets/woodpecker.svg create mode 100644 web/src/components/atomic/Button.vue create mode 100644 web/src/components/atomic/DocsLink.vue create mode 100644 web/src/components/atomic/Icon.vue create mode 100644 web/src/components/atomic/IconButton.vue create mode 100644 web/src/components/atomic/ListItem.vue create mode 100644 web/src/components/build-feed/BuildFeedItem.vue create mode 100644 web/src/components/build-feed/BuildFeedSidebar.vue create mode 100644 web/src/components/form/Checkbox.vue create mode 100644 web/src/components/form/CheckboxesField.vue create mode 100644 web/src/components/form/InputField.vue create mode 100644 web/src/components/form/NumberField.vue create mode 100644 web/src/components/form/RadioField.vue create mode 100644 web/src/components/form/SelectField.vue create mode 100644 web/src/components/form/TextField.vue create mode 100644 web/src/components/form/form.types.ts create mode 100644 web/src/components/layout/FluidContainer.vue create mode 100644 web/src/components/layout/Panel.vue create mode 100644 web/src/components/layout/header/ActiveBuilds.vue create mode 100644 web/src/components/layout/header/Navbar.vue create mode 100644 web/src/components/repo/build/BuildItem.vue create mode 100644 web/src/components/repo/build/BuildList.vue create mode 100644 web/src/components/repo/build/BuildLogs.vue create mode 100644 web/src/components/repo/build/BuildProcDuration.vue create mode 100644 web/src/components/repo/build/BuildProcs.vue create mode 100644 web/src/components/repo/build/BuildRunningIcon.vue create mode 100644 web/src/components/repo/build/BuildStatusIcon.vue create mode 100644 web/src/components/repo/build/build-status.ts create mode 100644 web/src/components/repo/settings/ActionsTab.vue create mode 100644 web/src/components/repo/settings/BadgeTab.vue create mode 100644 web/src/components/repo/settings/GeneralTab.vue create mode 100644 web/src/components/repo/settings/RegistriesTab.vue create mode 100644 web/src/components/repo/settings/SecretsTab.vue create mode 100644 web/src/components/tabs/Tab.vue create mode 100644 web/src/components/tabs/Tabs.vue create mode 100644 web/src/components/tabs/types.ts create mode 100644 web/src/compositions/useApiClient.ts create mode 100644 web/src/compositions/useAsyncAction.ts create mode 100644 web/src/compositions/useAuthentication.ts create mode 100644 web/src/compositions/useBuild.ts create mode 100644 web/src/compositions/useBuildFeed.ts create mode 100644 web/src/compositions/useBuildProc.ts create mode 100644 web/src/compositions/useConfig.ts create mode 100644 web/src/compositions/useDarkMode.ts create mode 100644 web/src/compositions/useElapsedTime.ts create mode 100644 web/src/compositions/useEvents.ts create mode 100644 web/src/compositions/useNotifications.ts create mode 100644 web/src/compositions/useRepoSearch.ts create mode 100644 web/src/compositions/useUserConfig.ts delete mode 100644 web/src/config/client/index.js delete mode 100644 web/src/config/client/inject.js delete mode 100644 web/src/config/state.js delete mode 100644 web/src/index.html delete mode 100644 web/src/index.js create mode 100644 web/src/lib/api/client.ts create mode 100644 web/src/lib/api/index.ts create mode 100644 web/src/lib/api/types/build.ts create mode 100644 web/src/lib/api/types/index.ts create mode 100644 web/src/lib/api/types/registry.ts create mode 100644 web/src/lib/api/types/repo.ts create mode 100644 web/src/lib/api/types/secret.ts create mode 100644 web/src/lib/api/types/user.ts create mode 100644 web/src/lib/api/types/webhook.ts create mode 100644 web/src/main.ts create mode 100644 web/src/router.ts delete mode 100644 web/src/screens/drone.js delete mode 100644 web/src/screens/drone.less delete mode 100644 web/src/screens/feed/components/index.js delete mode 100644 web/src/screens/feed/components/list.js delete mode 100644 web/src/screens/feed/components/list.less delete mode 100644 web/src/screens/feed/index.js delete mode 100644 web/src/screens/feed/index.less delete mode 100644 web/src/screens/layout.js delete mode 100644 web/src/screens/layout.less delete mode 100644 web/src/screens/login/screens/error/index.js delete mode 100644 web/src/screens/login/screens/error/index.less delete mode 100644 web/src/screens/login/screens/form/index.js delete mode 100644 web/src/screens/login/screens/form/index.less delete mode 100644 web/src/screens/login/screens/index.js delete mode 100644 web/src/screens/redirect.js delete mode 100644 web/src/screens/repo/screens/build/components/approval.js delete mode 100644 web/src/screens/repo/screens/build/components/approval.less delete mode 100644 web/src/screens/repo/screens/build/components/details.js delete mode 100644 web/src/screens/repo/screens/build/components/details.less delete mode 100644 web/src/screens/repo/screens/build/components/elapsed.js delete mode 100644 web/src/screens/repo/screens/build/components/index.js delete mode 100644 web/src/screens/repo/screens/build/components/procs.js delete mode 100644 web/src/screens/repo/screens/build/components/procs.less delete mode 100644 web/src/screens/repo/screens/build/index.js delete mode 100644 web/src/screens/repo/screens/build/index.less delete mode 100644 web/src/screens/repo/screens/build/logs/components/anchor.js delete mode 100644 web/src/screens/repo/screens/build/logs/components/anchor.less delete mode 100644 web/src/screens/repo/screens/build/logs/components/term.js delete mode 100644 web/src/screens/repo/screens/build/logs/components/term.less delete mode 100644 web/src/screens/repo/screens/build/logs/index.js delete mode 100644 web/src/screens/repo/screens/build/logs/index.less delete mode 100644 web/src/screens/repo/screens/build/menu.js delete mode 100644 web/src/screens/repo/screens/builds/components/index.js delete mode 100644 web/src/screens/repo/screens/builds/components/list.js delete mode 100644 web/src/screens/repo/screens/builds/components/list.less delete mode 100644 web/src/screens/repo/screens/builds/header.js delete mode 100644 web/src/screens/repo/screens/builds/index.js delete mode 100644 web/src/screens/repo/screens/builds/index.less delete mode 100644 web/src/screens/repo/screens/builds/menu.js delete mode 100644 web/src/screens/repo/screens/builds/menu.less delete mode 100644 web/src/screens/repo/screens/registry/components/form.js delete mode 100644 web/src/screens/repo/screens/registry/components/form.less delete mode 100644 web/src/screens/repo/screens/registry/components/index.js delete mode 100644 web/src/screens/repo/screens/registry/components/list.js delete mode 100644 web/src/screens/repo/screens/registry/components/list.less delete mode 100644 web/src/screens/repo/screens/registry/index.js delete mode 100644 web/src/screens/repo/screens/registry/index.less delete mode 100644 web/src/screens/repo/screens/secrets/components/form.js delete mode 100644 web/src/screens/repo/screens/secrets/components/form.less delete mode 100644 web/src/screens/repo/screens/secrets/components/index.js delete mode 100644 web/src/screens/repo/screens/secrets/components/list.js delete mode 100644 web/src/screens/repo/screens/secrets/components/list.less delete mode 100644 web/src/screens/repo/screens/secrets/index.js delete mode 100644 web/src/screens/repo/screens/secrets/index.less delete mode 100644 web/src/screens/repo/screens/settings/index.js delete mode 100644 web/src/screens/repo/screens/settings/index.less delete mode 100644 web/src/screens/titles.js delete mode 100644 web/src/screens/user/screens/repos/components/index.js delete mode 100644 web/src/screens/user/screens/repos/components/list.js delete mode 100644 web/src/screens/user/screens/repos/components/list.less delete mode 100644 web/src/screens/user/screens/repos/components/switch.js delete mode 100644 web/src/screens/user/screens/repos/components/switch.less delete mode 100644 web/src/screens/user/screens/repos/index.js delete mode 100644 web/src/screens/user/screens/repos/index.less delete mode 100644 web/src/screens/user/screens/repos/menu.js delete mode 100644 web/src/screens/user/screens/tokens/index.js delete mode 100644 web/src/screens/user/screens/tokens/index.less delete mode 100644 web/src/shared/components/__tests__/status.test.js delete mode 100644 web/src/shared/components/avatar.js delete mode 100644 web/src/shared/components/avatar.less delete mode 100644 web/src/shared/components/breadcrumb.js delete mode 100644 web/src/shared/components/breadcrumb.less delete mode 100644 web/src/shared/components/build_event.js delete mode 100644 web/src/shared/components/build_event.less delete mode 100644 web/src/shared/components/build_time.js delete mode 100644 web/src/shared/components/build_time.less delete mode 100644 web/src/shared/components/drawer/drawer.js delete mode 100644 web/src/shared/components/drawer/drawer.less delete mode 100644 web/src/shared/components/duration.js delete mode 100644 web/src/shared/components/icons/back.js delete mode 100644 web/src/shared/components/icons/branch.js delete mode 100644 web/src/shared/components/icons/check.js delete mode 100644 web/src/shared/components/icons/clock.js delete mode 100644 web/src/shared/components/icons/close.js delete mode 100644 web/src/shared/components/icons/commit.js delete mode 100644 web/src/shared/components/icons/deploy.js delete mode 100644 web/src/shared/components/icons/expand.js delete mode 100644 web/src/shared/components/icons/index.js delete mode 100644 web/src/shared/components/icons/launch.js delete mode 100644 web/src/shared/components/icons/link.js delete mode 100644 web/src/shared/components/icons/menu.js delete mode 100644 web/src/shared/components/icons/merge.js delete mode 100644 web/src/shared/components/icons/pause.js delete mode 100644 web/src/shared/components/icons/play.js delete mode 100644 web/src/shared/components/icons/refresh.js delete mode 100644 web/src/shared/components/icons/remove.js delete mode 100644 web/src/shared/components/icons/report.js delete mode 100644 web/src/shared/components/icons/schedule.js delete mode 100644 web/src/shared/components/icons/star.js delete mode 100644 web/src/shared/components/icons/sync.js delete mode 100644 web/src/shared/components/icons/tag.js delete mode 100644 web/src/shared/components/icons/timelapse.js delete mode 100644 web/src/shared/components/logo.js delete mode 100644 web/src/shared/components/menu.js delete mode 100644 web/src/shared/components/menu.less delete mode 100644 web/src/shared/components/snackbar.js delete mode 100644 web/src/shared/components/snackbar.less delete mode 100644 web/src/shared/components/status.js delete mode 100644 web/src/shared/components/status.less delete mode 100644 web/src/shared/components/status_number.js delete mode 100644 web/src/shared/components/status_number.less delete mode 100644 web/src/shared/components/sync.js delete mode 100644 web/src/shared/components/sync.less delete mode 100644 web/src/shared/constants/events.js delete mode 100644 web/src/shared/constants/status.js delete mode 100644 web/src/shared/constants/visibility.js delete mode 100644 web/src/shared/styles/ansi.less delete mode 100644 web/src/shared/styles/colors.less delete mode 100644 web/src/shared/styles/utils.less delete mode 100644 web/src/shared/utils/build.js delete mode 100644 web/src/shared/utils/feed.js delete mode 100644 web/src/shared/utils/logs.js delete mode 100644 web/src/shared/utils/message.js delete mode 100644 web/src/shared/utils/proc.js delete mode 100644 web/src/shared/utils/registry.js delete mode 100644 web/src/shared/utils/repository.js delete mode 100644 web/src/shared/utils/secrets.js delete mode 100644 web/src/shared/utils/users.js create mode 100644 web/src/store/builds.ts create mode 100644 web/src/store/repos.ts create mode 100644 web/src/utils/duration.ts create mode 100644 web/src/utils/emoji.ts create mode 100644 web/src/utils/helpers.ts create mode 100644 web/src/utils/timeAgo.ts create mode 100644 web/src/views/Login.vue create mode 100644 web/src/views/NotFound.vue create mode 100644 web/src/views/RepoAdd.vue create mode 100644 web/src/views/Repos.vue create mode 100644 web/src/views/User.vue create mode 100644 web/src/views/admin/Admin.vue create mode 100644 web/src/views/repo/RepoBranch.vue create mode 100644 web/src/views/repo/RepoBranches.vue create mode 100644 web/src/views/repo/RepoBuild.vue create mode 100644 web/src/views/repo/RepoBuilds.vue create mode 100644 web/src/views/repo/RepoSettings.vue create mode 100644 web/src/views/repo/RepoWrapper.vue create mode 100644 web/src/vite-env.d.ts create mode 100644 web/tsconfig.eslint.json create mode 100644 web/tsconfig.json delete mode 100644 web/vendor/drone-js/index.js create mode 100644 web/vite.config.ts delete mode 100644 web/webpack.config.js create mode 100644 web/windi.config.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index e910e88c8..0ee1bc87b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -19,6 +19,24 @@ "mode": "debug", "program": "${workspaceFolder}/cmd/agent/", "cwd": "${workspaceFolder}" + }, + { + "name": "Woodpecker UI", + "type": "node", + "request": "launch", + "runtimeExecutable": "yarn", + "runtimeArgs": [ + "start", + ], + "cwd": "${workspaceFolder}/web", + "port": 3000, + "resolveSourceMapLocations": [ + "${workspaceFolder}/web/**", + "!**/node_modules/**" + ], + "skipFiles": [ + "/**" + ] } ] } diff --git a/.woodpecker/main.yml b/.woodpecker/main.yml index a8c8a7d10..66791a01f 100644 --- a/.woodpecker/main.yml +++ b/.woodpecker/main.yml @@ -3,6 +3,61 @@ clone: image: plugins/git:next pipeline: + web-deps: + image: node:16-alpine + commands: + - cd web/ + - yarn install --frozen-lockfile + when: + path: "web/**" + +# TODO: enable if we have enouth mem (~2g) to lint, cause an oom atm. +# For reviewers, please run localy to verify it passes +# web-lint: +# TODO: disabled group for now to prevent oom +# group: web-test +# image: node:16-alpine +# commands: +# - cd web/ +# - yarn lint +# when: +# path: "web/**" + + web-formatcheck: + group: web-test + image: node:16-alpine + commands: + - cd web/ + - yarn formatcheck + when: + path: "web/**" + + web-typecheck: + group: web-test + image: node:16-alpine + commands: + - cd web/ + - yarn typecheck + when: + path: "web/**" + + web-test: + group: web-test + image: node:16-alpine + commands: + - cd web/ + - yarn test + when: + path: "web/**" + + web-build: + image: node:16-alpine + commands: + - cd web/ + - yarn build + when: + path: "web/**" + test: image: golang:1.16 group: test @@ -12,15 +67,6 @@ pipeline: - make lint - make formatcheck - test-frontend: - image: node:10.17.0-stretch - group: test - commands: - - (cd web/; yarn install) - - (cd web/; yarn run lesshint) - - (cd web/; yarn run lint --quiet) - - make test-frontend - test-postgres: image: golang:1.16 group: db-test @@ -40,8 +86,9 @@ pipeline: - go test -timeout 30s github.com/woodpecker-ci/woodpecker/server/store/datastore build-frontend: - image: node:10.17.0-stretch + image: node:16-alpine commands: + - apk add make - make release-frontend build-server: diff --git a/Makefile b/Makefile index ce834cada..f0f71e0c7 100644 --- a/Makefile +++ b/Makefile @@ -48,14 +48,20 @@ lint: go run vendor/github.com/rs/zerolog/cmd/lint/lint.go github.com/woodpecker-ci/woodpecker/cmd/cli go run vendor/github.com/rs/zerolog/cmd/lint/lint.go github.com/woodpecker-ci/woodpecker/cmd/server +frontend-dependencies: + (cd web/; yarn install --frozen-lockfile) + test-agent: $(DOCKER_RUN) go test -race -timeout 30s github.com/woodpecker-ci/woodpecker/cmd/agent $(GO_PACKAGES) test-server: $(DOCKER_RUN) go test -race -timeout 30s github.com/woodpecker-ci/woodpecker/cmd/server -test-frontend: - (cd web/; yarn; yarn run test) +test-frontend: frontend-dependencies + (cd web/; yarn run lint) + (cd web/; yarn run formatcheck) + (cd web/; yarn run typecheck) + (cd web/; yarn run test) test-lib: $(DOCKER_RUN) go test -race -timeout 30s $(shell go list ./... | grep -v '/cmd/') diff --git a/server/api/hook.go b/server/api/hook.go index c63300148..f380ac12d 100644 --- a/server/api/hook.go +++ b/server/api/hook.go @@ -276,7 +276,7 @@ func PostHook(c *gin.Context) { defer func() { for _, item := range buildItems { - uri := fmt.Sprintf("%s/%s/%d", server.Config.Server.Host, repo.FullName, build.Number) + uri := fmt.Sprintf("%s/%s/build/%d", server.Config.Server.Host, repo.FullName, build.Number) if len(buildItems) > 1 { err = remote_.Status(c, user, repo, build, uri, item.Proc) } else { diff --git a/server/router/router.go b/server/router/router.go index 2fa0a1c9f..98c76614e 100644 --- a/server/router/router.go +++ b/server/router/router.go @@ -30,7 +30,6 @@ import ( // Load loads the router func Load(serveHTTP func(w http.ResponseWriter, r *http.Request), middleware ...gin.HandlerFunc) http.Handler { - e := gin.New() e.Use(gin.Recovery()) diff --git a/server/web/web.go b/server/web/web.go index b47858874..189f6d46d 100644 --- a/server/web/web.go +++ b/server/web/web.go @@ -62,7 +62,7 @@ func (w *website) Register(mux *gin.Engine) { h := http.FileServer(w.fs) h = setupCache(h) mux.GET("/favicon.svg", gin.WrapH(h)) - mux.GET("/static/*filepath", gin.WrapH(h)) + mux.GET("/assets/*filepath", gin.WrapH(h)) mux.NoRoute(gin.WrapF(w.handleIndex)) } diff --git a/web/.babelrc b/web/.babelrc deleted file mode 100644 index fd95ce5a9..000000000 --- a/web/.babelrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "sourceMaps": false, - "presets": [ - ["es2015", { "loose":true }], - "stage-0", - "react" - ], - "plugins": [ - ["transform-decorators-legacy"], - ["transform-object-rest-spread"], - ["transform-react-jsx"], - ["transform-es3-property-literals"], - ["transform-es3-member-expression-literals"], - ["transform-decorators-legacy"] - ] -} diff --git a/web/.eslintignore b/web/.eslintignore new file mode 100644 index 000000000..67bb21d0a --- /dev/null +++ b/web/.eslintignore @@ -0,0 +1,6 @@ +# don't lint build output (make sure it's set to your correct build folder name) +dist +coverage/ +package.json +tsconfig.eslint.json +tsconfig.json diff --git a/web/.eslintrc.js b/web/.eslintrc.js index 235507f91..e839e23e6 100644 --- a/web/.eslintrc.js +++ b/web/.eslintrc.js @@ -1,33 +1,136 @@ +// @ts-check +/** @type {import('@typescript-eslint/experimental-utils').TSESLint.Linter.Config} */ + +/* eslint-env node */ module.exports = { - extends: [ - "standard", - "plugin:jest/recommended", - "plugin:react/recommended", - "prettier", - "prettier/react" - ], - plugins: ["react", "jest", "prettier"], - parser: "babel-eslint", - parserOptions: { - ecmaVersion: 2016, - sourceType: "module", - ecmaFeatures: { - jsx: true - } - }, env: { - es6: true, browser: true, - node: true, - "jest/globals": true }, + + parser: 'vue-eslint-parser', + parserOptions: { + project: ['./tsconfig.eslint.json'], + tsconfigRootDir: __dirname, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore see https://github.com/vuejs/vue-eslint-parser#parseroptionsparser + parser: '@typescript-eslint/parser', + sourceType: 'module', + extraFileExtensions: ['.vue'], + }, + + plugins: ['@typescript-eslint', 'import', 'simple-import-sort'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'airbnb-base-ts', + 'plugin:import/errors', + 'plugin:import/warnings', + 'plugin:import/typescript', + 'plugin:promise/recommended', + 'plugin:vue/vue3-recommended', + 'plugin:prettier/recommended', + 'plugin:vue-scoped-css/recommended', + ], + rules: { - "react/prop-types": 1, - "prettier/prettier": [ - "error", + // enable scope analysis rules + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': 'error', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': 'error', + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + 'no-redeclare': 'off', + '@typescript-eslint/no-redeclare': 'error', + + // make typescript eslint rules even more strict + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'error', + + 'import/no-unresolved': 'off', // disable as this is handled by tsc itself + 'import/first': 'error', + 'import/newline-after-import': 'error', + 'import/no-cycle': 'error', + 'import/no-relative-parent-imports': 'error', + 'import/no-duplicates': 'error', + 'import/no-extraneous-dependencies': 'error', + 'import/extensions': 'off', + 'import/prefer-default-export': 'off', + + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', + + 'promise/prefer-await-to-then': 'error', + 'promise/prefer-await-to-callbacks': 'error', + + 'no-underscore-dangle': 'off', + 'no-else-return': ['error', { allowElseIf: false }], + 'no-return-assign': ['error', 'always'], + 'no-return-await': 'error', + 'no-useless-return': 'error', + 'no-restricted-imports': [ + 'error', { - trailingComma: "all", - } - ] - } + patterns: ['src', 'dist'], + }, + ], + 'no-console': 'warn', + 'no-useless-concat': 'error', + 'prefer-const': 'error', + 'spaced-comment': ['error', 'always'], + 'object-shorthand': ['error', 'always'], + 'no-useless-rename': 'error', + eqeqeq: 'error', + + 'vue/attribute-hyphenation': 'error', + // enable in accordance with https://github.com/prettier/eslint-config-prettier#vuehtml-self-closing + 'vue/html-self-closing': [ + 'error', + { + html: { + void: 'any', + }, + }, + ], + 'vue/no-static-inline-styles': 'error', + 'vue/v-on-function-call': 'error', + 'vue/no-useless-v-bind': 'error', + 'vue/no-useless-mustaches': 'error', + 'vue/no-useless-concat': 'error', + 'vue/no-boolean-default': 'error', + 'vue/html-button-has-type': 'error', + 'vue/component-name-in-template-casing': 'error', + 'vue/match-component-file-name': [ + 'error', + { + extensions: ['vue'], + shouldMatchCase: true, + }, + ], + 'vue/require-name-property': 'error', + 'vue/v-for-delimiter-style': 'error', + 'vue/no-empty-component-block': 'error', + 'vue/no-duplicate-attr-inheritance': 'error', + 'vue/no-unused-properties': [ + 'error', + { + groups: ['props', 'data', 'computed', 'methods', 'setup'], + }, + ], + 'vue/new-line-between-multi-line-property': 'error', + 'vue/padding-line-between-blocks': 'error', + + // css rules + 'vue-scoped-css/no-unused-selector': 'error', + 'vue-scoped-css/no-parsing-error': 'error', + 'vue-scoped-css/require-scoped': 'error', + + // enable in accordance with https://github.com/prettier/eslint-config-prettier#curly + curly: ['error', 'all'], + + // risky because of https://github.com/prettier/eslint-plugin-prettier#arrow-body-style-and-prefer-arrow-callback-issue + 'arrow-body-style': 'error', + 'prefer-arrow-callback': 'error', + }, }; diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 000000000..d451ff16c --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,5 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local diff --git a/web/.lesshintrc b/web/.lesshintrc deleted file mode 100644 index 9ad09a8ef..000000000 --- a/web/.lesshintrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "fileExtensions": [".less", ".css"], - - "excludedFiles": ["ansi.less"], - - "spaceAfterPropertyColon": { - "enabled": true, - "style": "one_space" - }, - - "emptyRule": true, - "qualifyingElement": false, - "trailingWhitespace": true, - "zeroUnit": { - "exclude": ["flex"] - } -} diff --git a/web/.prettierignore b/web/.prettierignore new file mode 100644 index 000000000..73eb11349 --- /dev/null +++ b/web/.prettierignore @@ -0,0 +1,4 @@ +yarn-lock.yaml +dist +coverage/ +LICENSE diff --git a/web/.prettierrc.js b/web/.prettierrc.js new file mode 100644 index 000000000..b651096fd --- /dev/null +++ b/web/.prettierrc.js @@ -0,0 +1,8 @@ +module.exports = { + semi: true, + trailingComma: 'all', + singleQuote: true, + printWidth: 120, + tabWidth: 2, + endOfLine: 'lf', +}; diff --git a/web/README.md b/web/README.md deleted file mode 100644 index 64b4d1a0f..000000000 --- a/web/README.md +++ /dev/null @@ -1,57 +0,0 @@ -This project contains the source code for the drone user interface. The generated javascript and css assets are embedded into a Go source file which is imported into the main drone application, using go get. - -## Building - -To compile the source and create minified css and javascript assets: - -```text -yarn install # install project dependencies - -yarn run format # formats the codebase -yarn run lint # lints the codebase -yarn run test # tests the codebase -yarn run build # builds the production bundle -``` - -## Running - -To run a devserver with watching, hotreloading and proxy to drone server: - -```text -export DRONE_SERVER= -export DRONE_TOKEN= - -yarn run start -``` - -For example: - -```text -export DRONE_SERVER=http://your.drone.server -export DRONE_TOKEN=eyJhbGciOiJIUzI1NiIsIn... - -yarn run start -``` - -Note you will need to retrieve your drone user token from the tokens screen in the drone user interface. When the server is running you can open the following url in your browser: - -```text -http://localhost:9999 -``` - -## Releases - -To bundle and embed the code in a Go source file install the following command line utility: - -```text -go get github.com/bradrydzewski/togo -``` - -To generate the Go source file run the following command: - -```text -go generate ./... -go install ./... -``` - -__Note__ that for security reasons we will not accept a pull request that updates embedded Go asset file since we are not able to easily review the embedded, minified code. This file is instead automatically generated by our build server to prevent tampering. diff --git a/web/dist/.gitkeep b/web/dist/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/index.html b/web/index.html new file mode 100644 index 000000000..263a92f7a --- /dev/null +++ b/web/index.html @@ -0,0 +1,14 @@ + + + + + + + Woodpecker + + + +
+ + + diff --git a/web/package.json b/web/package.json index 708c56cf5..c7a304c2a 100644 --- a/web/package.json +++ b/web/package.json @@ -1,107 +1,59 @@ { - "name": "drone-ui-react", - "version": "1.0.0", - "main": "index.js", - "scripts": { - "prebuild": "rm -rf dist/files", - "build": "cross-env NODE_ENV=production webpack", - "lint": "eslint src/", - "lesshint": "lesshint --config .lesshintrc src/", - "test": "jest", - "start": "webpack-dev-server --progress --hot --inline", - "format": "prettier --trailing-comma all --write {src/*.js,src/**/*.js,src/**/*/*.js,src/*/*/*/*.js,src/*/*/*/*/*.js,src/*/*/*/*/*/*.js,src/*/*/*/*/*/*.js,src/*/*/*/*/*/*/*.js}" - }, - "jest": { - "moduleFileExtensions": [ - "js", - "jsx" - ], - "moduleDirectories": [ - "src", - "node_modules" - ], - "moduleNameMapper": { - "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/__mocks__/fileMock.js", - "\\.(css|less)$": "identity-obj-proxy", - "^react$": "preact-compat-enzyme", - "^react-dom/server$": "preact-render-to-string", - "^react-dom$": "preact-compat-enzyme", - "^react-addons-test-utils$": "preact-test-utils" - }, - "collectCoverageFrom": [ - "src/**/*.{js,jsx}" - ] - }, - "author": "Brad Rydzewski", + "name": "woodpecker-ci", + "author": "Woodpecker CI", + "version": "0.0.0", "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "scripts": { + "start": "vite", + "build": "vite build", + "serve": "vite preview", + "lint": "eslint --max-warnings 0 --ext .js,.ts,.vue,.json .", + "formatcheck": "prettier -c .", + "format:fix": "prettier --write .", + "typecheck": "vue-tsc --noEmit", + "test": "echo 'No tests configured' && exit 0" + }, "dependencies": { - "ansi_up": "^2.0.2", - "babel-polyfill": "^6.23.0", - "baobab": "^2.4.3", - "baobab-react": "^2.1.2", - "classnames": "^2.2.5", - "drone-js": "file:./vendor/drone-js/", - "humanize-duration": "^3.10.1", - "preact": "^8.2.1", - "preact-compat": "^3.16.0", - "query-string": "^5.0.0", - "react-collapsible": "^2.6.0", - "react-router": "^4.1.2", - "react-router-dom": "^4.1.2", - "react-screen-size": "^1.0.1", - "react-timeago": "^3.4.3", - "react-title-component": "^1.0.1", - "react-transition-group": "^1.2.0", - "yarn": "^1.17.3" + "@kyvg/vue3-notification": "2.3.4", + "@meforma/vue-toaster": "1.2.2", + "ansi-to-html": "0.7.2", + "fuse.js": "6.4.6", + "humanize-duration": "3.27.0", + "javascript-time-ago": "2.3.10", + "node-emoji": "1.11.0", + "pinia": "2.0.0", + "vue": "v3.2.20", + "vue-router": "4.0.10" }, "devDependencies": { - "babel-core": "^6.25.0", - "babel-eslint": "^7.2.3", - "babel-jest": "^21.0.0", - "babel-loader": "^7.1.1", - "babel-plugin-transform-decorators-legacy": "^1.3.4", - "babel-plugin-transform-es3-member-expression-literals": "^6.22.0", - "babel-plugin-transform-es3-property-literals": "^6.22.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-preset-env": "^1.6.0", - "babel-preset-es2015": "^6.24.1", - "babel-preset-react": "^6.24.1", - "babel-preset-stage-0": "^6.24.1", - "cross-env": "^5.0.3", - "css-loader": "^0.28.4", - "dotenv": "^4.0.0", - "enzyme": "^2.9.1", - "eslint": "^4.6.1", - "eslint-config-prettier": "^2.4.0", - "eslint-config-standard": "^10.2.1", - "eslint-plugin-import": "^2.7.0", - "eslint-plugin-jest": "^21.0.2", - "eslint-plugin-node": "^5.1.1", - "eslint-plugin-prettier": "^2.2.0", - "eslint-plugin-promise": "^3.5.0", - "eslint-plugin-react": "^7.3.0", - "eslint-plugin-standard": "^3.0.1", - "file-loader": "^0.11.2", - "html-webpack-plugin": "^2.30.1", - "identity-obj-proxy": "^3.0.0", - "jasmine-expect": "^3.7.1", - "jest": "^21.0.1", - "jsdoc": "^3.5.4", - "less": "^2.7.2", - "less-loader": "^4.0.5", - "lesshint": "^4.1.3", - "preact-compat-enzyme": "^0.2.5", - "preact-render-to-string": "^3.6.3", - "preact-test-utils": "^0.1.3", - "prettier": "^1.6.0", - "sinon": "^3.2.1", - "sinon-chai": "^2.13.0", - "style-loader": "^0.18.2", - "url-loader": "^0.5.9", - "webpack": "^3.4.1", - "webpack-dev-server": "^2.6.1" - }, - "resolutions": { - "ua-parser-js": "^0.7.30" + "@iconify/json": "1.1.421", + "@types/humanize-duration": "3.27.0", + "@types/javascript-time-ago": "2.0.3", + "@types/node": "16.11.6", + "@types/node-emoji": "1.8.1", + "@typescript-eslint/eslint-plugin": "4.31.2", + "@typescript-eslint/parser": "4.31.1", + "@vitejs/plugin-vue": "1.9.4", + "@vue/compiler-sfc": "3.2.20", + "eslint": "7.32.0", + "eslint-config-airbnb-base-ts": "14.1.2", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-prettier": "4.0.0", + "eslint-plugin-promise": "5.1.1", + "eslint-plugin-simple-import-sort": "7.0.0", + "eslint-plugin-vue": "7.18.0", + "eslint-plugin-vue-scoped-css": "1.3.0", + "prettier": "2.4.1", + "typescript": "4.4.4", + "unplugin-icons": "0.12.17", + "unplugin-vue-components": "0.17.0", + "vite": "2.6.13", + "vite-plugin-windicss": "1.4.12", + "vite-svg-loader": "3.0.0", + "vue-tsc": "0.28.10", + "windicss": "3.2.0" } } diff --git a/web/src/public/favicon.svg b/web/public/favicon.svg similarity index 100% rename from web/src/public/favicon.svg rename to web/public/favicon.svg diff --git a/web/src/App.vue b/web/src/App.vue new file mode 100644 index 000000000..d1b49080d --- /dev/null +++ b/web/src/App.vue @@ -0,0 +1,115 @@ + + + + + + + + diff --git a/web/src/assets/logo.svg b/web/src/assets/logo.svg new file mode 100644 index 000000000..b9c8b6c6c --- /dev/null +++ b/web/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/web/src/assets/woodpecker.svg b/web/src/assets/woodpecker.svg new file mode 100644 index 000000000..e08d0a2f2 --- /dev/null +++ b/web/src/assets/woodpecker.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/src/components/atomic/Button.vue b/web/src/components/atomic/Button.vue new file mode 100644 index 000000000..88ed6ef9c --- /dev/null +++ b/web/src/components/atomic/Button.vue @@ -0,0 +1,134 @@ + + + diff --git a/web/src/components/atomic/DocsLink.vue b/web/src/components/atomic/DocsLink.vue new file mode 100644 index 000000000..f0b42394c --- /dev/null +++ b/web/src/components/atomic/DocsLink.vue @@ -0,0 +1,32 @@ + + + diff --git a/web/src/components/atomic/Icon.vue b/web/src/components/atomic/Icon.vue new file mode 100644 index 000000000..121f08d21 --- /dev/null +++ b/web/src/components/atomic/Icon.vue @@ -0,0 +1,83 @@ + + + diff --git a/web/src/components/atomic/IconButton.vue b/web/src/components/atomic/IconButton.vue new file mode 100644 index 000000000..f704555d5 --- /dev/null +++ b/web/src/components/atomic/IconButton.vue @@ -0,0 +1,60 @@ + + + diff --git a/web/src/components/atomic/ListItem.vue b/web/src/components/atomic/ListItem.vue new file mode 100644 index 000000000..b866bb39d --- /dev/null +++ b/web/src/components/atomic/ListItem.vue @@ -0,0 +1,32 @@ + + + diff --git a/web/src/components/build-feed/BuildFeedItem.vue b/web/src/components/build-feed/BuildFeedItem.vue new file mode 100644 index 000000000..1e7978b72 --- /dev/null +++ b/web/src/components/build-feed/BuildFeedItem.vue @@ -0,0 +1,48 @@ + + + diff --git a/web/src/components/build-feed/BuildFeedSidebar.vue b/web/src/components/build-feed/BuildFeedSidebar.vue new file mode 100644 index 000000000..38957f14c --- /dev/null +++ b/web/src/components/build-feed/BuildFeedSidebar.vue @@ -0,0 +1,48 @@ + + + diff --git a/web/src/components/form/Checkbox.vue b/web/src/components/form/Checkbox.vue new file mode 100644 index 000000000..063b37aaa --- /dev/null +++ b/web/src/components/form/Checkbox.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/web/src/components/form/CheckboxesField.vue b/web/src/components/form/CheckboxesField.vue new file mode 100644 index 000000000..802711075 --- /dev/null +++ b/web/src/components/form/CheckboxesField.vue @@ -0,0 +1,65 @@ + + + diff --git a/web/src/components/form/InputField.vue b/web/src/components/form/InputField.vue new file mode 100644 index 000000000..4edcbec7d --- /dev/null +++ b/web/src/components/form/InputField.vue @@ -0,0 +1,38 @@ + + + diff --git a/web/src/components/form/NumberField.vue b/web/src/components/form/NumberField.vue new file mode 100644 index 000000000..0de88d29b --- /dev/null +++ b/web/src/components/form/NumberField.vue @@ -0,0 +1,48 @@ + + + diff --git a/web/src/components/form/RadioField.vue b/web/src/components/form/RadioField.vue new file mode 100644 index 000000000..54f1b2233 --- /dev/null +++ b/web/src/components/form/RadioField.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/web/src/components/form/SelectField.vue b/web/src/components/form/SelectField.vue new file mode 100644 index 000000000..5b1d4558e --- /dev/null +++ b/web/src/components/form/SelectField.vue @@ -0,0 +1,63 @@ + + + diff --git a/web/src/components/form/TextField.vue b/web/src/components/form/TextField.vue new file mode 100644 index 000000000..0911f204a --- /dev/null +++ b/web/src/components/form/TextField.vue @@ -0,0 +1,74 @@ + + + diff --git a/web/src/components/form/form.types.ts b/web/src/components/form/form.types.ts new file mode 100644 index 000000000..d069aeab5 --- /dev/null +++ b/web/src/components/form/form.types.ts @@ -0,0 +1,9 @@ +export type SelectOption = { + value: string; + text: string; + description?: string; +}; + +export type RadioOption = SelectOption; + +export type CheckboxOption = SelectOption; diff --git a/web/src/components/layout/FluidContainer.vue b/web/src/components/layout/FluidContainer.vue new file mode 100644 index 000000000..bcc143b0e --- /dev/null +++ b/web/src/components/layout/FluidContainer.vue @@ -0,0 +1,13 @@ + + + diff --git a/web/src/components/layout/Panel.vue b/web/src/components/layout/Panel.vue new file mode 100644 index 000000000..9cc1ac9f7 --- /dev/null +++ b/web/src/components/layout/Panel.vue @@ -0,0 +1,17 @@ + + + diff --git a/web/src/components/layout/header/ActiveBuilds.vue b/web/src/components/layout/header/ActiveBuilds.vue new file mode 100644 index 000000000..567ce63e5 --- /dev/null +++ b/web/src/components/layout/header/ActiveBuilds.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/web/src/components/layout/header/Navbar.vue b/web/src/components/layout/header/Navbar.vue new file mode 100644 index 000000000..7e822a457 --- /dev/null +++ b/web/src/components/layout/header/Navbar.vue @@ -0,0 +1,69 @@ + + + diff --git a/web/src/components/repo/build/BuildItem.vue b/web/src/components/repo/build/BuildItem.vue new file mode 100644 index 000000000..5bb904c36 --- /dev/null +++ b/web/src/components/repo/build/BuildItem.vue @@ -0,0 +1,86 @@ + + + diff --git a/web/src/components/repo/build/BuildList.vue b/web/src/components/repo/build/BuildList.vue new file mode 100644 index 000000000..82b817744 --- /dev/null +++ b/web/src/components/repo/build/BuildList.vue @@ -0,0 +1,41 @@ + + + diff --git a/web/src/components/repo/build/BuildLogs.vue b/web/src/components/repo/build/BuildLogs.vue new file mode 100644 index 000000000..7433b2b63 --- /dev/null +++ b/web/src/components/repo/build/BuildLogs.vue @@ -0,0 +1,86 @@ +