Integrate with NRP
Newsroom Planner uses other plugins functionality to complete some of its tasks.
For example NRP relying on Naviga Photos to handle searching for images and handle images metadata.
NRP uses Dashboard portals to render other plugins components in its own context.
Thanks to Dashboard mappings 🤓 you can replace Naviga Photos with your own image service portal
and integrate your plugin into NRP
What kind of portals NRP use?
NRP uses 4 different portals in order to search for images and link them or display images as a gallery or upload images.
Portal
Description
ImageSearch
Search for images and link them to an Assignment.
ImageGallery
Display Assignment's images.
ImageUpload
Upload Images, and link them to an Assignment.
ImageMetadata
Change Assignment's images metadata.
ImageSearch portal
This portal used to search for images and link the selected images to the active Assignment.
Where is it rendered?:
In My Assignment view:

In Assignment Detail view:


Props:
Name
Type
Description
onLink
Function
A callback function expected to be called with array of image's uuid, filename.
localizations
Object
A localizations object contains localized strings.
editMode
Boolean
A flag to tell the portal that NRP in an edit mode or not.
Example:
const MySearchPortal = props => {
const [selectedImages, setSelectedImages] = useState([])
const {
onLink
} = props
const handleOnSelect = selectedImage => {
const images = selectedImages.push(selectedImage)
setSelectedImages(images)
}
const handleLinkImages = () => {
/*
selectedImages format:
[
{
filename: 'myImage.jpg'
uuid: '123-123-321321-123-123'
},
{
filename: 'logo.jpg'
uuid: '444-423-774238-321-006'
}
]
*/
onLink(selectedImages)
}
return (
<div>
<SearchInput />
<LinkButton onClick={handleLinkImages}/>
<ImagesWrapper onSelect={handleOnSelect}>
<img />
<img />
<img />
<img />
<img />
</ImagesWrapper>
</div>
)
}
localizations:
Supports English & Swedish
console.log(this.props.localizations)
/*
{
link: 'Link selected photos'
}
*/
How NRP render ImageSearch:
const ImageSearchWrapper = props => {
const {
editMode,
localize,
linkImagesToAssignment
} = props
const handleOnLink = selectedImages => {
linkImagesToAssignment(selectedImages)
}
return (
<div>
<ImageSearch
editMode={editMode}
onLink={handlOnLink}
localizations={{
link: localize('linkSelectedPhotos')
}}
/>
</div>
)
}
ImageGallery portal
This portal used to display the active assignment's images
Where is it rendered?:
In My Assignment view:

In Assignment Detail view:


Props:
Name
Type
Description
onSave
Function
A callback function expected to be called if the portal made any changes to the mages.
onCancel
Function
A callback function expected to be called if the portal made any changes to the images.
closeConfirm
Function
A callback helper function to close the confirm dialog if it's triggered.
onSelection
Function
A callback function expected to be called with all the images and a boolean for the selected images. Used in My Assignment view more info below
images
Array
An array of the Assignment images.
editMode
Boolean
A boolean to tell the portal that NRP in an edit mode or not.
managePhotos
Boolean
A boolean to tell the portal if it can handle images metadata or not.
fullWidth
Boolean
A boolean to tell the portal if it's rendered within My Assignment view or Assignment Detail view more info below
localizations
Object
A localizations object contains localized strings.
NRP require some methods to be accessible from NRP components more info below
Example:
const MyGalleryPortal = (props, ref) => {
const [images, setImages] = useState(props.images)
const {
onSave,
onCancel,
onSelection
} = props
useEffect(() => {
/*
Methods will be called by NRP.
*/
if (ref && ref.current) {
ref.current = {
selectAll: () => {},
deselectAll: () => {},
updateImages: () => {}
}
}
})
const handleOnSelect = selectedImage => {
const mappedItems = images.map(item => {
if (item.uuid === selectedImage.uuid) {
return {
...item,
selected: true
}
} else {
return item
}
})
setImages(mappedItems)
// Update NRP with updated images
onSelection(mappedItems)
}
return (
<div>
<SearchInput />
<LinkButton onClick={handleLinkImages}/>
<ImagesWrapper onSelect={handleOnSelect}>
<img />
<img />
<img />
<img />
<img />
</ImagesWrapper>
</div>
)
}
export default forwardRef(MyGalleryPortal)
localizations:
Supports English & Swedish
console.log(this.props.localizations)
/*
{
link: 'Link selected photos'
}
*/
Functions should be accessible from NRP provided by ImageGallery portal:
updateImages
A function will give the updated images from the Assignment.
selectAll
A function to handle selecting all images.
deselectAll
A function to handle deselect all images.
How NRP render ImageGallery:
const MyAssignmentPortalWrapper = props => {
const {
assignment,
confirm,
closeConfirm,
closeGallery,
resetImageGalleryPortal
} = props
const imageGalleryRef = useRef()
/*
This hook will track the active Assignemnt
if the user clicked on another assignment to show the images
this hook will call "updateImages" function from ImageGallery
portal and pass the new active Assignment's images
*/
useEffect(() => {
if (imageGalleryRef.current && typeof imageGalleryRef.current.updateImages === 'function') {
const updatedImages = assignment.images.map(item => {
return {
uuid: item.uuid,
filename: item.filename
}
})
imageGalleryRef.current.updateImages(updatedImages)
}
}, [assignment.uuid])
const handleReset = () => {
resetImageGalleryPortal()
}
const handleOnClose = () => {
if (imageGalleryRef.current) {
if (typeof imageGalleryRef.current.cancel === 'function') {
imageGalleryRef.current.cancel()
}
}
closeGallery()
}
const images = assignment.images.map(item => {
return {
uuid: item.uuid,
filename: item.filename
}
})
return (
<div>
<CloseButton onClick={handleOnClose}/>
<ImageGallery
editMode={true}
managePhotos={true}
confirm={confirm}
images={assignment.images}
ref={imageGalleryRef}
onSave={handleReset}
onCancel={handleReset}
closeConfirm={closeConfirm}
key={imageGalleryRenderKey}
/>
</div>
)
}
ImageUpload portal
This portal used to upload images, and provide the uploaded images to be linked to the active assignment.
Where is it rendered?:
In My Assignment view:

