Skip to content

feat(teams): in-app Teams page#2561

Draft
marcoambrosini wants to merge 6 commits into
masterfrom
feat/teams-spa
Draft

feat(teams): in-app Teams page#2561
marcoambrosini wants to merge 6 commits into
masterfrom
feat/teams-spa

Conversation

@marcoambrosini

@marcoambrosini marcoambrosini commented Jun 26, 2026

Copy link
Copy Markdown
Member

Teams app front-end first step: mostly moved the functionality from contacts and added an overview page.
Screenshot 2026-06-26 at 20 08 13
Screenshot 2026-06-26 at 20 08 19

Marco Ambrosini added 6 commits June 26, 2026 20:19
Add a PageController that renders the SPA shell, a /teams route plus a
catch-all so HTML5-history deep links survive a reload, and a Teams
entry in the app navigation.

Signed-off-by: Marco Ambrosini <marco.ambrosini@nextcloud.com>
Register src/main.ts as the 'main' Vite entry and pull in the runtime
deps the ported team-page code needs (vue-router, pinia, vuex, cdav,
virtua, cropper, MDI). Allow JS in tsconfig and skip linting the
ported src/teams/team-page sources until they are modernized.

Signed-off-by: Marco Ambrosini <marco.ambrosini@nextcloud.com>
The app shell (App, router, Pinia store) drives a home view listing
teams and a per-team page. The team page and its member/entity-picker
components, services and models are ported from the Contacts app and
kept under team-page/ (Vuex + Options API) while they are migrated.

Signed-off-by: Marco Ambrosini <marco.ambrosini@nextcloud.com>
Generate circle/team links and the dashboard widget's targets against
the new circles.Page.index route instead of the Contacts app, and drop
the now-unused route_to_circle config and IAppManager 'contacts'
checks. The widget no longer requires Contacts to be installed.

Signed-off-by: Marco Ambrosini <marco.ambrosini@nextcloud.com>
Raise the max-version to 35.

Signed-off-by: Marco Ambrosini <marco.ambrosini@nextcloud.com>
Signed-off-by: Marco Ambrosini <marco.ambrosini@nextcloud.com>
@marcoambrosini marcoambrosini requested a review from susnux June 26, 2026 11:25
@marcoambrosini marcoambrosini marked this pull request as draft June 26, 2026 11:30
@susnux

susnux commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

So no longer part of contacts app? Will simplify things :)

@jancborchardt jancborchardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Really really nice! :) Great first step in the right direction, and keeping it simple & contained by just porting over what we have.

@jancborchardt

jancborchardt commented Jun 27, 2026

Copy link
Copy Markdown
Member

Small details but no blocker @marcoambrosini :

  • Search input should probably go even above "Add", so that we have a common position at least in height for the in-app search functions.
  • The "Overview" icon in the nav should be filled when active?
  • The avatars of the teams in the nav seem a bit too large, there is no space towards the text

@marcoambrosini

Copy link
Copy Markdown
Member Author

@susnux could you have a look at the front-end tooling and wiring and tell me if it's sane?

@marcoambrosini

Copy link
Copy Markdown
Member Author

Search input should probably go even above "Add", so that we have a common position at least in height for the in-app search functions.

@jancborchardt then I would do it same as talk here, with the new button inline

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should use Route annotation instead of legacy routes.php - routes.php is only for legacy routes as this is a new file it directly should use the annotations

</RouterLink>
</template>

<style scoped lang="scss">

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would use style module for new files as this is the only option to 2-way scope styles properly and not leak.

</ul>
</template>

<script>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should use script setup lang="ts" as all other new files.

</template>

<script>
// @ts-nocheck

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why?

Comment on lines +61 to +64
import {
NcCheckboxRadioSwitch as CheckboxRadioSwitch,
NcButton,
} from '@nextcloud/vue'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should not import component from main entry point

Suggested change
import {
NcCheckboxRadioSwitch as CheckboxRadioSwitch,
NcButton,
} from '@nextcloud/vue'
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
import NcButton from '@nextcloud/vue/components/NcButton'

Comment on lines +56 to +57
<script lang="ts">
// @ts-nocheck

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here new files should directly use script setup lang="ts"

<template #icon>
<IconDelete :size="20" />
</template>
{{ t('contacts', 'Delete team') }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

wrong app used here and in other places

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: 📐 At design

Development

Successfully merging this pull request may close these issues.

3 participants