feat(teams): in-app Teams page#2561
Conversation
|
So no longer part of contacts app? Will simplify things :) |
jancborchardt
left a comment
There was a problem hiding this comment.
Really really nice! :) Great first step in the right direction, and keeping it simple & contained by just porting over what we have.
|
Small details but no blocker @marcoambrosini :
|
|
@susnux could you have a look at the front-end tooling and wiring and tell me if it's sane? |
@jancborchardt then I would do it same as talk here, with the new button inline |
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>
2e6e767 to
6227cc3
Compare
|
hey-hey! Looks really promising. @marcoambrosini Will it work fine with large circles (1000+ members)? See my other PRs related to that nextcloud/collectives#2518, nextcloud/contacts#5330, so maybe you can backport some stuff from them |
| if (team) { | ||
| router.push({ name: 'team', params: { teamId: team.id } }) | ||
| } | ||
| open.value = false |
There was a problem hiding this comment.
Found a bug here: open the dialog, hit "Cancel", then try "New team" again and nothing happens. Same after a successful create. Both close by flipping the local open ref, but the parent only unmounts on @close, which comes from onUpdateOpen and that only fires when NcDialog closes itself (Esc/backdrop/X). So createDialogOpen stays true and you can't reopen. Can we just emit close from submit and Cancel instead?
| #[NoAdminRequired] | ||
| #[NoCSRFRequired] | ||
| #[FrontpageRoute(verb: 'GET', url: '/teams')] | ||
| public function index(): TemplateResponse { |
There was a problem hiding this comment.
The dashboard widget checks frontend_enabled but this route and the nav entry don't, so Teams shows up even when the frontend is turned off. Intended?
|
|
||
| <span :class="$style.teamCardResources"> | ||
| <NcIconSvgWrapper :path="mdiFolderMultipleOutline" :size="18" inline /> | ||
| {{ t('circles', '{count} resources', { count: team.resources.length }) }} |
There was a problem hiding this comment.
This should be n(), otherwise a team with one resource reads "1 resources"
| export async function fetchTeams(): Promise<Team[]> { | ||
| const [circlesRes, dashRes] = await Promise.all([ | ||
| axios.get<OcsResponse<RawCircle[]>>(generateOcsUrl('apps/circles/circles') + '?limit=-1', { headers: HEADERS }), | ||
| axios.get<OcsResponse<RawDashboardTeam[]>>(generateOcsUrl('apps/circles/teams/dashboard/widget') + '?limit=200&offset=0', { headers: HEADERS }), |
There was a problem hiding this comment.
If the dashboard call fails but /circles succeeds, Promise.all rejects and the whole page shows the error state even though we have the team list. allSettled here and treat missing dashboard data as empty previews maybe?
stediefan
left a comment
There was a problem hiding this comment.
Looks great! I already built some UI stuff ontop - can't wait to publish after this gets merged. One further task would be to remove the corresponding code from contacts - right?
Teams app front-end first step: mostly moved the functionality from contacts and added an overview page.

