Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
52e50b9
add profile search with institution widget
xkopenreview Nov 3, 2025
15ee807
edit authors; show institutions
xkopenreview Nov 4, 2025
4bce84a
reorder only
xkopenreview Nov 5, 2025
680f85f
support reorder with institution change
xkopenreview Nov 5, 2025
14e426d
clean up
xkopenreview Nov 5, 2025
897d26a
Merge branch 'master' into fix/profile-search-institution
xkopenreview Nov 5, 2025
0b71cd5
fix some issues; add some tests
xkopenreview Nov 7, 2025
fe336f1
support obj author with no institution property
xkopenreview Nov 12, 2025
da06d51
update handling of no institution
xkopenreview Nov 12, 2025
7972463
update has institution logic
xkopenreview Nov 13, 2025
6d81e49
update institutuion logic and test
xkopenreview Nov 13, 2025
5c16b04
Merge branch 'master' into fix/profile-search-institution
xkopenreview Nov 14, 2025
47e17ed
filter search obj authors
xkopenreview Nov 14, 2025
c0fe9b5
filtering in reject paper status tab
xkopenreview Nov 14, 2025
c89b443
Merge branch 'master' into fix/profile-search-institution
xkopenreview Nov 17, 2025
c79241a
ac/ethics chair console author search
xkopenreview Nov 17, 2025
47c2503
Merge branch 'master' into fix/profile-search-institution
xkopenreview Nov 17, 2025
135ecc6
fix publication display in profile compare
xkopenreview Nov 17, 2025
94d96a4
fix: update author handling in edge browser NoteEntity component
xkopenreview Nov 17, 2025
170c2b5
json editor
xkopenreview Nov 18, 2025
b0f0733
test push
melisabok Nov 18, 2025
b3abbd7
Merge branch 'fix/profile-search-institution' of github.com:openrevie…
melisabok Nov 20, 2025
0a4992b
Merge branch 'master' into fix/profile-search-institution
xkopenreview Nov 24, 2025
e944732
remove .value in author display
xkopenreview Nov 24, 2025
848c9eb
Merge branch 'master' into fix/profile-search-institution
melisabok Nov 25, 2025
6eccb3c
Merge branch 'master' into fix/profile-search-institution
xkopenreview Jan 21, 2026
372d4d5
update error parsing and error style
xkopenreview Jan 22, 2026
6388ace
Merge branch 'master' into fix/profile-search-institution
xkopenreview Jan 22, 2026
d278768
Merge branch 'master' into fix/profile-search-institution
xkopenreview Feb 19, 2026
3bb01f3
update author display logic; dblp import wip
xkopenreview Feb 20, 2026
ad3ed5f
Merge branch 'master' into fix/profile-search-institution
xkopenreview Feb 27, 2026
5c61d06
handle existing paper with object author schema
xkopenreview Feb 27, 2026
2d1d322
resolve conflict
xkopenreview Mar 16, 2026
f3de537
resolve conflict
xkopenreview Mar 16, 2026
44490b4
Merge branch 'master' into fix/profile-search-institution
xkopenreview Mar 16, 2026
5541417
run fmt
xkopenreview Mar 16, 2026
4b42156
Merge branch 'master' into fix/profile-search-institution
melisabok Mar 25, 2026
5666f7f
Merge branch 'master' into fix/profile-search-institution
xkopenreview Mar 30, 2026
41ff57f
Merge branch 'master' into fix/profile-search-institution
melisabok Mar 30, 2026
781d09a
Merge branch 'fix/profile-search-institution' of github.com:openrevie…
melisabok Mar 30, 2026
060829a
Merge branch 'master' into fix/profile-search-institution
melisabok Apr 1, 2026
5bee344
Merge branch 'fix/profile-search-institution' of github.com:openrevie…
melisabok Apr 1, 2026
9e53356
Merge branch 'master' into fix/profile-search-institution
xkopenreview Apr 1, 2026
48a3b25
Merge branch 'fix/profile-search-institution' of github.com:openrevie…
melisabok Apr 1, 2026
92b582b
Merge branch 'master' into fix/profile-search-institution
xkopenreview Apr 3, 2026
070ae62
fix some issues Melisa and ai found
xkopenreview Apr 3, 2026
a88f53a
change orcid import to use object authors
xkopenreview Apr 3, 2026
12fc8b5
Merge branch 'fix/profile-search-institution' of github.com:openrevie…
melisabok Apr 6, 2026
19d8d18
Merge branch 'master' into fix/profile-search-institution
melisabok Apr 6, 2026
6143a4b
Merge branch 'fix/profile-search-institution' of github.com:openrevie…
melisabok Apr 6, 2026
a12c95b
Enhance author handling in postOrUpdateOrcidPaper function and improv…
xkopenreview Apr 6, 2026
5992ae1
Merge branch 'master' into fix/profile-search-institution
melisabok Apr 7, 2026
3a52956
Merge branch 'fix/profile-search-institution' of github.com:openrevie…
melisabok Apr 7, 2026
360a6fd
pass author name
melisabok Apr 7, 2026
54ca98a
Merge branch 'master' into fix/profile-search-institution
xkopenreview Apr 8, 2026
4d41efc
Merge branch 'master' into fix/profile-search-institution
xkopenreview Apr 9, 2026
1db48f2
pass author name when using Author_Removal invitation to unlink publi…
xkopenreview Apr 9, 2026
064afc5
Merge branch 'master' into fix/profile-search-institution
melisabok Apr 15, 2026
3a0a2f6
Merge branch 'master' into fix/profile-search-institution
melisabok Apr 16, 2026
1f7fec5
Merge branch 'master' into fix/profile-search-institution
melisabok Apr 17, 2026
bc96451
Merge branch 'master' into fix/profile-search-institution
xkopenreview Apr 21, 2026
cbd599e
Merge branch 'master' into fix/profile-search-institution
melisabok Apr 21, 2026
0e8f4b5
fix author handling logic
xkopenreview Apr 21, 2026
1206629
Merge branch 'fix/profile-search-institution' of https://github.com/o…
xkopenreview Apr 21, 2026
a344d69
Fix author handling logic in AreaChairConsole, EthicsChairPaperStatus…
xkopenreview Apr 22, 2026
cb55ae9
Merge branch 'master' into fix/profile-search-institution
xkopenreview Apr 22, 2026
ff34e3a
Merge branch 'master' into fix/profile-search-institution
xkopenreview Apr 23, 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
21 changes: 9 additions & 12 deletions app/profile/compare/comparePage.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@

