Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
e03edfe
dynamic module
remigermain Dec 10, 2025
60d20f9
pre-add
remigermain Dec 16, 2025
47609ed
Merge branch 'main' of github.com:CyberCRI/projects-frontend into ref…
remigermain Dec 16, 2025
066187d
fix: composable
remigermain Dec 16, 2025
5dfe4df
group and composable ok
remigermain Dec 16, 2025
7e94308
cleanup
remigermain Dec 16, 2025
68432cc
cleanup nav/types
remigermain Dec 17, 2025
ca6bf02
cleanup nav/types
remigermain Dec 17, 2025
7fc852b
cleanup
remigermain Dec 19, 2025
f178aa4
clean groupId/groupSlug
remigermain Dec 19, 2025
c99fc67
Merge branch 'main' of github.com:CyberCRI/projects-frontend into ref…
remigermain Dec 19, 2025
0c22434
Merge branch 'main' of github.com:CyberCRI/projects-frontend into ref…
remigermain Jan 7, 2026
d6d403d
Merge branch 'main' of github.com:CyberCRI/projects-frontend into ref…
remigermain Jan 9, 2026
0fdfe01
style:remove vars
remigermain Jan 12, 2026
89ab06b
cleanup
remigermain Jan 13, 2026
b160226
cleanup
remigermain Jan 13, 2026
4f9e1ec
Merge branch 'main' of github.com:CyberCRI/projects-frontend into ref…
remigermain Jan 13, 2026
a1be54c
test: fix group snapshot
remigermain Jan 13, 2026
01425c5
test: fix group
remigermain Jan 13, 2026
ce85dbd
fix: optimize key/asyncPaginations
remigermain Jan 13, 2026
dd4b522
Merge branch 'main' of github.com:CyberCRI/projects-frontend into ref…
remigermain Jan 16, 2026
3796978
Merge branch 'main' of github.com:CyberCRI/projects-frontend into fea…
remigermain Jan 19, 2026
6f77f8c
refactor: split researcher documents
remigermain Jan 19, 2026
2f5585d
feat: add groups conferences/publications
remigermain Jan 19, 2026
d6d71ab
feat: add groups conferences/publications
remigermain Jan 20, 2026
f365aa1
feat: better project style
remigermain Jan 20, 2026
7961b32
cleanup
remigermain Jan 20, 2026
0dccc34
feat: group header
remigermain Jan 20, 2026
635b205
similars group
remigermain Jan 21, 2026
073e1bc
feat: add subgroups
remigermain Jan 22, 2026
83d951a
feat: add skeletons loading
remigermain Jan 22, 2026
a06c9cd
fix: loading
remigermain Jan 22, 2026
f2f77d5
rename modules
remigermain Jan 23, 2026
3fba4bc
clenaup
remigermain Jan 26, 2026
0835a4e
clenaup
remigermain Jan 26, 2026
9bbbc0b
fix click similars
remigermain Jan 26, 2026
09662ee
fix skeletons
remigermain Jan 26, 2026
14ab1c8
cleanup
remigermain Jan 27, 2026
5b20eeb
clean details
remigermain Jan 27, 2026
8c98fe3
feat: add tags/sdg form
remigermain Jan 27, 2026
cc8d16a
location/map refacto
remigermain Jan 28, 2026
2a84170
fix: maps
remigermain Jan 28, 2026
b698a2d
fix: lint
remigermain Jan 28, 2026
1ff4c1a
fix: errors locations/maps
remigermain Jan 29, 2026
ca62dfc
fix: type maps
remigermain Jan 29, 2026
ee4b6ea
fix tooltip project
remigermain Jan 29, 2026
1766751
seperate componenets
remigermain Jan 29, 2026
d32d5af
form locations
remigermain Jan 29, 2026
c080dbb
locations ok
remigermain Jan 30, 2026
31c6d39
fix: location error
remigermain Jan 30, 2026
49cdbdc
location group
remigermain Jan 30, 2026
eb16150
add current position
remigermain Jan 30, 2026
96be77f
i18n
remigermain Jan 30, 2026
ebd9b54
fix: maps
remigermain Feb 2, 2026
ff23b63
fix: maps
remigermain Feb 2, 2026
c0a7e0a
default patatoids
remigermain Feb 2, 2026
2962aa3
clean maps
remigermain Feb 2, 2026
4d33834
clean tooltip
remigermain Feb 2, 2026
4dd30b3
tooltip
remigermain Feb 2, 2026
0de68d8
better locations form
remigermain Feb 3, 2026
4d91178
rename location item
remigermain Feb 3, 2026
211e583
fix: form gorups
remigermain Feb 3, 2026
7dcb534
tabs linters
remigermain Feb 3, 2026
56e465f
feat: add gallery
remigermain Feb 3, 2026
236a93f
add gallery form
remigermain Feb 3, 2026
0173ad8
add gallery
remigermain Feb 4, 2026
a04add3
fix gallery errors
remigermain Feb 4, 2026
a92cac0
gallery mini ok
remigermain Feb 4, 2026
3552401
gallery ok
remigermain Feb 4, 2026
ed2a2b5
some fixes
remigermain Feb 5, 2026
7955a09
some fixs
remigermain Feb 5, 2026
f01be9b
optimize resize
remigermain Feb 5, 2026
1232d84
Merge branch 'main' of github.com:CyberCRI/projects-frontend into fea…
remigermain Feb 5, 2026
045c087
remove project header
remigermain Feb 5, 2026
6739509
new composable
remigermain Feb 5, 2026
5cf4f56
fix issues
remigermain Feb 5, 2026
e00842a
fix ref
remigermain Feb 5, 2026
1ab1dc9
fix: comment
remigermain Feb 5, 2026
2de2fad
test: fix tests
remigermain Feb 6, 2026
6f2b0c1
test: fix reactive
remigermain Feb 6, 2026
2c8a7af
refactor: componeents
remigermain Feb 6, 2026
80f5687
fix researcher tab
remigermain Feb 6, 2026
2ec745a
lint
remigermain Feb 6, 2026
e9621a3
refactor: map/location tooltip
remigermain Feb 6, 2026
696fe42
rm
remigermain Feb 6, 2026
a0fc1dd
fix cat
remigermain Feb 6, 2026
c7298cf
summary
remigermain Feb 6, 2026
8fd6f95
Merge branch 'refactor--components' of github.com:CyberCRI/projects-f…
remigermain Feb 6, 2026
c910a05
event
remigermain Feb 6, 2026
909eb13
fix locales
remigermain Feb 6, 2026
4b7aa70
i18n
remigermain Feb 6, 2026
84e6995
i18n
remigermain Feb 6, 2026
1d685f2
i18n
remigermain Feb 6, 2026
720c51a
i18n
remigermain Feb 6, 2026
aec292c
i18n
remigermain Feb 6, 2026
04a2246
test: fix factory typing
remigermain Feb 6, 2026
e1a2f55
Merge branch 'refactor--components' of github.com:CyberCRI/projects-f…
remigermain Feb 6, 2026
57de8d4
Merge branch 'refactor--maps' of github.com:CyberCRI/projects-fronten…
remigermain Feb 6, 2026
abcff33
Merge branch 'refactor--maps' of github.com:CyberCRI/projects-fronten…
remigermain Feb 6, 2026
3f165a6
yarn fix types
remigermain Feb 6, 2026
a9d2357
Merge branch 'main' of github.com:CyberCRI/projects-frontend into fea…
remigermain Feb 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions src/analytics/location.analytic.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
import analytics from '@/analytics/index'
import { LocationType } from '@/models/types'
import { ProjectLocationForm } from '@/models/location.model'

