diff --git a/.github/workflows/gradle-build-feature.yml b/.github/workflows/gradle-build-feature.yml index 127ca38dc9..bdcb909e9b 100644 --- a/.github/workflows/gradle-build-feature.yml +++ b/.github/workflows/gradle-build-feature.yml @@ -8,6 +8,8 @@ on: - 'doc-**/*' - 'hotfix-**/*' - 'dependabot/**/*' +env: + HUSKY: 0 jobs: build: runs-on: ubuntu-latest diff --git a/.github/workflows/gradle-build-native-feature.yml b/.github/workflows/gradle-build-native-feature.yml index 8f074129cb..464acf6882 100644 --- a/.github/workflows/gradle-build-native-feature.yml +++ b/.github/workflows/gradle-build-native-feature.yml @@ -8,6 +8,8 @@ on: - 'doc-**/*' - 'hotfix-**/*' - 'dependabot/**/*' +env: + HUSKY: 0 jobs: build: runs-on: ubuntu-latest diff --git a/.github/workflows/gradle-build-production.yml b/.github/workflows/gradle-build-production.yml index e69a0babcb..096478d4bc 100644 --- a/.github/workflows/gradle-build-production.yml +++ b/.github/workflows/gradle-build-production.yml @@ -4,6 +4,7 @@ on: branches: - "master" env: + HUSKY: 0 PROJECT_ID: ${{ secrets.RUN_PROJECT }} RUN_REGION: us-central1 SERVICE_NAME: checkins-master diff --git a/.github/workflows/gradle-build-publish.yml b/.github/workflows/gradle-build-publish.yml index 9e8fed23d5..0f7cec56ef 100644 --- a/.github/workflows/gradle-build-publish.yml +++ b/.github/workflows/gradle-build-publish.yml @@ -2,6 +2,8 @@ name: Gradle Publish to GitHub Packages on: release: types: [created] +env: + HUSKY: 0 jobs: build: runs-on: ubuntu-latest diff --git a/.github/workflows/gradle-dependency-submission.yml b/.github/workflows/gradle-dependency-submission.yml index 3aa1f9b734..959013aeaf 100644 --- a/.github/workflows/gradle-dependency-submission.yml +++ b/.github/workflows/gradle-dependency-submission.yml @@ -3,7 +3,8 @@ name: Gradle Dependency Submission on: push: branches: [ 'develop', 'master', 'feature-2532/graal' ] - +env: + HUSKY: 0 permissions: contents: write diff --git a/.github/workflows/gradle-deploy-develop.yml b/.github/workflows/gradle-deploy-develop.yml index a30f87d573..2d8679e81b 100644 --- a/.github/workflows/gradle-deploy-develop.yml +++ b/.github/workflows/gradle-deploy-develop.yml @@ -4,6 +4,7 @@ on: branches: - 'develop' env: + HUSKY: 0 PROJECT_ID: ${{ secrets.RUN_PROJECT }} RUN_REGION: us-central1 SERVICE_NAME: checkins-develop diff --git a/.github/workflows/gradle-deploy-native-develop.yml b/.github/workflows/gradle-deploy-native-develop.yml index 98105aaa74..5ef9eee305 100644 --- a/.github/workflows/gradle-deploy-native-develop.yml +++ b/.github/workflows/gradle-deploy-native-develop.yml @@ -4,6 +4,7 @@ on: branches: - 'develop' env: + HUSKY: 0 PROJECT_ID: ${{ secrets.RUN_PROJECT }} RUN_REGION: us-central1 SERVICE_NAME: checkins-develop-native diff --git a/.github/workflows/jekyll.yml b/.github/workflows/jekyll.yml index 300f52c479..a78e80609b 100644 --- a/.github/workflows/jekyll.yml +++ b/.github/workflows/jekyll.yml @@ -10,6 +10,8 @@ on: # Runs on pushes targeting the default branch push: branches: [develop] +env: + HUSKY: 0 # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/README.md b/README.md index 0bf3e4b6db..7f85950d10 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,77 @@ -[![Gradle Build & Deploy - Develop](https://github.com/objectcomputing/check-ins/actions/workflows/gradle-build-develop.yml/badge.svg)](https://github.com/objectcomputing/check-ins/actions/workflows/gradle-build-develop.yml) +# Check-Ins + +Check-Ins is a team engagement platform with [many HRIS and engagement capabilities](#features) built on +[Micronaut](https://micronaut.io/) and [React](https://react.dev/) and available for deployment on premises or on +[Google Cloud Platform](https://cloud.google.com/). + +[![Gradle Build & Deploy - Develop](https://github.com/objectcomputing/check-ins/actions/workflows/gradle-deploy-develop.yml/badge.svg)](https://github.com/objectcomputing/check-ins/actions/workflows/gradle-deploy-develop.yml) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) +[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) +## Table of Contents -- [Check-ins](#check-ins) -- [Project Links](#project-links) -- [Setup](#setup) - - [directory.json](#directoryjson) - - [credentials.json](#credentialsjson) - - [Running the application](#running-the-application) +- [About](#about) +- [Features](#features) +- [Documentation](#documentation) +- [Getting Started](#getting-started) + - [Environment Setup](#environment-setup) + - [Running the Application](#running-the-application) + - [Troubleshooting](#troubleshooting) - [Contributing](#contributing) - +- [License](#license) +- [Contact](#contact) -# Check-ins +## About + +Check-Ins is a comprehensive web application designed to streamline team management and personal development. It offers +tools for understanding team members and their capabilities, facilitating growth and engagement, and managing many of +the processes that can get dropped or weigh down an organization. Built with Micronaut, Check-Ins is designed for +efficient cost of operation and ease of use. Many of the workflows were originally designed and built by former interns +at [Object Computing](https://objectcomputing.com), and we use it actively there today. + +## Features -This web application is written in [Micronaut](https://micronaut.io) for uploading files and tracking skill set of team members. This application will also be used for PDL checkins and to auto-generate resumes from the skill set. +- **User/Employee Management** - Simple onboarding and offboarding of new users, with Google SSO integration +- **Employee Profiles** - Team members can manage their own profiles, including skills, certifications, and organizations they support +- **Mentor Program Management** - A key feature of the Check-Ins application is the support and management of employee touch points with a dedicated mentor +- **Pulse Surveys** - Find out how your team is feeling about work, or life in general +- **Feedback Management** - Give your employees access to feedback so that they can grow their skills and contribute up to their potential +- **Employee, Team, and Community Directories** - These provide an easy way to see who is involved with what +- **Performance Reviews and Reporting** - Evaluate your team's performance as frequently as you would like +- **Public Kudos** - Celebrate those wins publicly! Our Kudos feature can post your team's wins to Slack and celebrate them within the application. +- **Birthday and Anniversary Celebrations** - Encourage the celebration of your team's milestones +- **Skill and Certification Tracking and Reporting** - Know where your team is strong, where it needs to develop, and plan for growth +- **Volunteer Time Tracking and Reporting** - Encourage a culture of giving back to your community by recognizing the good work already being done by your team -# Project Links +## Documentation -**Project Document:** \*TBA\* +Detailed documentation, including installation guides, usage instructions, and API references, can be found on our [GitHub Pages site](https://objectcomputing.github.io/check-ins/). -**Project Board:** [Board](https://github.com/objectcomputing/check-ins/projects) +## Getting Started -**Environments:** \*TBA\* +### Environment setup -# Environment setup +See [our GitHub pages site](https://objectcomputing.github.io/check-ins/getting-started/setup/) for instructions on setting up your development environment. -See [Setting up your environment](https://objectcomputing.github.io/check-ins/getting-started/setup/) for instructions on setting up your development environment. +### Running the application -## Running the application +See [our GitHub pages site](https://objectcomputing.github.io/check-ins/getting-started/running/) for instructions on running the application locally. -See [Running the Application](https://objectcomputing.github.io/check-ins/getting-started/running/) for instructions on running the application locally. +### Troubleshooting -# Contributing +See [our GitHub pages site](https://objectcomputing.github.io/check-ins/getting-started/troubleshooting/) for common challenges and their solutions. + +## Contributing Please see [Contributing](./CONTRIBUTING.md) for details on how to contribute to this project. + +## License + +This project is licensed under the [Apache 2.0 License and Commons Clause](LICENSE). + +## Contact + +For questions or issues, please [join the discussion](https://github.com/objectcomputing/check-ins/discussions) or +[open an issue](https://github.com/objectcomputing/check-ins/issues) on GitHub. diff --git a/docs/project-roadmap/index.md b/docs/project-roadmap/index.md index 7c590d08fe..626b268ac6 100644 --- a/docs/project-roadmap/index.md +++ b/docs/project-roadmap/index.md @@ -6,70 +6,64 @@ title: Project Roadmap ***This roadmap is subject to change and should not be construed as a commitment to build these features.*** -This roadmap prioritizes features focused on enhancing the team member review process, integrating the shelved onboarding process, and incorporating generative AI for mentor support. +This roadmap prioritizes features focused on enhancing team member and mentor support, white labeling the application, +and preparing it for deployment into multiple environment types. -## Streamlined and Repeatable Reviews (0.8.0) +## Release Clean Up (v0.8.x) -1. **Review Planning & Validation:** - * Implement a dedicated review planning phase. - * Automatically assign reviewers and validate assignments with managers. - * Enable multi-layered team review structures: - * Managers review planned assignments for subordinate managers. - * Subordinate managers incorporate suggestions before final approval. - * Integrate timeline creation and review launch functionalities for administrators. -2. **Review Implementation:** - * Streamline self-reviews and manager reviews. - * Introduce automated reminders to both managers and team members. - * Provide automated status overview emails to administrators. - * Provide relevant contextual information during reviews, including: - * Current title and job description - * Skills listed in user profiles - * Feedback received previously -3. **Reporting:** - * Develop review process reports detailing completion rates (breakdowns by department, etc.). - * Create manager reports that detail individual and aggregate review outcomes. +- [x] Documentation Updates +- [x] Other Dependency Upgrades and Security Alert Remediation +- [ ] Bug Smooshing and Tech Debt Remediation -### Success Metrics: +## Configuration UI and Infrastructure Codification (v0.9.0) -* Increased on-time completion rates for employee reviews -* Increased on-time review period start rates -* Improved user satisfaction with the review process +1. **Introduce Infrastructure as Code** + - Create Terraform code for + - [ ] Local Deployment + - [ ] GCP Deployment + - [ ] AWS Deployment (stretch-goal) + - [ ] Migrate to cloud-based secret management +2. **Configuration Management UI** + - [ ] Implement feature switches + - [ ] Move most configuration into the UI and store in the database -## Onboarding and Modernization (0.9.0) +### Goals (v0.9.0) -1. **Modularize Deployment:** - * Upgrade to Micronaut 4.x. - * Introduce infrastructure as code. - * Codify GCP environments with Terraform. - * Migrate to cloud-based secret management. - * Segment service deployments. -2. **Revive Onboarding Application:** - * Rebase and refresh the onboarding application. -3. **Configuration Management UI:** - * Integrate configuration into the UI to allow for dynamic configuration. +* Simple and repeatable local environment setup +* Simple and repeatable cloud environment setup +* Increased application flexibility +* Ability to right-size features for different organizations -### Success Metrics: +## Professional Development Support (v0.10.0) -* Increased completion of onboarding tasks before the new employees’ start dates -* Increased user satisfaction with the onboarding process -* Increased application flexibility +1. **Role Library & Assignment** + - [ ] Add the ability to create and maintain job roles + - [ ] Create a versioning mechanism for roles in order to provide "moment in time" information + - [ ] Add the ability to assign and track roles over time +2. **Generative AI Integration** + - [ ] Develop GenAI integration module + - [ ] Construct prompts and workflows that analyze notes, feedback, job descriptions, and skills data to provide summarized and actionable growth and performance insights + - **Construct prompts and workflows to provide personalized suggestions for mentors** + - [ ] Recommend development goals based on mentee information + - [ ] Suggest relevant learning resources or training opportunities + - [ ] Generate actionable development suggestions for increasing desired capabilities + - [ ] Incorporate generated suggestions into the check-in planning process +3. **Career Timeline** + - **Create a timeline component to show important events in an employee's journey, including:** + - [ ] Role changes + - [ ] Title changes + - [ ] Joining/leaving a team + - [ ] Getting awarded a certification + - [ ] Joining/leaving a guild or community + - [ ] Completing a training event (stretch goal) -## Professional Development Support (0.10.0) +### Goals (v0.10.0) -1. **Job Library & Assignment:** - * Build a comprehensive job library within the platform. - * Enable defining and assigning specific job roles. -2. **Generative AI Integration:** - * Develop Google Gemini integration module. - * Construct prompts that analyze notes, feedback, job descriptions, and skills - data. - * Construct prompts to provide personalized suggestions for mentors: - * Recommend development goals based on mentee information. - * Suggest relevant learning resources or training opportunities. - * Generate actionable development suggestions for increasing desired capabilities. - * Incorporation of generated suggestions into the check-in planning process. +* Higher engagement with the Check-Ins planning workflows +* Improved employee development and career planning outcomes +* Provide a view of an employee's career and development journey -### Success Metrics: +## Some day... -* Higher engagement with the Check-Ins workflows -* Enhanced employee development and career planning outcomes +1. **Revive Onboarding Application:** + * Reintroduce and refresh the onboarding application \ No newline at end of file diff --git a/server/build.gradle b/server/build.gradle index b98fc730da..5da3a6765d 100755 --- a/server/build.gradle +++ b/server/build.gradle @@ -2,12 +2,12 @@ import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform plugins { id 'maven-publish' - id("com.gradleup.shadow") version "8.3.2" - id("io.micronaut.application") version "4.4.3" + id("com.gradleup.shadow") version "8.3.6" + id("io.micronaut.application") version "4.5.0" id "jacoco" } -version "0.8.16" +version "0.8.17" group "com.objectcomputing.checkins" repositories { diff --git a/server/gradle.properties b/server/gradle.properties index 96a4e8b1d0..87a21df3dd 100644 --- a/server/gradle.properties +++ b/server/gradle.properties @@ -1,2 +1,2 @@ -micronautVersion=4.6.3 +micronautVersion=4.7.6 seleniumVersion=4.24.0 diff --git a/server/src/main/resources/application.yml b/server/src/main/resources/application.yml index 23ea93a927..f6ba1a2099 100755 --- a/server/src/main/resources/application.yml +++ b/server/src/main/resources/application.yml @@ -37,7 +37,7 @@ micronaut: security: enabled: true - authentication: cookie + authentication: idtoken token: jwt: enabled: true diff --git a/web-ui/.husky/pre-push b/web-ui/.husky/pre-push new file mode 100755 index 0000000000..a64ea70f31 --- /dev/null +++ b/web-ui/.husky/pre-push @@ -0,0 +1 @@ +./gradlew check diff --git a/web-ui/package.json b/web-ui/package.json index 9478e75642..d0e92cb0ea 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -1,6 +1,6 @@ { "name": "web-ui", - "version": "0.8.16", + "version": "0.8.17", "private": true, "type": "module", "dependencies": { @@ -13,12 +13,12 @@ "@fortawesome/free-regular-svg-icons": "^6.0.0", "@fortawesome/free-solid-svg-icons": "^6.0.0", "@fortawesome/react-fontawesome": "^0.1.17", - "@mui/icons-material": "^5.15.14", - "@mui/lab": "^5.0.0-alpha.169", - "@mui/material": "^5.15.14", - "@mui/styled-engine-sc": "^6.0.0-alpha.18", - "@mui/styles": "^5.15.14", - "@mui/x-date-pickers": "^7.3.1", + "@mui/icons-material": "^6.4.7", + "@mui/lab": "^6.0.0-beta.30", + "@mui/material": "^6.4.7", + "@mui/styled-engine-sc": "^6.4.6", + "@mui/styles": "^6.4.7", + "@mui/x-date-pickers": "^7.27.3", "@tinymce/tinymce-react": "^5.0.0", "axios": "^1.8.2", "canvas-confetti": "^1.6.0", @@ -31,20 +31,18 @@ "js-cookie": "^3.0.5", "js-file-download": "^0.4.12", "lodash": "^4.17.21", - "markdown-builder": "^0.9.0", "mjml": "^5.0.0-alpha.4", "mjml-browser": "^5.0.0-alpha.4", "qs": "^6.13.0", "query-string": "^7.0.1", "raf": "^3.4.1", - "react": "^18.2.0", + "react": "^18.3.1", "react-beautiful-dnd": "^13.1.0", - "react-dom": "^18.2.0", + "react-dom": "^18.3.1", "react-error-boundary": "^3.1.3", "react-jss": "^10.4.0", "react-modal": "^3.14.3", "react-router-dom": "^5.3.0", - "react-swipeable-views": "^0.14.0", "recharts": "^2.12.4", "reselect": "^4.0.0", "styled-components": "^6.1.8" @@ -59,7 +57,8 @@ "serve": "vite preview", "start": "vite", "test": "vitest", - "update-test": "vitest -u" + "update-test": "vitest -u", + "prepare": "cd .. && husky web-ui/.husky" }, "eslintConfig": { "extends": "react-app" @@ -77,31 +76,30 @@ ] }, "devDependencies": { - "@ladle/react": "^4.1.2", - "@testing-library/jest-dom": "^6.4.5", - "@testing-library/react": "^14.2.2", - "@testing-library/react-hooks": "^8.0.1", - "@testing-library/user-event": "^14.5.2", - "@types/react-router-dom": "^5.3.0", - "@vitejs/plugin-react-swc": "^3.6.0", - "@vitest/coverage-v8": "^1.4.0", - "eslint": "^9.1.1", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", + "@ladle/react": "^5.0.1", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.2.0", + "@testing-library/user-event": "^14.6.1", + "@types/react-router-dom": "^5.3.3", + "@vitejs/plugin-react-swc": "^3.8.0", + "@vitest/coverage-v8": "^3.0.8", + "eslint": "^9.22.0", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-vitest": "^0.5.4", - "globals": "^15.0.0", - "happy-dom": "^15.10.2", - "jest-fetch-mock": "^3.0.3", - "jsdom": "^24.0.0", - "msw": "^2.6.4", - "prettier": "3.2.5", + "globals": "^16.0.0", + "husky": "^9.1.7", + "jsdom": "^26.0.0", + "msw": "^2.7.3", + "prettier": "3.5.3", "prop-types": "^15.8.1", - "react-test-renderer": "^18.2.0", - "typescript": "^5.4.5", - "typescript-eslint": "^7.7.1", - "vite": "^5.4.12", - "vite-tsconfig-paths": "^4.3.2", - "vitest": "^1.6.1", - "vitest-fetch-mock": "^0.2.2" + "react-test-renderer": "^18.3.1", + "typescript": "^5.8.2", + "typescript-eslint": "^8.26.1", + "vite": "^6.2.1", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.0.8", + "vitest-fetch-mock": "^0.4.5" } } diff --git a/web-ui/src/App.css b/web-ui/src/App.css index 105572155a..4cef25497d 100644 --- a/web-ui/src/App.css +++ b/web-ui/src/App.css @@ -7,11 +7,11 @@ a, a:visited { - color: var(--checkins-palette-primary-link); + color: var(--mui-palette-primary-link); } a:hover { - color: var(--checkins-palette-primary-link-hover); + color: var(--mui-palette-primary-link-hover); } } diff --git a/web-ui/src/App.jsx b/web-ui/src/App.jsx index 870391c129..95554aa2b5 100644 --- a/web-ui/src/App.jsx +++ b/web-ui/src/App.jsx @@ -14,8 +14,8 @@ import { DarkMode, LightMode } from '@mui/icons-material'; import { useColorScheme, - experimental_extendTheme as extendTheme, - Experimental_CssVarsProvider as CssVarsProvider + createTheme, + ThemeProvider } from '@mui/material/styles'; import './App.css'; @@ -44,8 +44,10 @@ function SchemeToggle() { ); } -const theme = extendTheme({ - cssVarPrefix: 'checkins', +const theme = createTheme({ + cssVariables: { + colorSchemeSelector: 'data', + }, colorSchemes: { light: { palette: { @@ -65,8 +67,9 @@ const theme = extendTheme({ components: { MuiButtonBase: { defaultProps: { - disableRipple: typeof process !== 'undefined' && !!process.env.VITEST_WORKER_ID, // No more ripple...only when testing. - }, + disableRipple: + typeof process !== 'undefined' && !!process.env.VITEST_WORKER_ID // No more ripple...only when testing. + } }, MuiCssBaseline: { styleOverrides: { @@ -89,7 +92,7 @@ getUserColorScheme(); function App() { return ( - + @@ -107,7 +110,7 @@ function App() { - + ); } diff --git a/web-ui/src/api/api.js b/web-ui/src/api/api.js index 8f5aabff06..63f9839f2e 100644 --- a/web-ui/src/api/api.js +++ b/web-ui/src/api/api.js @@ -61,7 +61,7 @@ export const getMyFetch = async () => { function windowLogin() { return new Promise((resolve, reject) => { const authUrl = `${BASE_API_URL}/login?close=true`; - const loginWindow = window.open(authUrl, "Login", "width=500,height=600"); + const loginWindow = window.open(authUrl, 'Login', 'width=500,height=600'); const interval = setInterval(() => { try { diff --git a/web-ui/src/api/certification.js b/web-ui/src/api/certification.js index e62905f10d..29376b726d 100644 --- a/web-ui/src/api/certification.js +++ b/web-ui/src/api/certification.js @@ -8,7 +8,7 @@ export const getCertifications = async cookie => { headers: { 'X-CSRF-Header': cookie, Accept: 'application/json', - 'Content-Type': 'application/json;charset=UTF-8', + 'Content-Type': 'application/json;charset=UTF-8' } }); }; @@ -29,9 +29,9 @@ export const createCertification = async (data, cookie) => { Accept: 'application/json', 'Content-Type': 'application/json;charset=UTF-8' }, - data: data, + data: data }); -} +}; export const updateCertification = async (id, data, cookie) => { return resolve({ @@ -42,9 +42,9 @@ export const updateCertification = async (id, data, cookie) => { Accept: 'application/json', 'Content-Type': 'application/json;charset=UTF-8' }, - data: data, + data: data }); -} +}; export const mergeCertification = async (sourceId, targetId, cookie) => { return resolve({ @@ -55,6 +55,6 @@ export const mergeCertification = async (sourceId, targetId, cookie) => { Accept: 'application/json', 'Content-Type': 'application/json;charset=UTF-8' }, - data: { sourceId, targetId }, + data: { sourceId, targetId } }); -} +}; diff --git a/web-ui/src/api/feedback.js b/web-ui/src/api/feedback.js index 856618502d..8815235557 100644 --- a/web-ui/src/api/feedback.js +++ b/web-ui/src/api/feedback.js @@ -22,14 +22,11 @@ export const findReviewRequestsByPeriodAndTeamMembers = async ( }); }; -export const findReviewRequestsByPeriod = async ( - period, - cookie -) => { +export const findReviewRequestsByPeriod = async (period, cookie) => { return resolve({ url: feedbackRequestURL, params: { - reviewPeriodId: period?.id, + reviewPeriodId: period?.id }, headers: { 'X-CSRF-Header': cookie, Accept: 'application/json' } }); diff --git a/web-ui/src/api/generic.js b/web-ui/src/api/generic.js index 23998c6403..4357d38312 100644 --- a/web-ui/src/api/generic.js +++ b/web-ui/src/api/generic.js @@ -18,7 +18,7 @@ export const downloadData = (url, cookie, params) => { params: params, headers: { 'X-CSRF-Header': cookie, - Accept: 'application/json', + Accept: 'application/json' }, url: url }); @@ -33,6 +33,6 @@ export const initiate = (url, cookie, params) => { 'Content-Type': 'application/json;charset=UTF-8' }, url: url, - data: params, + data: params }); }; diff --git a/web-ui/src/api/kudos.js b/web-ui/src/api/kudos.js index a9a9601232..5144450538 100644 --- a/web-ui/src/api/kudos.js +++ b/web-ui/src/api/kudos.js @@ -1,15 +1,15 @@ -import { resolve } from "./api.js"; +import { resolve } from './api.js'; -const kudosUrl = "/services/kudos"; +const kudosUrl = '/services/kudos'; export const createKudos = async (kudos, cookie) => { return resolve({ - method: "post", + method: 'post', url: kudosUrl, data: kudos, - responseType: "json", + responseType: 'json', headers: { - "X-CSRF-Header": cookie, + 'X-CSRF-Header': cookie, Accept: 'application/json', 'Content-Type': 'application/json;charset=UTF-8' } @@ -22,8 +22,8 @@ export const getReceivedKudos = async (memberId, cookie) => { params: { recipientId: memberId }, - responseType: "json", - headers: { "X-CSRF-Header": cookie, Accept: 'application/json' } + responseType: 'json', + headers: { 'X-CSRF-Header': cookie, Accept: 'application/json' } }); }; @@ -33,15 +33,15 @@ export const getSentKudos = async (memberId, cookie) => { params: { senderId: memberId }, - responseType: "json", - headers: { "X-CSRF-Header": cookie, Accept: 'application/json' } + responseType: 'json', + headers: { 'X-CSRF-Header': cookie, Accept: 'application/json' } }); }; -export const getRecentKudos = async (cookie) => { +export const getRecentKudos = async cookie => { return resolve({ url: `${kudosUrl}/recent`, - responseType: "json", + responseType: 'json', headers: { 'X-CSRF-Header': cookie, Accept: 'application/json' } }); }; @@ -52,42 +52,44 @@ export const getAllKudos = async (cookie, isPending) => { params: { isPending: isPending }, - responseType: "json", + responseType: 'json', headers: { 'X-CSRF-Header': cookie, Accept: 'application/json' } }); }; export const updateKudos = async (kudos, cookie) => { return resolve({ - method: "put", + method: 'put', url: kudosUrl, data: kudos, - responseType: "json", + responseType: 'json', headers: { - "X-CSRF-Header": cookie, + 'X-CSRF-Header': cookie, Accept: 'application/json', - 'Content-Type': 'application/json;charset=UTF-8'} + 'Content-Type': 'application/json;charset=UTF-8' + } }); }; export const approveKudos = async (kudos, cookie) => { return resolve({ - method: "put", + method: 'put', url: `${kudosUrl}/approve`, data: kudos, - responseType: "json", + responseType: 'json', headers: { - "X-CSRF-Header": cookie, + 'X-CSRF-Header': cookie, Accept: 'application/json', - 'Content-Type': 'application/json;charset=UTF-8'} + 'Content-Type': 'application/json;charset=UTF-8' + } }); }; export const deleteKudos = async (kudosId, cookie) => { return resolve({ - method: "delete", + method: 'delete', url: `${kudosUrl}/${kudosId}`, - responseType: "json", - headers: { "X-CSRF-Header": cookie, Accept: 'application/json' } + responseType: 'json', + headers: { 'X-CSRF-Header': cookie, Accept: 'application/json' } }); }; diff --git a/web-ui/src/api/settings.js b/web-ui/src/api/settings.js index ba46645b62..038a234130 100644 --- a/web-ui/src/api/settings.js +++ b/web-ui/src/api/settings.js @@ -23,7 +23,7 @@ export const putOption = async (option, cookie) => { Accept: 'application/json', 'Content-Type': 'application/json;charset=UTF-8' }, - data: option, + data: option }); }; @@ -36,6 +36,6 @@ export const postOption = async (option, cookie) => { Accept: 'application/json', 'Content-Type': 'application/json;charset=UTF-8' }, - data: option, + data: option }); }; diff --git a/web-ui/src/api/volunteer.js b/web-ui/src/api/volunteer.js index aedc924058..7b751fa225 100644 --- a/web-ui/src/api/volunteer.js +++ b/web-ui/src/api/volunteer.js @@ -4,18 +4,18 @@ const organizationBaseUrl = '/services/volunteer/organization'; // Create New Organization export const createNewOrganization = async (csrf, newOrganization) => { - const res = await resolve({ - method: 'POST', - url: organizationBaseUrl, - headers: { - 'X-CSRF-Header': csrf, - 'Content-Type': 'application/json', - }, - data: newOrganization, - }); - - return res; - }; + const res = await resolve({ + method: 'POST', + url: organizationBaseUrl, + headers: { + 'X-CSRF-Header': csrf, + 'Content-Type': 'application/json' + }, + data: newOrganization + }); + + return res; +}; // Save New Organization export const saveNewOrganization = async (csrf, newOrganization) => { @@ -46,4 +46,3 @@ export const saveNewEvent = async (csrf, newEvent) => { return res; }; - diff --git a/web-ui/src/components/action_item/__snapshots__/ActionItemsPanel.test.jsx.snap b/web-ui/src/components/action_item/__snapshots__/ActionItemsPanel.test.jsx.snap index 640ad85d48..daa2893d93 100644 --- a/web-ui/src/components/action_item/__snapshots__/ActionItemsPanel.test.jsx.snap +++ b/web-ui/src/components/action_item/__snapshots__/ActionItemsPanel.test.jsx.snap @@ -3,17 +3,18 @@ exports[`ActionItemsPanel > renders correctly 1`] = `