import { useSearchParams } from 'next/navigation'
import { Suspense, useEffect, useState } from 'react'
import ErrorDisplay from '../../../components/ErrorDisplay'
import LoadingSpinner from '../../../components/LoadingSpinner'
import api from '../../../lib/api-client'
import { prettyId } from '../../../lib/utils'
import { getNoteAuthorIds, getNoteAuthors, prettyId } from '../../../lib/utils'
import CommonLayout from '../../CommonLayout'
import Compare from './Compare'

import styles from './Compare.module.scss'
import ErrorDisplay from '../../../components/ErrorDisplay'
import CommonLayout from '../../CommonLayout'
import LoadingSpinner from '../../../components/LoadingSpinner'

const addMetadata = (profile, fieldName) => {
const localProfile = { ...profile }
Expand Down Expand Up @@ -111,14 +112,10 @@ function Page() {
publication.apiVersion === 1
? publication.content.title
: publication.content.title.value,
authors:
publication.apiVersion === 1
? publication.content.authors
: publication.content.authors.value,
authorids: (publication.apiVersion === 1
? publication.content.authorids
: publication.content.authorids.value
).filter((id) => id),
authors: getNoteAuthors(publication, publication.apiVersion !== 1),
authorids: getNoteAuthorIds(publication, publication.apiVersion !== 1).filter(
(id) => id
),
}))
}
return []
Expand Down
17 changes: 12 additions & 5 deletions app/profile/edit/page.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
'use client'

import { useRouter } from 'next/navigation'
/* globals promptMessage,promptError: false */
import { useEffect, useState } from 'react'
import { useRouter } from 'next/navigation'
import LoadingSpinner from '../../../components/LoadingSpinner'
import ProfileEditor from '../../../components/profile/ProfileEditor'
import useUser from '../../../hooks/useUser'
import api from '../../../lib/api-client'
import { formatProfileData } from '../../../lib/profiles'
import useUser from '../../../hooks/useUser'
import { getNoteAuthorIds, prettyId } from '../../../lib/utils'
import LimitedStateAlert from './LimitedStateAlert'

import styles from './Edit.module.scss'
import LoadingSpinner from '../../../components/LoadingSpinner'

