diff --git a/lib/Notes/NoteForm/NoteView.js b/lib/Notes/NoteForm/NoteView.js index 606351889..8bdacfade 100644 --- a/lib/Notes/NoteForm/NoteView.js +++ b/lib/Notes/NoteForm/NoteView.js @@ -19,6 +19,7 @@ import { KeyValue, } from '@folio/stripes-components'; +import { NOTE_LINKS_MIN_NUMBER } from '../constants'; import AssignmentsList from '../AssignmentsList'; import ReferredRecord from '../ReferredRecord'; import styles from './NoteForm.css'; @@ -143,7 +144,7 @@ export default class NoteView extends Component { referredEntityData, } = this.props; - const hasMoreThanOneAssignment = get(noteData, 'links.length', 0) > 1; + const hasMoreThanOneAssignment = get(noteData, 'links.length', 0) > NOTE_LINKS_MIN_NUMBER; const canUnassign = hasMoreThanOneAssignment && referredEntityData; return ( diff --git a/lib/Notes/NotesAccordion/components/NotesAssigningModal/NotesAssigningModal.css b/lib/Notes/NotesAccordion/components/NotesAssigningModal/NotesAssigningModal.css index ecaf1e977..a8f5d36f2 100644 --- a/lib/Notes/NotesAccordion/components/NotesAssigningModal/NotesAssigningModal.css +++ b/lib/Notes/NotesAccordion/components/NotesAssigningModal/NotesAssigningModal.css @@ -9,8 +9,8 @@ } .assign-checkbox label::before { - margin-left: 10px; - margin-right: 10px; + margin-left: 5px; + margin-right: 5px; } .assign-checkbox label::after { diff --git a/lib/Notes/NotesAccordion/components/NotesAssigningModal/NotesAssigningModal.js b/lib/Notes/NotesAccordion/components/NotesAssigningModal/NotesAssigningModal.js index 6572d7c80..b97e738b4 100644 --- a/lib/Notes/NotesAccordion/components/NotesAssigningModal/NotesAssigningModal.js +++ b/lib/Notes/NotesAccordion/components/NotesAssigningModal/NotesAssigningModal.js @@ -27,6 +27,7 @@ import { import { notesStatuses, sortOrders, + NOTE_LINKS_MIN_NUMBER, } from '../../../constants'; import { @@ -65,6 +66,7 @@ const notesStatusOptions = [ const noteShape = PropTypes.shape({ id: PropTypes.string.isRequired, + linksNumber: PropTypes.number.isRequired, status: PropTypes.oneOf([ASSIGNED, UNASSIGNED]), title: PropTypes.node.isRequired, }); @@ -113,20 +115,27 @@ export default class NotesAssigningModal extends React.Component { }; firstColumnHeaderFormatter = { - [ASSIGNING]: (record) => { - const isAssigned = record.status === ASSIGNED; + [ASSIGNING]: (note) => { + const isAssigned = note.status === ASSIGNED; + const isDisabled = isAssigned && this.getNoteLinksNumber(note) === NOTE_LINKS_MIN_NUMBER; return ( this.onSingleAssignClick(record)} + onClick={() => this.onSingleAssignClick(note)} /> ); }, }; + getNoteLinksNumber(note) { + const newStatus = this.state.changedNoteIdToStatusMap.get(note.id); + return newStatus === ASSIGNED ? note.linksNumber + 1 : note.linksNumber; + } + onSingleAssignClick = (note) => { this.setState((state, props) => { return { @@ -194,10 +203,13 @@ export default class NotesAssigningModal extends React.Component { selectedStatusFilters, } = this.state; - this.props.onSearch({ - query, - selectedStatusFilters, - }); + this.setState( + { changedNoteIdToStatusMap: new Map() }, + this.props.onSearch({ + query, + selectedStatusFilters, + }) + ); } onSearchQueryChange = (event) => { @@ -246,12 +258,14 @@ export default class NotesAssigningModal extends React.Component { }; }; + getColumnMapping = () => { return { [ASSIGNING]: ( @@ -261,6 +275,21 @@ export default class NotesAssigningModal extends React.Component { }; } + isEveryNoteAssigned() { + const { notes } = this.props; + const incomingAssignedNotes = notes.items.filter((note) => note.status === ASSIGNED); + + let potentialAssignedNotesCount = 0; + + for (const potentialStatus of this.state.changedNoteIdToStatusMap.values()) { + if (potentialStatus === ASSIGNED) { + potentialAssignedNotesCount++; + } + } + + return incomingAssignedNotes.length + potentialAssignedNotesCount === notes.items.length; + } + onAssignAllClick = (event) => { const { checked } = event.target; @@ -270,6 +299,9 @@ export default class NotesAssigningModal extends React.Component { this.props.notes.items.forEach((curIncomingNote) => { if (curIncomingNote.status !== newStatus) { + if (newStatus === UNASSIGNED && this.getNoteLinksNumber(curIncomingNote) === NOTE_LINKS_MIN_NUMBER) { + return; + } newChangedNoteIdToStatusMap.set(curIncomingNote.id, newStatus); } else { newChangedNoteIdToStatusMap.delete(curIncomingNote.id); @@ -311,10 +343,17 @@ export default class NotesAssigningModal extends React.Component { const { fetchDomainNotes, + notes, } = this.props; + const offset = get(this.props, 'notes.items.length'); + + if (offset === notes.totalCount) { + return; + } + fetchDomainNotes({ - offset: get(this.props, 'notes.items.length'), + offset, query, selectedStatusFilters, }); diff --git a/lib/Notes/NotesSmartAccordion/NotesSmartAccordion.js b/lib/Notes/NotesSmartAccordion/NotesSmartAccordion.js index 419514bfa..12ebc51f9 100644 --- a/lib/Notes/NotesSmartAccordion/NotesSmartAccordion.js +++ b/lib/Notes/NotesSmartAccordion/NotesSmartAccordion.js @@ -119,6 +119,7 @@ class NotesSmartAccordion extends Component { return { ...pick(domainNote, ['id', 'title']), status, + linksNumber: domainNote.links.length, }; }); diff --git a/lib/Notes/constants.js b/lib/Notes/constants.js index 7083bcdcf..da2ccb7fb 100644 --- a/lib/Notes/constants.js +++ b/lib/Notes/constants.js @@ -13,3 +13,5 @@ export const sortOrders = { }; export const STATUS_FILTERS_NUMBER = 2; + +export const NOTE_LINKS_MIN_NUMBER = 1;