Action Items

renders correctly 1`] = ` />
diff --git a/web-ui/src/components/admin/permissions/Permissions.jsx b/web-ui/src/components/admin/permissions/Permissions.jsx index f3af9e81a6..5f1f94a0b5 100644 --- a/web-ui/src/components/admin/permissions/Permissions.jsx +++ b/web-ui/src/components/admin/permissions/Permissions.jsx @@ -5,14 +5,16 @@ import MobileTable from './MobileTable'; import { AppContext } from '../../../context/AppContext'; import { selectHasPermissionAssignmentPermission, - noPermission, + noPermission } from '../../../context/selectors'; export default function Permissions() { const { state } = useContext(AppContext); const showDesktop = useMediaQuery('(min-width:650px)', { noSsr: true }); - return selectHasPermissionAssignmentPermission(state) ? - (
{showDesktop ? : }
) : - (

{noPermission}

); + return selectHasPermissionAssignmentPermission(state) ? ( +
{showDesktop ? : }
+ ) : ( +

{noPermission}

+ ); } diff --git a/web-ui/src/components/admin/permissions/__snapshots__/DesktopTable.test.jsx.snap b/web-ui/src/components/admin/permissions/__snapshots__/DesktopTable.test.jsx.snap index b661154118..3c38af6c1d 100644 --- a/web-ui/src/components/admin/permissions/__snapshots__/DesktopTable.test.jsx.snap +++ b/web-ui/src/components/admin/permissions/__snapshots__/DesktopTable.test.jsx.snap @@ -3,48 +3,49 @@ exports[`DesktopTable > renders correctly 1`] = `
diff --git a/web-ui/src/components/admin/permissions/__snapshots__/MobileTable.test.jsx.snap b/web-ui/src/components/admin/permissions/__snapshots__/MobileTable.test.jsx.snap index 4cff4eb31d..ba2cc86b33 100644 --- a/web-ui/src/components/admin/permissions/__snapshots__/MobileTable.test.jsx.snap +++ b/web-ui/src/components/admin/permissions/__snapshots__/MobileTable.test.jsx.snap @@ -3,31 +3,32 @@ exports[`MobileTable > renders correctly 1`] = `
Permissions Admin PDL Team Lead @@ -53,33 +54,33 @@ exports[`DesktopTable > renders correctly 1`] = `
View Action Items - - - -
Edit Action Items - - - -
Create Action Items - - - -
Add Team Members - - - -
Delete Team Members - - - -
diff --git a/web-ui/src/components/admin/roles/Roles.css b/web-ui/src/components/admin/roles/Roles.css index 079f0af32a..d82845c3af 100644 --- a/web-ui/src/components/admin/roles/Roles.css +++ b/web-ui/src/components/admin/roles/Roles.css @@ -15,12 +15,12 @@ position: absolute; min-width: 400px; max-width: 600px; - background-color: var(--checkins-palette-background-default); + background-color: var(--mui-palette-background-default); top: 50%; left: 50%; padding: 0.5rem; transform: translate(-50%, -50%); - border: 2px solid var(--checkins-palette-background-default); + border: 2px solid var(--mui-palette-background-default); } .role-modal h2 { diff --git a/web-ui/src/components/admin/roles/Roles.jsx b/web-ui/src/components/admin/roles/Roles.jsx index 1f3865581f..b9f6445b33 100644 --- a/web-ui/src/components/admin/roles/Roles.jsx +++ b/web-ui/src/components/admin/roles/Roles.jsx @@ -14,7 +14,11 @@ import { } from '../../../api/roles'; import { selectCanEditMemberRolesPermission, - noPermission, selectMemberRoles, selectCsrfToken, selectRoles, selectMemberProfiles, + noPermission, + selectMemberRoles, + selectCsrfToken, + selectRoles, + selectMemberProfiles } from '../../../context/selectors'; import RoleUserCards from './RoleUserCards'; diff --git a/web-ui/src/components/admin/roles/Roles.test.jsx b/web-ui/src/components/admin/roles/Roles.test.jsx index d36cab40e4..6a0db5627d 100644 --- a/web-ui/src/components/admin/roles/Roles.test.jsx +++ b/web-ui/src/components/admin/roles/Roles.test.jsx @@ -11,7 +11,7 @@ const initialState = { ], memberRoles: [ { memberRoleId: { roleId: 1, memberId: 1 } }, - { memberRoleId: { roleId: 2, memberId: 2 } }, + { memberRoleId: { roleId: 2, memberId: 2 } } ], roles: [ { id: 1, role: 'ADMIN', description: 'Administrator' }, @@ -22,8 +22,8 @@ const initialState = { name: 'Current User', role: ['MEMBER'], id: 1, - permissions: [{ permission: 'CAN_EDIT_MEMBER_ROLES' }], - }, + permissions: [{ permission: 'CAN_EDIT_MEMBER_ROLES' }] + } } }; @@ -36,7 +36,7 @@ const noPermState = { ], memberRoles: [ { memberRoleId: { roleId: 1, memberId: 1 } }, - { memberRoleId: { roleId: 2, memberId: 2 } }, + { memberRoleId: { roleId: 2, memberId: 2 } } ], roles: [ { id: 1, role: 'ADMIN', description: 'Administrator' }, @@ -47,8 +47,8 @@ const noPermState = { name: 'Current User', role: ['MEMBER'], id: 1, - permissions: [], - }, + permissions: [] + } } }; diff --git a/web-ui/src/components/admin/roles/__snapshots__/Roles.test.jsx.snap b/web-ui/src/components/admin/roles/__snapshots__/Roles.test.jsx.snap index 55c6dd895d..642f15cac1 100644 --- a/web-ui/src/components/admin/roles/__snapshots__/Roles.test.jsx.snap +++ b/web-ui/src/components/admin/roles/__snapshots__/Roles.test.jsx.snap @@ -26,24 +26,23 @@ exports[`renders correctly 1`] = ` class="roles-top-search-fields" >

