diff --git a/.changeset/clever-plums-decide.md b/.changeset/clever-plums-decide.md new file mode 100644 index 0000000000..7d01792f00 --- /dev/null +++ b/.changeset/clever-plums-decide.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-bazaar-backend': patch +'@backstage/plugin-bazaar': patch +--- + +Added the `docs` parameter (optional) to link the project documentation diff --git a/plugins/bazaar-backend/migrations/20230407142544_add_docs_to_metadata.js b/plugins/bazaar-backend/migrations/20230407142544_add_docs_to_metadata.js new file mode 100644 index 0000000000..de73308431 --- /dev/null +++ b/plugins/bazaar-backend/migrations/20230407142544_add_docs_to_metadata.js @@ -0,0 +1,37 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// @ts-check + +/** + * @param { import("knex").Knex } knex + * @returns { Promise } + */ +exports.up = async function up(knex) { + await knex.schema.alterTable('metadata', table => { + table.text('docs').comment('The link to the project docs (optional)'); + }); +}; + +/** + * @param { import("knex").Knex } knex + * @returns { Promise } + */ +exports.down = async function down(knex) { + await knex.schema.alterTable('metadata', table => { + table.dropColumn('docs'); + }); +}; diff --git a/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts b/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts index 8978679ff4..0c78dbdd87 100644 --- a/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts +++ b/plugins/bazaar-backend/src/service/DatabaseHandler.test.ts @@ -29,6 +29,7 @@ const bazaarProject: any = { endDate: null, size: 'small', responsible: 'r', + docs: '', }; jest.setTimeout(60_000); @@ -75,6 +76,7 @@ describe('DatabaseHandler', () => { end_date: bazaarProject.endDate, size: bazaarProject.size, responsible: bazaarProject.responsible, + docs: bazaarProject.docs, }); // Add a member to the project @@ -94,6 +96,7 @@ describe('DatabaseHandler', () => { expect(res[0].end_date).toEqual(null); expect(res[0].size).toEqual('small'); expect(res[0].responsible).toEqual('r'); + expect(res[0].docs).toEqual(''); expect( res[0].members_count === '1' || res[0].members_count === 1, ).toBeTruthy(); diff --git a/plugins/bazaar-backend/src/service/DatabaseHandler.ts b/plugins/bazaar-backend/src/service/DatabaseHandler.ts index f75ea8b782..1d3c231409 100644 --- a/plugins/bazaar-backend/src/service/DatabaseHandler.ts +++ b/plugins/bazaar-backend/src/service/DatabaseHandler.ts @@ -61,6 +61,7 @@ export class DatabaseHandler { 'metadata.start_date', 'metadata.end_date', 'metadata.responsible', + 'metadata.docs', ]; async getMembers(id: string) { @@ -120,6 +121,7 @@ export class DatabaseHandler { entityRef, community, description, + docs, status, size, startDate, @@ -133,6 +135,7 @@ export class DatabaseHandler { entity_ref: entityRef, community, description, + docs, status, updated_at: new Date().toISOString(), size, @@ -150,6 +153,7 @@ export class DatabaseHandler { entityRef, community, description, + docs, status, size, startDate, @@ -162,6 +166,7 @@ export class DatabaseHandler { entity_ref: entityRef, description, community, + docs, status, updated_at: new Date().toISOString(), size, diff --git a/plugins/bazaar/README.md b/plugins/bazaar/README.md index bd4589f2d3..9b5fb466df 100644 --- a/plugins/bazaar/README.md +++ b/plugins/bazaar/README.md @@ -127,6 +127,7 @@ The other fields are: - project - link Bazaar project to existing entity in the catalog - community link - link to where the project members can communicate, e.g. Teams or Discord link +- docs link - link to visit the documentation of the project - start date - end date diff --git a/plugins/bazaar/src/components/AddProjectDialog/AddProjectDialog.tsx b/plugins/bazaar/src/components/AddProjectDialog/AddProjectDialog.tsx index 45392206d9..c07ae0cfd1 100644 --- a/plugins/bazaar/src/components/AddProjectDialog/AddProjectDialog.tsx +++ b/plugins/bazaar/src/components/AddProjectDialog/AddProjectDialog.tsx @@ -45,6 +45,7 @@ export const AddProjectDialog = ({ title: '', community: '', description: '', + docs: '', status: 'proposed' as Status, size: 'medium' as Size, responsible: '', diff --git a/plugins/bazaar/src/components/EntityBazaarInfoContent/EntityBazaarInfoContent.tsx b/plugins/bazaar/src/components/EntityBazaarInfoContent/EntityBazaarInfoContent.tsx index e0a3a9b881..0c7b0bb126 100644 --- a/plugins/bazaar/src/components/EntityBazaarInfoContent/EntityBazaarInfoContent.tsx +++ b/plugins/bazaar/src/components/EntityBazaarInfoContent/EntityBazaarInfoContent.tsx @@ -26,6 +26,7 @@ import ChatIcon from '@material-ui/icons/Chat'; import PersonAddIcon from '@material-ui/icons/PersonAdd'; import DashboardIcon from '@material-ui/icons/Dashboard'; import LinkOffIcon from '@material-ui/icons/LinkOff'; +import Description from '@material-ui/icons/Description'; import { EditProjectDialog } from '../EditProjectDialog'; import { useApi, identityApiRef } from '@backstage/core-plugin-api'; import { BazaarProject, Member } from '../../types'; @@ -128,6 +129,12 @@ export const EntityBazaarInfoContent = ({ href: bazaarProject?.community, disabled: bazaarProject?.community === '' || !isMember, }, + { + label: 'Docs', + icon: , + href: bazaarProject?.docs, + disabled: bazaarProject?.docs === null || bazaarProject?.docs === '', + }, ]; const handleEditClose = () => { diff --git a/plugins/bazaar/src/components/HomePageBazaarInfoCard/HomePageBazaarInfoCard.tsx b/plugins/bazaar/src/components/HomePageBazaarInfoCard/HomePageBazaarInfoCard.tsx index 7c6491c8a5..782b7d3c67 100644 --- a/plugins/bazaar/src/components/HomePageBazaarInfoCard/HomePageBazaarInfoCard.tsx +++ b/plugins/bazaar/src/components/HomePageBazaarInfoCard/HomePageBazaarInfoCard.tsx @@ -34,6 +34,7 @@ import InsertLinkIcon from '@material-ui/icons/InsertLink'; import DashboardIcon from '@material-ui/icons/Dashboard'; import CloseIcon from '@material-ui/icons/Close'; import LinkOffIcon from '@material-ui/icons/LinkOff'; +import Description from '@material-ui/icons/Description'; import { EditProjectDialog } from '../EditProjectDialog'; import ExitToAppIcon from '@material-ui/icons/ExitToApp'; import { @@ -197,6 +198,13 @@ export const HomePageBazaarInfoCard = ({ href: bazaarProject.value?.community, disabled: !bazaarProject.value?.community || !isMember, }, + { + label: 'Docs', + icon: , + href: bazaarProject.value?.docs, + disabled: + bazaarProject.value?.docs === null || bazaarProject.value?.docs === '', + }, ]; const handleUnlinkSubmit = async () => { diff --git a/plugins/bazaar/src/components/InputField/InputField.tsx b/plugins/bazaar/src/components/InputField/InputField.tsx index a2c8ca4ac4..a926ac41ad 100644 --- a/plugins/bazaar/src/components/InputField/InputField.tsx +++ b/plugins/bazaar/src/components/InputField/InputField.tsx @@ -30,7 +30,7 @@ type Rules = { }; type Props = { - inputType: 'description' | 'community' | 'responsible' | 'title'; + inputType: 'description' | 'community' | 'responsible' | 'title' | 'docs'; error?: FieldError | undefined; control: Control; helperText?: string; diff --git a/plugins/bazaar/src/components/ProjectDialog/ProjectDialog.tsx b/plugins/bazaar/src/components/ProjectDialog/ProjectDialog.tsx index ec7312576d..3a0d156fd8 100644 --- a/plugins/bazaar/src/components/ProjectDialog/ProjectDialog.tsx +++ b/plugins/bazaar/src/components/ProjectDialog/ProjectDialog.tsx @@ -144,6 +144,18 @@ export const ProjectDialog = ({ placeholder="Community link to e.g. Teams or Discord" /> + + diff --git a/plugins/bazaar/src/types.ts b/plugins/bazaar/src/types.ts index 055ec2fcab..7ca8e07aad 100644 --- a/plugins/bazaar/src/types.ts +++ b/plugins/bazaar/src/types.ts @@ -39,6 +39,7 @@ export type BazaarProject = { startDate?: string | null; endDate?: string | null; responsible: string; + docs: string; }; export type FormValues = { @@ -50,4 +51,5 @@ export type FormValues = { startDate?: string | null; endDate?: string | null; responsible: string; + docs: string; }; diff --git a/plugins/bazaar/src/util/parseMethods.ts b/plugins/bazaar/src/util/parseMethods.ts index b93f70c9f1..3be2be2aa9 100644 --- a/plugins/bazaar/src/util/parseMethods.ts +++ b/plugins/bazaar/src/util/parseMethods.ts @@ -30,6 +30,7 @@ export const parseBazaarProject = (metadata: any): BazaarProject => { startDate: metadata.start_date, endDate: metadata.end_date, responsible: metadata.responsible, + docs: metadata.docs, } as BazaarProject; };