Props:
Name
Type
Description
onDone
Function
A callback function expected to be called with images array when the images has been uploaded.
onUpload
Function
A callback function expected to be called when the portal starts uploading images.
onCancel
Function
A callback function expected to be called when the user cancel uploading images.
closeConfirm
Function
A callback helper function to close the confirm dialog if it's triggered.
NRP require some methods to be accessible from NRP components more info below
Example:
const MyUploadPortal = (props, ref) => {
const [selectedFile, setSelectedFile] = useState(null)
const {
onDone,
onUpload,
onCancel
} = props
useEffect(() => {
/*
Methods will be called by NRP.
*/
if (ref && ref.current) {
ref.current = {
cancel: cancelProccess
}
}
})
const handlePhotos = file => {
setSelectedFile(file)
}
const handleUpload = () => {
if (selectedFile) {
onUpload()
fetch('api/upload', {selectedFile})
.then((response) => {
const uploadedImages = response.images.map(item => {
return {
uuid: item.uuid,
filename: item.filename
}
})
onDone(uploadedImages)
})
}
}
const handleCancel = () => {
cancelProccess()
onCancel()
}
const cancelProcesses = () => {
// cacnel on going processes...
}
return (
<div>
<BrowsButton onChange={handlePhotos}/>
<UploadButton onClick={handleUpload}/>
<CancelButton onClick={handleCancel}/>
</div>
)
}
export default forwardRef(MyUploadPortal)
Functions should be accessible from NRP provided by ImageUpload portal:
cancel
A function will be called when the ImageUpload portal is unmounted to clean up onGoing processes for example.
How NRP render ImageUpload:
const MyAssignmentPortalWrapper = props => {
const {
assignment,
confirm,
closeConfirm,
closeUploadPortal
} = props
const imageUploadRef = useRef()
const handleOnClose = () => {
if (imageUploadRef.current) {
if (typeof imageUploadRef.current.cancel === 'function') {
imageUploadRef.current.cancel()
}
}
closeUploadPortal()
}
const handleUploadedImages = uploadedImages => {
assignment.linkImages(uploadedImages)
}
const handleOnUploadStart = () => {
assignment.setUploadingFlag()
}
return (
<div>
<CloseButton onClick={handleOnClose}/>
<ImageUpload
confirm={confirm}
ref={imageUploadRef}
onCancel={handleOnCancel}
closeConfirm={closeConfirm}
onDone={handleUploadedImages}
onUpload={handleOnUploadStart}
/>
</div>
)
}
ImageMetadata portal
This portal used to change images metadata
Where is it rendered?:
In Assignment Detail view:


Props:
Name
Type
Description
images
Array
An array of the selected images to change metadata on them.
onSave
Function
A callback function expected to be called when the user done with updating metadata for the images.
onCancel
Function
A callback function expected to be called when the user cancel updating images metadata.
closeConfirm
Function
A callback helper function to close the confirm dialog if it's triggered.
NRP require some methods to be accessible from NRP components more info below
Example:
const MyMetadataPortal = (props, ref) => {
const {
images,
onSave,
onCancel
} = props
useEffect(() => {
/*
Methods will be called by NRP.
*/
if (ref && ref.current) {
ref.current = {
cancel: cancelProccess
}
}
})
const handleSave = () => {
// Update images metadata
onSave()
}
const handleCancel = () => {
cancelProccess()
onCancel()
}
const cancelProcesses = () => {
// cacnel on going processes...
}
const selectedImages = images.map(image => {
return (
<div key={image.uuid}>
<TakenByField />
...
<img />
</div>
)
})
return (
<div>
<SaveButton onChange={handleSave}/>
<CancelButton onClick={handleCancel}/>
{ selectedImages }
</div>
)
}
export default forwardRef(MyUploadPortal)
Functions should be accessible from NRP provided by ImageMetadata portal:
cancel
A function will be called when the ImageMetadata portal is unmounted to clean up onGoing processes for example.
How NRP render ImageMetadata:
const MyAssignmentPortalWrapper = props => {
const {
selectedImages,
confirm,
closeConfirm,
closeMetadataPortal
} = props
const imageMetadataRef = useRef()
const handleOnClose = () => {
if (imageMetadataRef.current) {
if (typeof imageMetadataRef.current.cancel === 'function') {
imageMetadataRef.current.cancel()
}
}
closeMetadataPortal()
}
const handleOnSave = () => {
closeMetadataPortal()
}
const handleOnCancel = () => {
closeMetadataPortal()
}
return (
<div>
<CloseButton onClick={closeMetadataPortal}/>
<ImageMetadata
images={selectedImages}
confirm={confirm}
onSave={handleOnSave}
onCancel={handleOnCancel}
ref={imageMetadataRef}
closeConfirm={closeConfirm}
/>
</div>
)
}
Last updated
Was this helpful?