Showing 3/3 roles

{!onlyMe && } - + + {earnedCertifications.map(earnedCertificationRow)} @@ -463,9 +477,10 @@ const EarnedCertificationsTable = ({ { name: certificationName, description: certificationDescription, - badgeUrl, + badgeUrl }, - csrf); + csrf + ); if (res.error) return; const newCert = res.payload.data; @@ -482,7 +497,13 @@ const EarnedCertificationsTable = ({ setBadgeUrl(''); setCertificationDialogOpen(false); forceUpdate(); - }, [certificationName, certificationDescription, badgeUrl, certifications, selectedCertification]); + }, [ + certificationName, + certificationDescription, + badgeUrl, + certifications, + selectedCertification + ]); const saveEarnedCertification = useCallback(async () => { selectedEarned.memberId = selectedProfile?.id || currentUser.id; diff --git a/web-ui/src/components/checkin/CheckinHistory.jsx b/web-ui/src/components/checkin/CheckinHistory.jsx index da102d6132..ca14ec9321 100644 --- a/web-ui/src/components/checkin/CheckinHistory.jsx +++ b/web-ui/src/components/checkin/CheckinHistory.jsx @@ -94,8 +94,8 @@ const CheckinsHistory = () => { fontSize: '1.2em', fill: index <= 0 - ? 'var(--checkins-palette-action-disabled)' - : 'var(--checkins-palette-action)' + ? 'var(--mui-palette-action-disabled)' + : 'var(--mui-palette-action)' }} /> @@ -120,8 +120,8 @@ const CheckinsHistory = () => { fontSize: '1.2em', fill: index <= 0 - ? 'var(--checkins-palette-action-disabled)' - : 'var(--checkins-palette-action)' + ? 'var(--mui-palette-action-disabled)' + : 'var(--mui-palette-action)' }} /> diff --git a/web-ui/src/components/checkin/CheckinProfile.jsx b/web-ui/src/components/checkin/CheckinProfile.jsx index 245dce38a0..6902b22365 100644 --- a/web-ui/src/components/checkin/CheckinProfile.jsx +++ b/web-ui/src/components/checkin/CheckinProfile.jsx @@ -13,7 +13,9 @@ const CheckinProfile = () => { const { state } = useContext(AppContext); const { csrf, selectedProfile, userProfile } = state; const currentUserProfile = selectCurrentUser(state); - const { name, pdlId, title, workEmail } = selectedProfile ? selectedProfile : currentUserProfile; + const { name, pdlId, title, workEmail } = selectedProfile + ? selectedProfile + : currentUserProfile; const [pdl, setPDL] = useState(); // Get PDL's name diff --git a/web-ui/src/components/checkin/__snapshots__/CheckinHistory.test.jsx.snap b/web-ui/src/components/checkin/__snapshots__/CheckinHistory.test.jsx.snap index 86350db696..24e948bccf 100644 --- a/web-ui/src/components/checkin/__snapshots__/CheckinHistory.test.jsx.snap +++ b/web-ui/src/components/checkin/__snapshots__/CheckinHistory.test.jsx.snap @@ -7,17 +7,17 @@ exports[`CheckinHistory > renders correctly 1`] = ` >
renders correctly 1`] = ` />
diff --git a/web-ui/src/components/checkin/__snapshots__/CheckinProfile.test.jsx.snap b/web-ui/src/components/checkin/__snapshots__/CheckinProfile.test.jsx.snap index 4e95b3b724..081aa37839 100644 --- a/web-ui/src/components/checkin/__snapshots__/CheckinProfile.test.jsx.snap +++ b/web-ui/src/components/checkin/__snapshots__/CheckinProfile.test.jsx.snap @@ -6,11 +6,11 @@ exports[`renders correctly 1`] = ` class="profile-section" >
diff --git a/web-ui/src/components/checkin/documents/CheckinDocs.jsx b/web-ui/src/components/checkin/documents/CheckinDocs.jsx index 464104cdf9..270d454ffc 100644 --- a/web-ui/src/components/checkin/documents/CheckinDocs.jsx +++ b/web-ui/src/components/checkin/documents/CheckinDocs.jsx @@ -9,7 +9,7 @@ import { selectCurrentUser, selectIsPDL, selectCheckin, - selectCanAdministerCheckinDocuments, + selectCanAdministerCheckinDocuments } from '../../../context/selectors'; import DescriptionIcon from '@mui/icons-material/Description'; import IconButton from '@mui/material/IconButton'; @@ -34,7 +34,8 @@ const UploadDocs = () => { const [files, setFiles] = useState([]); const [fileColors, setFileColors] = useState({}); - const pdlorAdmin = selectIsPDL(state) || selectCanAdministerCheckinDocuments(state); + const pdlorAdmin = + selectIsPDL(state) || selectCanAdministerCheckinDocuments(state); const canView = pdlorAdmin && currentUserId !== memberId; useEffect(() => { @@ -56,7 +57,7 @@ const UploadDocs = () => { }); } } catch (e) { - console.error("getCheckinFiles: " + e); + console.error('getCheckinFiles: ' + e); } } if (csrf) { @@ -98,7 +99,7 @@ const UploadDocs = () => { setFiles([...files, data]); } catch (e) { setFileColors(fileColors => ({ ...fileColors, [file.name]: 'red' })); - console.error("addFiles: " + e); + console.error('addFiles: ' + e); } finally { setLoading(false); } diff --git a/web-ui/src/components/checkin/documents/CheckinDocs.test.jsx b/web-ui/src/components/checkin/documents/CheckinDocs.test.jsx index db9b98ba2e..57a321bdcd 100644 --- a/web-ui/src/components/checkin/documents/CheckinDocs.test.jsx +++ b/web-ui/src/components/checkin/documents/CheckinDocs.test.jsx @@ -36,7 +36,7 @@ const initialState = { id: '130u410234', name: 'holmes', imageUrl: - 'https://upload.wikimedia.org/wikipedia/commons/7/74/SNL_MrBill_Doll.jpg' + 'https://upload.wikimedia.org/wikipedia/commons/7/74/SNL_MrBill_Doll.jpg' } ], index: 0 diff --git a/web-ui/src/components/checkin/documents/__snapshots__/CheckinDocs.test.jsx.snap b/web-ui/src/components/checkin/documents/__snapshots__/CheckinDocs.test.jsx.snap index 10a6790657..ea654bdc09 100644 --- a/web-ui/src/components/checkin/documents/__snapshots__/CheckinDocs.test.jsx.snap +++ b/web-ui/src/components/checkin/documents/__snapshots__/CheckinDocs.test.jsx.snap @@ -3,17 +3,18 @@ exports[`renders correctly 1`] = `

Documents

{ return ( @@ -67,7 +67,10 @@ const LinearBuffer = ({ style={{ display: 'block' }} > Billable Hours: {billableHours} - Contribution Hours:{' '} - {contributionHours} - Target Hours: {targetHours} - PTO Hours:{' '} {ptoHours} - Billable Utilization:{' '} {(billableUtilization) ? billableUtilization : '(none)'} - Overtime Worked:{' '} {(overtimeWorked) ? overtimeWorked : '(none)'} + {contributionHours} - Target Hours: {targetHours} - PTO Hours:{' '} + {ptoHours} - Billable Utilization:{' '} + {billableUtilization ? billableUtilization : '(none)'} - Overtime + Worked: {overtimeWorked ? overtimeWorked : '(none)'} ); diff --git a/web-ui/src/components/contribution_hours/ProgressBar.test.jsx b/web-ui/src/components/contribution_hours/ProgressBar.test.jsx index a82438336a..593b6ef73f 100644 --- a/web-ui/src/components/contribution_hours/ProgressBar.test.jsx +++ b/web-ui/src/components/contribution_hours/ProgressBar.test.jsx @@ -3,13 +3,21 @@ import ProgressBar from './ProgressBar'; import renderer from 'react-test-renderer'; it('has billable hours', () => { - snapshot(); + snapshot( + + ); }); it('has no billable hours', () => { - snapshot(); + snapshot( + + ); }); diff --git a/web-ui/src/components/contribution_hours/__snapshots__/ProgressBar.test.jsx.snap b/web-ui/src/components/contribution_hours/__snapshots__/ProgressBar.test.jsx.snap index 50270e810a..f8fecd3b62 100644 --- a/web-ui/src/components/contribution_hours/__snapshots__/ProgressBar.test.jsx.snap +++ b/web-ui/src/components/contribution_hours/__snapshots__/ProgressBar.test.jsx.snap @@ -3,7 +3,7 @@ exports[`has billable hours 1`] = `

Billable Hours: 1200 @@ -45,15 +45,11 @@ exports[`has billable hours 1`] = ` 1850 - PTO Hours: - 0 - Billable Utilization: - (none) - - Overtime Worked: - - + - Overtime Worked: (none)

@@ -63,7 +59,7 @@ exports[`has billable hours 1`] = ` exports[`has no billable hours 1`] = `

Billable Hours: 0 @@ -98,15 +94,11 @@ exports[`has no billable hours 1`] = ` 1850 - PTO Hours: - 0 - Billable Utilization: - (none) - - Overtime Worked: - - + - Overtime Worked: (none)

diff --git a/web-ui/src/components/dialogs/OrganizationDialog.jsx b/web-ui/src/components/dialogs/OrganizationDialog.jsx index b227144f28..f5e2403641 100644 --- a/web-ui/src/components/dialogs/OrganizationDialog.jsx +++ b/web-ui/src/components/dialogs/OrganizationDialog.jsx @@ -1,5 +1,12 @@ import React from 'react'; -import { Dialog, DialogTitle, DialogContent, DialogActions, Button, TextField } from '@mui/material'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogActions, + Button, + TextField +} from '@mui/material'; import PropTypes from 'prop-types'; const OrganizationDialog = ({ @@ -19,7 +26,9 @@ const OrganizationDialog = ({ fullWidth margin="dense" value={organization.name} - onChange={e => setOrganization({ ...organization, name: e.target.value })} + onChange={e => + setOrganization({ ...organization, name: e.target.value }) + } required /> setOrganization({ ...organization, description: e.target.value })} + onChange={e => + setOrganization({ ...organization, description: e.target.value }) + } required /> setOrganization({ ...organization, website: e.target.value })} + onChange={e => + setOrganization({ ...organization, website: e.target.value }) + } /> - + ); @@ -58,4 +76,4 @@ OrganizationDialog.propTypes = { setOrganization: PropTypes.func.isRequired }; -export default OrganizationDialog; \ No newline at end of file +export default OrganizationDialog; diff --git a/web-ui/src/components/discrete_slider/__snapshots__/DiscreteSlider.test.tsx.snap b/web-ui/src/components/discrete_slider/__snapshots__/DiscreteSlider.test.tsx.snap index 8c099ebf74..ee98c367b6 100644 --- a/web-ui/src/components/discrete_slider/__snapshots__/DiscreteSlider.test.tsx.snap +++ b/web-ui/src/components/discrete_slider/__snapshots__/DiscreteSlider.test.tsx.snap @@ -6,7 +6,7 @@ exports[`DiscreteSlider > renders slider with title 1`] = ` class="discrete-slider" >

Some skill diff --git a/web-ui/src/components/earned-certifications/EarnedCertificationBadges.jsx b/web-ui/src/components/earned-certifications/EarnedCertificationBadges.jsx index 6c012ef9c0..aca5f2d796 100644 --- a/web-ui/src/components/earned-certifications/EarnedCertificationBadges.jsx +++ b/web-ui/src/components/earned-certifications/EarnedCertificationBadges.jsx @@ -1,19 +1,20 @@ import PropTypes from 'prop-types'; import React, { useCallback, useContext, useEffect, useState } from 'react'; -import {Card, CardContent, CardHeader, Chip, Tooltip} from '@mui/material'; +import { Card, CardContent, CardHeader, Chip, Tooltip } from '@mui/material'; import { resolve } from '../../api/api.js'; import { AppContext } from '../../context/AppContext'; import { selectCsrfToken } from '../../context/selectors'; import './EarnedCertificationBadges.css'; -import certifications from "../certifications/Certifications.jsx"; +import certifications from '../certifications/Certifications.jsx'; const earnedCertificationBaseUrl = '/services/earned-certification'; const propTypes = { - memberId: PropTypes.string, certifications: PropTypes.array, + memberId: PropTypes.string, + certifications: PropTypes.array }; const EarnedCertificationBadges = ({ memberId, certifications }) => { const [earnedCertifications, setEarnedCertifications] = useState([]); @@ -43,98 +44,110 @@ const EarnedCertificationBadges = ({ memberId, certifications }) => { if (earnedCertifications.length === 0 || !certifications) return null; return ( - - - - {earnedCertifications.map(earnedCert => { - // Find the corresponding certification using earnedCert.certificationId - const cert = certifications.find(c => c.id === earnedCert.certificationId); - // If no matching cert is found, skip rendering for that earnedCert - if (!cert) return null; - if (cert.badgeUrl && cert.badgeUrl.trim().length > 0) { - return ( - + + + {earnedCertifications.map(earnedCert => { + // Find the corresponding certification using earnedCert.certificationId + const cert = certifications.find( + c => c.id === earnedCert.certificationId + ); + // If no matching cert is found, skip rendering for that earnedCert + if (!cert) return null; + if (cert.badgeUrl && cert.badgeUrl.trim().length > 0) { + return ( + + {cert.name}
+ Issued on: {earnedCert.earnedDate}
+ Expires on: {earnedCert.expirationDate} + + } + > + {earnedCert.validationUrl ? ( +
+ {`${cert.name}, + + ) : ( + {`${cert.name}, + )} + + ); + } else { + return ( + <> + {earnedCert.validationUrl ? ( + + {cert.name}
- Issued on: {earnedCert.earnedDate}
+ Issued on: {earnedCert.earnedDate} +
Expires on: {earnedCert.expirationDate} } - > - {earnedCert.validationUrl ? ( -
- {`${cert.name}, - - ) : ( - {`${cert.name}, - )} - - ); - } else { - return ( - <> - {earnedCert.validationUrl ? ( - - - {cert.name}
- Issued on: {earnedCert.earnedDate}
- Expires on: {earnedCert.expirationDate} - - } - /> -
- ) : ( - - {cert.name}
- Issued on: {earnedCert.earnedDate}
- Expires on: {earnedCert.expirationDate} - - } - /> - )} - - ); - } - })} - - + /> + + ) : ( + + {cert.name}
+ Issued on: {earnedCert.earnedDate} +
+ Expires on: {earnedCert.expirationDate} + + } + /> + )} + + ); + } + })} + + ); - }; EarnedCertificationBadges.propTypes = propTypes; diff --git a/web-ui/src/components/edit_skills/EditSkills.css b/web-ui/src/components/edit_skills/EditSkills.css index 2bad28a092..7a6e4889f2 100644 --- a/web-ui/src/components/edit_skills/EditSkills.css +++ b/web-ui/src/components/edit_skills/EditSkills.css @@ -2,7 +2,7 @@ position: absolute; min-width: 400px; max-width: 600px; - background-color: var(--checkins-palette-background-default); + background-color: var(--mui-palette-background-default); top: 50%; left: 50%; padding: 0.5rem; @@ -40,7 +40,7 @@ position: absolute; min-width: 400px; max-width: 600px; - background-color: var(--checkins-palette-background-default); + background-color: var(--mui-palette-background-default); top: 50%; left: 50%; padding: 0.5rem; diff --git a/web-ui/src/components/edit_skills/__snapshots__/EditSkillsCard.test.jsx.snap b/web-ui/src/components/edit_skills/__snapshots__/EditSkillsCard.test.jsx.snap index 88b7579f1b..6bd88d9c41 100644 --- a/web-ui/src/components/edit_skills/__snapshots__/EditSkillsCard.test.jsx.snap +++ b/web-ui/src/components/edit_skills/__snapshots__/EditSkillsCard.test.jsx.snap @@ -18,33 +18,33 @@ exports[`EditSkillsCard > renders correctly 1`] = ` >

@@ -106,28 +100,29 @@ exports[`EditSkillsCard > renders correctly 1`] = ` exports[`EditSkillsCard > renders correctly with skill 1`] = `
Le test skill le description
renders correctly with skill 1`] = ` > Submitted by:
Current User @@ -155,27 +150,21 @@ exports[`EditSkillsCard > renders correctly with skill 1`] = `
diff --git a/web-ui/src/components/expand-more/ExpandMore.jsx b/web-ui/src/components/expand-more/ExpandMore.jsx index acb9c17a30..267487370a 100644 --- a/web-ui/src/components/expand-more/ExpandMore.jsx +++ b/web-ui/src/components/expand-more/ExpandMore.jsx @@ -9,12 +9,24 @@ const ExpandMore = styled(props => { {props.children ? props.children : } ); -})(({ theme, expand }) => ({ - transform: !expand ? 'rotate(0deg)' : 'rotate(180deg)', +})(({ + theme +}) => ({ + transform: 'rotate(180deg)', marginLeft: 'auto', transition: theme.transitions.create('transform', { duration: theme.transitions.duration.shortest - }) + }), + variants: [{ + props: ( + { + expand + } + ) => !expand, + style: { + transform: 'rotate(0deg)' + } + }] })); export default ExpandMore; diff --git a/web-ui/src/components/feedback_recipient_card/FeedbackRecipientCard.jsx b/web-ui/src/components/feedback_recipient_card/FeedbackRecipientCard.jsx index a9d82acc25..37d5fa11f8 100644 --- a/web-ui/src/components/feedback_recipient_card/FeedbackRecipientCard.jsx +++ b/web-ui/src/components/feedback_recipient_card/FeedbackRecipientCard.jsx @@ -3,7 +3,14 @@ import { styled } from '@mui/material/styles'; import { AppContext } from '../../context/AppContext'; import { selectProfileMap } from '../../context/selectors'; import { getAvatarURL } from '../../api/api.js'; -import { Box, Card, CardHeader, CardContent, Container, Typography } from '@mui/material'; +import { + Box, + Card, + CardHeader, + CardContent, + Container, + Typography +} from '@mui/material'; import Avatar from '@mui/material/Avatar'; import PriorityHighIcon from '@mui/icons-material/PriorityHigh'; import { green } from '@mui/material/colors'; diff --git a/web-ui/src/components/feedback_recipient_card/__snapshots__/FeedbackRecipientCard.test.jsx.snap b/web-ui/src/components/feedback_recipient_card/__snapshots__/FeedbackRecipientCard.test.jsx.snap index 97be3eeeea..9142a42efa 100644 --- a/web-ui/src/components/feedback_recipient_card/__snapshots__/FeedbackRecipientCard.test.jsx.snap +++ b/web-ui/src/components/feedback_recipient_card/__snapshots__/FeedbackRecipientCard.test.jsx.snap @@ -3,45 +3,46 @@ exports[`renders the recipient card 1`] = `

renders the component 1`] = `

renders correctly 1`] = ` aria-invalid="false" autocapitalize="none" autocomplete="off" - class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-19qh8xo-MuiInputBase-input-MuiOutlinedInput-input" + class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall MuiInputBase-inputAdornedEnd MuiAutocomplete-input MuiAutocomplete-inputFocused css-13meb6w-MuiInputBase-input-MuiOutlinedInput-input" id="permissions-autocomplete" role="combobox" spellcheck="false" @@ -51,18 +52,18 @@ exports[`MobileTable > renders correctly 1`] = ` value="" />
Permissions @@ -162,33 +157,33 @@ exports[`MobileTable > renders correctly 1`] = `
View Action Items -
Edit Action Items -
Create Action Items -
Add Team Members -
Delete Team Members -
{profile?.name ?? 'unknown'}{certificationMap[earned.certificationId]?.name ?? 'unknown'}{certificationMap[earned.certificationId]?.description ?? 'unknown'} + {certificationMap[earned.certificationId]?.description ?? 'unknown'} + {formatDate(new Date(earned.earnedDate))} {earned.expirationDate @@ -324,10 +331,11 @@ const EarnedCertificationsTable = ({ }} /> { setSelectedEarned({ @@ -369,7 +377,11 @@ const EarnedCertificationsTable = ({ () => ( } + avatar={ + + + + } title="Earned Certifications" titleTypographyProps={{ variant: 'h5', component: 'h2' }} /> @@ -388,7 +400,9 @@ const EarnedCertificationsTable = ({ {sortIndicator(column)} ))} - Actions + Actions +