diff --git a/README.md b/README.md index fd8ec98..78926f0 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,11 @@ The Tech Radar is a list of technologies along with their assessment result pres - Filtering by adoption levels and teams who use specific technologies/tools - Details view with logo, description, alternatives and links - Mobile support +- Skills Matrix for filling skills by users + +## Skills Matrix + +Skills Matrix is located on `/matrix` route. It consists of four steps in which users fill in their personal data and complete information about their skill level. ## Data source @@ -40,7 +45,13 @@ Or connect your own preferable CMS or other data source. For reference of data models used in the tech radar see types defined in `src/shared/components/radar/radar.types.ts`. -You can also import the data models into your own Contentful space with `contentful-cli` (see export file `contentful-export-2022-04-18.json`). +You can also import the data models into your own Contentful space with `contentful-cli` (see export file `contentful-export-2023-05-31.json`). + +Skills Matrix is using AirTable to store and update users data. + +To connect your AirTable table see `functions/.secret.example` file for required keys. + +To structure your table see `functions/src/constants/airable.prod.ts` and `functions/src/constants/airtable.dev.ts`. ## Backend @@ -77,6 +88,12 @@ In order for Firebase Functions to work properly you will also need to: - Environment variables for Firebase Functions are coming from Google Secret Manager Please take a look at `.secret.example` to see the required structure for it and upload them to Google Secret Manager for your application following these instructions: [Setting Firebase config](https://firebase.google.com/docs/functions/config-env#secret-manager) +## Admin Panel + +Admin panel is very basic and it allows to update and add `entries` directly, instead of using contentful. +It is located on `/admin/panel` route. +Authorization is done by google account, which have admin role in contentful. + ## Usage ### Node version diff --git a/contentful-export-2022-04-18.json b/contentful-export-2023-05-31.json similarity index 76% rename from contentful-export-2022-04-18.json rename to contentful-export-2023-05-31.json index cd5537b..f1ba07d 100644 --- a/contentful-export-2022-04-18.json +++ b/contentful-export-2023-05-31.json @@ -12,7 +12,7 @@ "id": "entry", "type": "ContentType", "createdAt": "2019-01-03T12:15:05.336Z", - "updatedAt": "2022-03-31T11:26:21.066Z", + "updatedAt": "2023-05-10T09:29:16.771Z", "environment": { "sys": { "id": "master", @@ -20,8 +20,8 @@ "linkType": "Environment" } }, - "publishedVersion": 39, - "publishedAt": "2022-03-31T11:26:21.066Z", + "publishedVersion": 59, + "publishedAt": "2023-05-10T09:29:16.771Z", "firstPublishedAt": "2019-01-03T12:15:05.748Z", "createdBy": { "sys": { @@ -34,16 +34,16 @@ "sys": { "type": "Link", "linkType": "User", - "id": "1nUHdFwbtoBgelyqQ5wk0j" + "id": "59kXpmJFTiQaa0ca2nbIfz" } }, - "publishedCounter": 20, - "version": 40, + "publishedCounter": 30, + "version": 60, "publishedBy": { "sys": { "type": "Link", "linkType": "User", - "id": "1nUHdFwbtoBgelyqQ5wk0j" + "id": "59kXpmJFTiQaa0ca2nbIfz" } } }, @@ -150,16 +150,6 @@ "disabled": false, "omitted": false }, - { - "id": "projects", - "name": "Projects", - "type": "Symbol", - "localized": false, - "required": false, - "validations": [], - "disabled": false, - "omitted": false - }, { "id": "icon", "name": "Icon", @@ -190,10 +180,48 @@ "linkType": "Entry" } }, + { + "id": "teams", + "name": "Teams", + "type": "Array", + "localized": false, + "required": false, + "validations": [], + "disabled": false, + "omitted": false, + "items": { + "type": "Link", + "validations": [ + { + "linkContentType": ["team"] + } + ], + "linkType": "Entry" + } + }, + { + "id": "projects", + "name": "Projects", + "type": "Array", + "localized": false, + "required": false, + "validations": [], + "disabled": false, + "omitted": false, + "items": { + "type": "Link", + "validations": [ + { + "linkContentType": ["project"] + } + ], + "linkType": "Entry" + } + }, { "id": "experts", "name": "Experts", - "type": "Symbol", + "type": "Integer", "localized": false, "required": false, "validations": [], @@ -552,7 +580,7 @@ "id": "team", "type": "ContentType", "createdAt": "2021-10-19T13:27:43.984Z", - "updatedAt": "2021-10-19T13:27:44.318Z", + "updatedAt": "2023-05-15T12:04:32.035Z", "environment": { "sys": { "id": "master", @@ -560,8 +588,8 @@ "linkType": "Environment" } }, - "publishedVersion": 1, - "publishedAt": "2021-10-19T13:27:44.318Z", + "publishedVersion": 3, + "publishedAt": "2023-05-15T12:04:32.035Z", "firstPublishedAt": "2021-10-19T13:27:44.318Z", "createdBy": { "sys": { @@ -574,16 +602,16 @@ "sys": { "type": "Link", "linkType": "User", - "id": "1u0zQlQily3ANlI91mf2Sg" + "id": "59kXpmJFTiQaa0ca2nbIfz" } }, - "publishedCounter": 1, - "version": 2, + "publishedCounter": 2, + "version": 4, "publishedBy": { "sys": { "type": "Link", "linkType": "User", - "id": "1u0zQlQily3ANlI91mf2Sg" + "id": "59kXpmJFTiQaa0ca2nbIfz" } } }, @@ -604,6 +632,144 @@ ], "disabled": false, "omitted": false + }, + { + "id": "description", + "name": "Description", + "type": "Text", + "localized": false, + "required": false, + "validations": [], + "disabled": false, + "omitted": false + } + ] + }, + { + "sys": { + "space": { + "sys": { + "type": "Link", + "linkType": "Space", + "id": "s3uxq74ufqso" + } + }, + "id": "project", + "type": "ContentType", + "createdAt": "2023-04-18T12:56:07.416Z", + "updatedAt": "2023-04-24T10:39:43.862Z", + "environment": { + "sys": { + "id": "master", + "type": "Link", + "linkType": "Environment" + } + }, + "publishedVersion": 15, + "publishedAt": "2023-04-24T10:39:43.862Z", + "firstPublishedAt": "2023-04-18T12:56:07.872Z", + "createdBy": { + "sys": { + "type": "Link", + "linkType": "User", + "id": "59kXpmJFTiQaa0ca2nbIfz" + } + }, + "updatedBy": { + "sys": { + "type": "Link", + "linkType": "User", + "id": "59kXpmJFTiQaa0ca2nbIfz" + } + }, + "publishedCounter": 8, + "version": 16, + "publishedBy": { + "sys": { + "type": "Link", + "linkType": "User", + "id": "59kXpmJFTiQaa0ca2nbIfz" + } + } + }, + "displayField": "name", + "name": "Project", + "description": "", + "fields": [ + { + "id": "name", + "name": "Name", + "type": "Symbol", + "localized": false, + "required": true, + "validations": [ + { + "unique": true + } + ], + "disabled": false, + "omitted": false + }, + { + "id": "url", + "name": "Url", + "type": "Symbol", + "localized": false, + "required": true, + "validations": [ + { + "regexp": { + "pattern": "^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?$", + "flags": null + } + } + ], + "disabled": false, + "omitted": false + }, + { + "id": "image", + "name": "image", + "type": "Link", + "localized": false, + "required": true, + "validations": [ + { + "linkMimetypeGroup": ["image"] + }, + { + "assetImageDimensions": { + "width": { + "min": 616, + "max": 616 + }, + "height": { + "min": 346, + "max": 346 + } + }, + "message": "Image must have fixed dimensions - 616x346px " + }, + { + "assetFileSize": { + "min": null, + "max": 1048576 + } + } + ], + "disabled": false, + "omitted": false, + "linkType": "Asset" + }, + { + "id": "description", + "name": "Description", + "type": "Symbol", + "localized": false, + "required": true, + "validations": [], + "disabled": false, + "omitted": false } ] } @@ -621,7 +787,7 @@ "linkType": "Space" } }, - "version": 40, + "version": 60, "createdAt": "2019-01-03T12:15:05.973Z", "createdBy": { "sys": { @@ -630,10 +796,10 @@ "linkType": "User" } }, - "updatedAt": "2022-03-31T11:26:21.715Z", + "updatedAt": "2023-05-10T09:29:17.473Z", "updatedBy": { "sys": { - "id": "1nUHdFwbtoBgelyqQ5wk0j", + "id": "59kXpmJFTiQaa0ca2nbIfz", "type": "Link", "linkType": "User" } @@ -661,11 +827,19 @@ }, { "fieldId": "quadrant", + "settings": { + "showLinkEntityAction": true, + "showCreateEntityAction": false + }, "widgetId": "entryCardEditor", "widgetNamespace": "builtin" }, { "fieldId": "ring", + "settings": { + "showLinkEntityAction": true, + "showCreateEntityAction": false + }, "widgetId": "entryLinkEditor", "widgetNamespace": "builtin" }, @@ -679,6 +853,10 @@ }, { "fieldId": "team", + "settings": { + "showLinkEntityAction": true, + "showCreateEntityAction": false + }, "widgetId": "entryLinkEditor", "widgetNamespace": "builtin" }, @@ -697,11 +875,6 @@ "widgetId": "singleLine", "widgetNamespace": "builtin" }, - { - "fieldId": "projects", - "widgetId": "singleLine", - "widgetNamespace": "builtin" - }, { "fieldId": "icon", "widgetId": "assetLinkEditor", @@ -717,6 +890,26 @@ "widgetId": "entryLinksEditor", "widgetNamespace": "builtin" }, + { + "fieldId": "teams", + "settings": { + "bulkEditing": false, + "showLinkEntityAction": true, + "showCreateEntityAction": false + }, + "widgetId": "entryLinksEditor", + "widgetNamespace": "builtin" + }, + { + "fieldId": "projects", + "settings": { + "bulkEditing": true, + "showLinkEntityAction": true, + "showCreateEntityAction": false + }, + "widgetId": "entryLinksEditor", + "widgetNamespace": "builtin" + }, { "fieldId": "experts", "widgetId": "singleLine", @@ -933,7 +1126,7 @@ "linkType": "Space" } }, - "version": 2, + "version": 4, "createdAt": "2021-10-19T13:27:44.403Z", "createdBy": { "sys": { @@ -942,10 +1135,10 @@ "linkType": "User" } }, - "updatedAt": "2021-10-19T13:27:45.360Z", + "updatedAt": "2023-05-15T12:04:32.776Z", "updatedBy": { "sys": { - "id": "1u0zQlQily3ANlI91mf2Sg", + "id": "59kXpmJFTiQaa0ca2nbIfz", "type": "Link", "linkType": "User" } @@ -970,6 +1163,77 @@ "fieldId": "label", "widgetId": "singleLine", "widgetNamespace": "builtin" + }, + { + "fieldId": "description", + "widgetId": "multipleLine", + "widgetNamespace": "builtin" + } + ] + }, + { + "sys": { + "id": "default", + "type": "EditorInterface", + "space": { + "sys": { + "id": "s3uxq74ufqso", + "type": "Link", + "linkType": "Space" + } + }, + "version": 16, + "createdAt": "2023-04-18T12:56:08.112Z", + "createdBy": { + "sys": { + "id": "59kXpmJFTiQaa0ca2nbIfz", + "type": "Link", + "linkType": "User" + } + }, + "updatedAt": "2023-04-24T10:39:44.666Z", + "updatedBy": { + "sys": { + "id": "59kXpmJFTiQaa0ca2nbIfz", + "type": "Link", + "linkType": "User" + } + }, + "contentType": { + "sys": { + "id": "project", + "type": "Link", + "linkType": "ContentType" + } + }, + "environment": { + "sys": { + "id": "master", + "type": "Link", + "linkType": "Environment" + } + } + }, + "controls": [ + { + "fieldId": "name", + "widgetId": "singleLine", + "widgetNamespace": "builtin" + }, + { + "fieldId": "url", + "widgetId": "singleLine", + "widgetNamespace": "builtin" + }, + { + "fieldId": "image", + "widgetId": "assetLinkEditor", + "widgetNamespace": "builtin" + }, + { + "fieldId": "description", + "widgetId": "singleLine", + "widgetNamespace": "builtin" } ] } @@ -1021,5 +1285,6 @@ } } ], - "webhooks": [] + "webhooks": [], + "roles": [] } diff --git a/images/radar.png b/images/radar.png index a54e800..928370c 100644 Binary files a/images/radar.png and b/images/radar.png differ diff --git a/images/radar_tech.png b/images/radar_tech.png index 8ed50e1..49004ae 100644 Binary files a/images/radar_tech.png and b/images/radar_tech.png differ diff --git a/public/images/og_image.png b/public/images/og_image.png index f84e5fc..e920cc1 100644 Binary files a/public/images/og_image.png and b/public/images/og_image.png differ