export interface LocationAnalytic {
project: {
id: string
}
location: {
lat: number
lng: number
type: LocationType
}
location: ProjectLocationForm
}

export default {
Expand Down
66 changes: 66 additions & 0 deletions src/api/crisalid.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import {
Document,
DocumentType,
Researcher,
ResearcherDocumentAnalytics,
} from '@/interfaces/researcher'
import { PeopleGroupModel } from '@/models/invitation.model'

export async function getOwnResearchDocument(
organisationCode: string,
researchId: Researcher['id'],
documentType: DocumentType,
config = {}
) {
return await useAPI<PaginationResult<Document>>(
`crisalid/organization/${organisationCode}/researcher/${researchId}/${documentType}/`,
config
)
}

export async function getGroupResearchDocument(
organisationCode: string,
groupId: PeopleGroupModel['id'],
documentType: DocumentType,
config = {}
) {
return await useAPI<PaginationResult<Document>>(
`crisalid/organization/${organisationCode}/people-group/${groupId}/${documentType}/`,
config
)
}

export async function getOwnResearchDocumentAnalytics(
organisationCode: string,
researchId: Researcher['id'],
documentType: DocumentType,
config = {}
) {
return await useAPI<ResearcherDocumentAnalytics>(
`crisalid/organization/${organisationCode}/researcher/${researchId}/${documentType}/analytics/`,
config
)
}

export async function getGroupResearchDocumentAnalytics(
organisationCode: string,
groupId: PeopleGroupModel['id'],
documentType: DocumentType,
config = {}
) {
return await useAPI<ResearcherDocumentAnalytics>(
`crisalid/organization/${organisationCode}/people-group/${groupId}/${documentType}/analytics/`,
config
)
}

export async function getResearchDocumentSimilars(
organisationCode: string,
documentId: Document['id'],
config = {}
) {
return await useAPI<PaginationResult<Document>>(
`crisalid/organization/${organisationCode}/document/${documentId}/similars/`,
config
)
}
6 changes: 5 additions & 1 deletion src/api/follows.service.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type {
AddManyFollowedProject,
FollowInput,
FollowProjectOutput,
// FollowOutput,
// FollowOutputList,
} from '@/models/follow.model'
Expand All @@ -16,7 +17,10 @@ export async function getUserFollows(body: FollowInput, params) {
}

export async function postFollow(follow: FollowInput) {
return await useAPI(`project/${follow.project_id}/follow/`, { body: follow, method: 'POST' })
return await useAPI<FollowProjectOutput>(`project/${follow.project_id}/follow/`, {
body: follow,
method: 'POST',
})
//.data.value
}

Expand Down
161 changes: 116 additions & 45 deletions src/api/groups.service.ts
Original file line number Diff line number Diff line change
@@ -1,112 +1,121 @@
import type {
// GroupModel,
// GroupOuput,
PostGroupData,
AddGroupMembers,
RemoveGroupMember,
PostGroupProjects,
AddParentGroupModelInput,
GroupMember,
HierarchyGroupModel,
} from '@/models/group.model'
// import type { HierarchyGroupModel } from '@/models/group.model'
// import type { APIResponseList } from '@/api/types'
import { _adaptParamsToGetQuery } from '@/api/utils.service'
import useAPI from '@/composables/useAPI'
import { ProjectModel } from '@/models/project.model'
import { PeopleGroupModel } from '@/models/invitation.model'
import { LocationModel } from '@/models/location.model'
import { ImageModel } from '@/models/image.model'

// HIERARCHY

export async function getHierarchyGroups(org: string) {
return await useAPI(`organization/${org}/people-groups-hierarchy/`, {}) //.data.value
export async function getHierarchyGroups(organizationCode: string, config = {}) {
return await useAPI<PaginationResult<HierarchyGroupModel>>(
`organization/${organizationCode}/people-groups-hierarchy/`,
config
)
}

export async function getPeopleGroupsHierarchy(org_code, params) {
return await useAPI(`organization/${org_code}/people-groups-hierarchy/`, {
..._adaptParamsToGetQuery(params),
}) //.data.value
})
}

