Skip to content

Commit

Permalink
warn about incompatible extensions (#4648)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomaskikutis authored Sep 29, 2024
1 parent 8f84727 commit f31d008
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 22 deletions.
5 changes: 5 additions & 0 deletions e2e/client/playwright/multiedit.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ test.describe('Multiedit', async () => {

await multiedit.save('story 2');

/**
* TAG: AUTHORING-ANGULAR implementation is unreliable and "Exit" button doesn't always work
*/
page.waitForTimeout(1000);

await page.locator(s('multiedit-subnav')).getByRole('button', {name: 'Exit'}).click();

await monitoring.executeActionOnMonitoringItem(
Expand Down
5 changes: 5 additions & 0 deletions scripts/core/superdesk-api.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,11 @@ declare module 'superdesk-api' {
authoringTopbar2Widgets?: Array<React.ComponentType<{article: IArticle}>>;

authoringSideWidgets?: Array<IArticleSideWidget>;

/**
* @deprecated
* use customFieldTypes
*/
authoringHeaderComponents?: Array<AuthoringHeaderItem>;

getAuthoringActions?(
Expand Down
13 changes: 7 additions & 6 deletions scripts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,13 @@ export function startApp(
}

registerLegacyExtensionCompatibilityLayer();

if (
ng.get('session').sessionId != null // user logged in
&& ng.get('session').identity.user_type === 'administrator'
) {
maybeDisplayInvalidInstanceConfigurationMessage();
}
});
});
},
Expand All @@ -183,12 +190,6 @@ export function startApp(
'superdesk.register_extensions',
].concat(appConfig.apps || []), {strictDi: true});

setTimeout(() => { // required to avoid protractor timing out and failing tests
if (ng.get('session').sessionId != null) { // user logged in
maybeDisplayInvalidInstanceConfigurationMessage();
}
});

window['superdeskIsReady'] = true;

body.attr('data-theme', 'dark-ui');
Expand Down
68 changes: 52 additions & 16 deletions scripts/validate-instance-configuration.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,77 @@ import {Modal} from 'superdesk-ui-framework/react';
import ng from 'core/services/ng';
import {gettext} from 'core/utils';
import {showModal} from '@superdesk/common';
import {authoringReactEnabledUserSelection, extensions} from 'appConfig';
import {flatMap} from 'lodash';

const modalHeader = (
<span
style={{background: 'red', color: 'white', padding: 4}}
>
{gettext('Instance configuration is missing!')}
</span>
);
interface IError {
title: string;
content: React.ReactNode;
}

export function maybeDisplayInvalidInstanceConfigurationMessage() {
const issues: Array<React.ReactNode> = [];
function getError(): Promise<IError | null> {
const authoringHeaderComponentsFromExtensions = flatMap(
Object.values(extensions),
(extension) => extension.activationResult?.contributions?.authoringHeaderComponents ?? [],
);

if (authoringHeaderComponentsFromExtensions.length > 0 && authoringReactEnabledUserSelection === true) {
return Promise.resolve({
title: 'Incompatible extension detected',
content: (
<>
<p>
Unsupported extension point is being used: `contributions.authoringHeaderComponents`
</p>

<p>
You are likely running an outdated version of auto tagging extension.
</p>

ng.get('vocabularies').getAllActiveVocabularies().then((vocabularies) => {
<p>
Update or disable incompatible extensions.
</p>
</>
),
});
}

return ng.get('vocabularies').getAllActiveVocabularies().then((vocabularies) => {
const categoriesMissing = vocabularies.find(({_id}) => _id === 'categories') == null;

if (categoriesMissing) {
issues.push(
(
return {
title: 'Instance configuration is missing!',
content: (
<>
<p>{gettext('Vocabulary with ID "categories" is required.')}</p>
<p>{gettext('Add it via Settings > Metadata')}</p>
</>
),
);
};
} else {
return null;
}
});
}

if (issues.length > 0) {
export function maybeDisplayInvalidInstanceConfigurationMessage() {
getError().then((error) => {
if (error != null) {
showModal(({closeModal}) => (
<Modal
visible={true}
headerTemplate={modalHeader}
headerTemplate={(
<span
style={{background: 'red', color: 'white', padding: 4}}
>
{error.title}
</span>
)}
onHide={closeModal}
zIndex={9999}
>
{issues[0]}
{error.content}
</Modal>
));
}
Expand Down

0 comments on commit f31d008

Please sign in to comment.