export default function Page() {
const [profile, setProfile] = useState(null)
Expand All @@ -23,10 +25,10 @@ export default function Page() {
let authorIds
let invitation
if (note.invitations) {
authorIds = note.content.authorids?.value
authorIds = getNoteAuthorIds(note, true)
invitation = note.invitations[0]
} else {
authorIds = note.content.authorids
authorIds = getNoteAuthorIds(note, false)
// oxlint-disable-next-line prefer-destructuring
invitation = note.invitation
}
Expand All @@ -38,6 +40,7 @@ export default function Page() {
'OpenReview.net/Archive/-/Direct_Upload_Revision',
'DBLP.org/-/Record': 'DBLP.org/-/Author_Coreference',
[`${process.env.SUPER_USER}/Public_Article/ORCID.org/-/Record`]: `${process.env.SUPER_USER}/Public_Article/-/Author_Removal`,
[`${process.env.SUPER_USER}/Public_Article/DBLP.org/-/Record`]: `${process.env.SUPER_USER}/Public_Article/-/Author_Removal`,
}
if (!authorIds) {
throw new Error(`Note ${noteId} is missing author ids`)
Expand Down Expand Up @@ -73,6 +76,10 @@ export default function Page() {
content: {
author_index: { value: matchedIdx[0] },
author_id: { value: '' },
...(invitationMap[invitation] ===
`${process.env.SUPER_USER}/Public_Article/-/Author_Removal` && {
author_name: { value: prettyId(profileId) },
}),
},
}
: {
Expand Down
56 changes: 32 additions & 24 deletions components/DblpPublicationTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,28 +17,39 @@ export default function DblpPublicationTable({
orPublicationsImportedByOtherProfile,
maxNumberofPublicationsToImport,
}) {
const { user } = useUser(true)
const [profileIdsRequested, setProfileIdsRequested] = useState([])
const pubsCouldNotImport = [] // either existing or associated with other profile
const pubsCouldImport = []
dblpPublications.forEach((dblpPub) => {
const titleMatch = (orPub) =>
orPub.title === dblpPub.formattedTitle &&
orPub.authorCount === dblpPub.authorCount &&
orPub.venue === dblpPub.venue
const existing = orPublications.find(titleMatch)
const existingWithOtherProfile = orPublicationsImportedByOtherProfile.find(titleMatch)
if (existing || existingWithOtherProfile || dblpPub.authorIndex === -1) {
pubsCouldNotImport.push(dblpPub.key)
} else {
pubsCouldImport.push(dblpPub.key)

const categorizedDblpPublications = dblpPublications.map((dblpPub) => {
const externalIdOrtitleMatch = (orPub) =>
orPub.externalId === dblpPub.externalId ||
(orPub.title === dblpPub.formattedTitle &&
orPub.authorCount === dblpPub.authorCount &&
orPub.venue === dblpPub.venue)
const existing = orPublications.find(externalIdOrtitleMatch)
const existingWithOtherProfile =
orPublicationsImportedByOtherProfile.find(externalIdOrtitleMatch)

return {
...dblpPub,
existing,
existingWithOtherProfile,
couldNotImport: existing || existingWithOtherProfile || dblpPub.authorIndex === -1,
}
})
const allExistInOpenReview = dblpPublications.length === pubsCouldNotImport.length
const allChecked =
dblpPublications.length - pubsCouldNotImport.length === selectedPublications.length

const dblpPublicationsGroupedByYear = groupBy(dblpPublications, (p) => p.year)
const pubsCouldNotImport = categorizedDblpPublications.flatMap((p) =>
p.couldNotImport ? [p.key] : []
)
const pubsCouldImport = categorizedDblpPublications
.map((p) => p.key)
.filter((key) => !pubsCouldNotImport.includes(key))
const allExistInOpenReview = categorizedDblpPublications.length === pubsCouldNotImport.length
const allChecked =
categorizedDblpPublications.length - pubsCouldNotImport.length ===
selectedPublications.length

const dblpPublicationsGroupedByYear = groupBy(categorizedDblpPublications, (p) => p.year)
const toggleSelectAll = (checked) => {
if (!checked) {
setSelectedPublications([])
Expand Down Expand Up @@ -156,13 +167,9 @@ export default function DblpPublicationTable({
</>
),
body: publicationsOfYear.map((publication) => {
const titleMatch = (orPub) =>
orPub.title === publication.formattedTitle &&
orPub.authorCount === publication.authorCount &&
orPub.venue === publication.venue
const existingPublication = orPublications.find(titleMatch)
const existingPublication = publication.existing
const existingPublicationOfOtherProfile =
orPublicationsImportedByOtherProfile.find(titleMatch)
publication.existingWithOtherProfile
const category = existingPublication
? 'existing-publication'
: existingPublicationOfOtherProfile
Expand All @@ -186,6 +193,7 @@ export default function DblpPublicationTable({
source={publication.source}
profileIdsRequested={profileIdsRequested}
setProfileIdsRequested={setProfileIdsRequested}
user={user}
/>
)
}),
Expand Down Expand Up @@ -217,8 +225,8 @@ const DblpPublicationRow = ({
source,
profileIdsRequested,
setProfileIdsRequested,
user,
}) => {
const { user } = useUser(true)
const [error, setError] = useState(null)
const [profileMergeStatus, setProfileMergeStatus] = useState(null)
const profileMergeInvitationId = `${process.env.SUPER_USER}/Support/-/Profile_Merge`
Expand Down
61 changes: 58 additions & 3 deletions components/EditorComponents/ContentFieldEditor.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useContext, useState } from 'react'
import { get, set } from 'lodash'
import { get, set, unset } from 'lodash'
import EditorComponentContext from '../EditorComponentContext'
import { Tab, TabList, TabPanel, TabPanels, Tabs } from '../Tabs'
import CodeEditorWidget from './CodeEditorWidget'
Expand Down Expand Up @@ -150,6 +150,10 @@ const JsonEditor = ({ existingFields, onFieldChange }) => {
// { value: 'group', description: 'Group ID (Profile Search)' },
// { value: 'profile', description: 'Profile ID (Profile Search)' },
{ value: 'group[]', description: 'Group ID Array (Profile Search)' },
{
value: 'author{}',
description: 'Author Object (Profile Search with Institution)',
},
// { value: 'profile[]', description: 'Profile ID Array (Profile Search)' },
// { value: 'note', description: 'Note ID (Not implemented)' },
// { value: 'note[]', description: 'Note ID Array (Not implemented)' },
Expand Down Expand Up @@ -187,7 +191,7 @@ const JsonEditor = ({ existingFields, onFieldChange }) => {
},
},
shouldBeShown: (formData) =>
!['const', 'file', 'date', 'boolean', 'json'].includes(formData.dataType),
!['const', 'file', 'date', 'boolean', 'json', 'author{}'].includes(formData.dataType),
getValue: function (existingValue) {
return get(existingValue, this.valuePath)
},
Expand Down Expand Up @@ -432,12 +436,63 @@ const JsonEditor = ({ existingFields, onFieldChange }) => {
},
valuePath: 'value.param.markdown',
},
institution: {
order: 9,
description: 'whether to include institution info',
value: {
param: {
input: 'checkbox',
type: 'boolean',
enum: [{ value: true, description: 'Include institution info' }],
optional: true,
},
},
shouldBeShown: (formData) => formData.dataType === 'author{}',
getValue: function (existingValue) {
const hasInstitution = get(existingValue, this.valuePath)
return !!hasInstitution
},
valuePath: 'value.param.properties.institutions',
},
}

const onFormChange = (updatedForm) => {
const updatedField = Object.entries(fieldSpecificationsOfJsonField).reduce(
(prev, [key, config]) => {
if (config.valuePath) {
if (key === 'dataType' && updatedForm[key] === 'author{}') {
set(prev, config.valuePath, updatedForm[key])
set(prev, 'value.param.properties', {
fullname: { param: { type: 'string' } },
username: { param: { type: 'string' } },
})
} else if (key === 'institution') {
const includeInstitution = updatedForm[key]
// eslint-disable-next-line no-unused-expressions
includeInstitution
? set(prev, 'value.param.properties.institutions', {
param: {
type: 'object{}',
properties: {
name: {
param: {
type: 'string',
},
},
domain: {
param: {
type: 'string',
},
},
country: {
param: {
type: 'string',
},
},
},
},
})
: unset(prev, 'value.param.properties.institutions', undefined)
} else if (config.valuePath) {
set(prev, config.valuePath, updatedForm[key])
} else {
set(prev, key, updatedForm[key])
Expand Down
Loading