export async function getGroups(org_id) {
return await useAPI(`organization/${org_id}/people-group/`, {}) //.data.value
return await useAPI(`organization/${org_id}/people-group/`, {})
}

// ALL GROUPS

export async function getPeopleGroups(org_code, params) {
return await useAPI(`organization/${org_code}/people-group/`, {
..._adaptParamsToGetQuery(params),
}) //.data.value
})
}

export async function postGroup(org: string, groupData: PostGroupData) {
return await useAPI(`organization/${org}/people-group/`, { body: groupData, method: 'POST' })
//.data.value
}

// GROUP

export async function addParentGroup(
orgId: string,
groupId: string,
groupId: number,
body: AddParentGroupModelInput
) {
return await useAPI(`organization/${orgId}/people-group/${groupId}/`, { body, method: 'PATCH' }) //.data.value
return await useAPI(`organization/${orgId}/people-group/${groupId}/`, { body, method: 'PATCH' })
}

export async function getGroup(org: string, groupId: string, noError: boolean = false) {
return await useAPI(
`/organization/${org}/people-group/${groupId}/`,
{ noError: noError } // TODO nuxt check error silenced
) //.data.value
export function getGroup(organizationCode: string, groupId: number, config = {}) {
return useAPI<PeopleGroupModel>(
`organization/${organizationCode}/people-group/${groupId}/`,
config
)
}

export async function patchGroup(org: string, group_id: number, groupData: Partial<PostGroupData>) {
return await useAPI(`organization/${org}/people-group/${group_id}/`, {
export async function patchGroup(
organizationCode: string,
groupName: number,
groupData: Partial<PostGroupData>
) {
return await useAPI(`organization/${organizationCode}/people-group/${groupName}/`, {
body: groupData,
method: 'PATCH',
}) //.data.value
})
}

export async function deleteGroup(org_code, group_id) {
return await useAPI(`organization/${org_code}/people-group/${group_id}/`, { method: 'DELETE' }) //.data.value
export async function deleteGroup(organizationCode: string, groupName: string) {
return await useAPI(`organization/${organizationCode}/people-group/${groupName}/`, {
method: 'DELETE',
})
}

// GROUP MEMBERS

export async function getGroupMember(org: string, groupId: string, noError: boolean = false) {
return (
// TODO nuxt check error silenced
await useAPI(`organization/${org}/people-group/${groupId}/member/`, { noError: noError })
//.data.value
export async function getGroupMember(organizationCode: string, groupId: number, config = {}) {
return await useAPI<PaginationResult<GroupMember>>(
`organization/${organizationCode}/people-group/${groupId}/member/`,
config
)
}

export async function postGroupMembers(
org: string,
group_id: number,
organizationCode: string,
groupId: number,
membersData: AddGroupMembers
) {
return await useAPI(`organization/${org}/people-group/${group_id}/member/add/`, {
return await useAPI(`organization/${organizationCode}/people-group/${groupId}/member/add/`, {
body: membersData,
method: 'POST',
}) //.data.value
})
}

export async function removeGroupMember(
org: string,
group_id: number,
organizationCode: string,
groupId: number,
membersData: RemoveGroupMember
) {
return await useAPI(`organization/${org}/people-group/${group_id}/member/remove/`, {
return await useAPI(`organization/${organizationCode}/people-group/${groupId}/member/remove/`, {
body: membersData,
method: 'POST',
}) //.data.value
})
}

// GROUP PROJECTS

export async function getGroupProject(org: string, groupId: string, noError: boolean = false) {
return await useAPI(`organization/${org}/people-group/${groupId}/project/`, {
noError: noError,
}) //.data.value
export async function getGroupProject(organizationCode: string, groupId: number, config = {}) {
return await useAPI<PaginationResult<ProjectModel>>(
`organization/${organizationCode}/people-group/${groupId}/project/`,
config
)
}

export async function postGroupProjects(
Expand All @@ -117,14 +126,18 @@ export async function postGroupProjects(
return await useAPI(`organization/${org}/people-group/${group_id}/project/add/`, {
body: projectsData,
method: 'POST',
}) //.data.value
})
}

export async function removeGroupProject(org: string, group_id: number, projectsData: any) {
export async function removeGroupProject(
org: string,
group_id: number,
projectsData: PostGroupProjects
) {
return await useAPI(`organization/${org}/people-group/${group_id}/project/remove/`, {
body: projectsData,
method: 'POST',
}) //.data.value
})
}

// GROUP HEADER
Expand All @@ -133,12 +146,70 @@ export async function postGroupHeader(org: string, group_id: number, headerData:
return await useAPI(`organization/${org}/people-group/${group_id}/header/`, {
body: headerData,
method: 'POST',
}) //.data.value
})
}

export async function patchGroupHeader(org: string, group_id: number, headerData: FormData) {
return await useAPI(`organization/${org}/people-group/${group_id}/header/`, {
body: headerData,
method: 'PATCH',
}) //.data.value
})
}

export async function getGroupSimilar(organizationCode: string, groupId: number, config = {}) {
return await useAPI<PaginationResult<PeopleGroupModel>>(
`organization/${organizationCode}/people-group/${groupId}/similars/`,
config
)
}

export async function getSubGroup(organizationCode: string, groupId: number, config = {}) {
return await useAPI<PaginationResult<PeopleGroupModel>>(
`organization/${organizationCode}/people-group/${groupId}/subgroups/`,
config
)
}

export async function getGroupLocation(organizationCode: string, groupId: number, config = {}) {
return await useAPI<PaginationResult<LocationModel>>(
`organization/${organizationCode}/people-group/${groupId}/locations/`,
config
)
}

export function getGroupGallery(organizationCode: string, groupId: number, config = {}) {
return useAPI<PaginationResult<ImageModel>>(
`organization/${organizationCode}/people-group/${groupId}/gallery/`,
{
...config,
}
)
}

export function deleteGroupGallery(
organizationCode: string,
groupId: number,
imageId: number,
config = {}
) {
return useAPI<ImageModel>(
`organization/${organizationCode}/people-group/${groupId}/gallery/${imageId}/`,
{
...config,
method: 'DELETE',
}
)
}

export function postGroupGallery(
organizationCode: string,
groupId: number,
body: FormData,
config = {}
) {
return useAPI<ImageModel>(`organization/${organizationCode}/people-group/${groupId}/gallery/`, {
...config,
body,
method: 'POST',
})
}
10 changes: 2 additions & 8 deletions src/api/locations.services.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import type { LocationModel, ProjectLocationForm } from '@/models/location.model'
import useAPI from '@/composables/useAPI'
import utils from '@/functs/functions'
import { Locations } from '@/interfaces/maps'

export async function getProjectLocations(projectId: number) {
Expand All @@ -11,13 +10,8 @@ export async function getProjectLocation(projectId: string, locationId: number)
return await useAPI<LocationModel>(`project/${projectId}/location/${locationId}/`)
}

export async function getLocations(params, next) {
if (next) {
// TODO: nuxt check next works
return await useAPI<Locations>(next, {}) //.data.value
}

return await useAPI<Locations>(`location/`, { ...utils.adaptParam(params) }) //.data.value
export async function getLocations(organizationCode: string, config = {}) {
return await useAPI<Locations>(`organization/${organizationCode}/location/`, config)
}

export async function postLocations(projectId: string, body: ProjectLocationForm) {
Expand Down
Loading
Loading