diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index 66d6dc0b6..416ad046e 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -2,7 +2,7 @@ name: 'Alpha Build' on: push: - branches: [v4190/other-deps] + branches: [v4190/release] jobs: build: diff --git a/README.md b/README.md index 75bb6d4ec..227530b98 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,16 @@ This will run a demo version, which you can turn into a fully licenced version b ## Versions History +### Version 4.19.0 + +- Feature: Adding the ability to set a timer for a session. This is optional and can be enabled in the settings. (👏 Thanks to [@Xyaren](https://github.com/Xyaren) for the idea) +- Feature: Confirm before deleting a post. Avoids accidental deletion of posts. (👏 Thanks to [@vadamovsky](https://github.com/vadamovsky) for the idea) +- Feature: Allow users to cancel their votes on a specific ticket. This feature can be disabled in the settings. (👏 Thanks to [@Xyaren](https://github.com/Xyaren) for the idea) +- Feature: Self-Hosted only: Display the number of logged users (👏 Thanks to [@dayByte](https://github.com/dayByte) for the idea) +- Upgrade to the latest version of TypeORM +- Convert all backend code to ESM +- 🇩🇪 German language updates (👏 Thanks to [@dayByte](https://github.com/dayByte) for his contribution) + ### Version 4.18.1 (hotfix) - Reinstates the Enter icon on board input on mobiles (👏 Thanks to Hans K. for the idea) @@ -709,7 +719,7 @@ Many thanks to the following contributors who helped translating the app: - Polish: [@olaf-cichocki](https://github.com/olaf-cichocki) - Arabic: [@FrenchTechLead](https://github.com/FrenchTechLead) - Japanese: [@sat0yu](https://github.com/sat0yu) -- German: [@PaulBrandt](https://github.com/PaulBrandt) +- German: [@PaulBrandt](https://github.com/PaulBrandt), [@dayByte](https://github.com/dayByte) - Italian: [@mventuri](https://github.com/mventuri) If you are a native speaker of another language, please don't hesitate to make a pull request to add a translation. diff --git a/backend/package.json b/backend/package.json index 283e66856..0a420d99a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "@retrospected/backend", - "version": "4.18.1", + "version": "4.19.0", "license": "GNU GPLv3", "private": true, "type": "module", diff --git a/backend/src/common/models.ts b/backend/src/common/models.ts index ce479cc27..7f9e26dac 100644 --- a/backend/src/common/models.ts +++ b/backend/src/common/models.ts @@ -11,11 +11,11 @@ export const defaultOptions: SessionOptions = { allowGiphy: true, allowGrouping: true, allowReordering: true, - allowCancelVote: false, + allowCancelVote: true, blurCards: false, newPostsFirst: true, - allowTimer: false, - timerDuration: 0, + allowTimer: true, + timerDuration: 15 * 60, readonlyOnTimerEnd: true, }; diff --git a/backend/src/db/entities/SessionOptions.ts b/backend/src/db/entities/SessionOptions.ts index 2683229fb..3d8d31e68 100644 --- a/backend/src/db/entities/SessionOptions.ts +++ b/backend/src/db/entities/SessionOptions.ts @@ -26,9 +26,9 @@ export default class SessionOptionsEntity { public allowGrouping: boolean; @Column({ default: true }) public allowReordering: boolean; - @Column({ default: false }) + @Column({ default: true }) public allowCancelVote: boolean; - @Column({ default: false }) + @Column({ default: true }) public allowTimer: boolean; @Column({ type: 'numeric', default: 15 * 60 }) public timerDuration: number; diff --git a/backend/src/db/migrations/1674589758156-AllowCancelVote.ts b/backend/src/db/migrations/1674589758156-AllowCancelVote.ts index 36286dc94..914eb35e9 100644 --- a/backend/src/db/migrations/1674589758156-AllowCancelVote.ts +++ b/backend/src/db/migrations/1674589758156-AllowCancelVote.ts @@ -4,8 +4,8 @@ export class AllowCancelVote1674589758156 implements MigrationInterface { name = 'AllowCancelVote1674589758156' public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "templates" ADD "options_allow_cancel_vote" boolean NOT NULL DEFAULT false`); - await queryRunner.query(`ALTER TABLE "sessions" ADD "options_allow_cancel_vote" boolean NOT NULL DEFAULT false`); + await queryRunner.query(`ALTER TABLE "templates" ADD "options_allow_cancel_vote" boolean NOT NULL DEFAULT true`); + await queryRunner.query(`ALTER TABLE "sessions" ADD "options_allow_cancel_vote" boolean NOT NULL DEFAULT true`); } public async down(queryRunner: QueryRunner): Promise { diff --git a/backend/src/db/migrations/1674905786619-TimerOptions.ts b/backend/src/db/migrations/1674905786619-TimerOptions.ts index 044ba0aa5..18c8e6ed6 100644 --- a/backend/src/db/migrations/1674905786619-TimerOptions.ts +++ b/backend/src/db/migrations/1674905786619-TimerOptions.ts @@ -4,9 +4,9 @@ export class TimerOptions1674905786619 implements MigrationInterface { name = 'TimerOptions1674905786619' public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "templates" ADD "options_allow_timer" boolean NOT NULL DEFAULT false`); + await queryRunner.query(`ALTER TABLE "templates" ADD "options_allow_timer" boolean NOT NULL DEFAULT true`); await queryRunner.query(`ALTER TABLE "templates" ADD "options_timer_duration" numeric NOT NULL DEFAULT '900'`); - await queryRunner.query(`ALTER TABLE "sessions" ADD "options_allow_timer" boolean NOT NULL DEFAULT false`); + await queryRunner.query(`ALTER TABLE "sessions" ADD "options_allow_timer" boolean NOT NULL DEFAULT true`); await queryRunner.query(`ALTER TABLE "sessions" ADD "options_timer_duration" numeric NOT NULL DEFAULT '900'`); } diff --git a/backend/src/db/migrations/1675515259530-ChangeDefaults.ts b/backend/src/db/migrations/1675515259530-ChangeDefaults.ts new file mode 100644 index 000000000..40074da18 --- /dev/null +++ b/backend/src/db/migrations/1675515259530-ChangeDefaults.ts @@ -0,0 +1,20 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class ChangeDefaults1675515259530 implements MigrationInterface { + name = 'ChangeDefaults1675515259530' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "templates" ALTER COLUMN "options_allow_cancel_vote" SET DEFAULT true`); + await queryRunner.query(`ALTER TABLE "templates" ALTER COLUMN "options_allow_timer" SET DEFAULT true`); + await queryRunner.query(`ALTER TABLE "sessions" ALTER COLUMN "options_allow_cancel_vote" SET DEFAULT true`); + await queryRunner.query(`ALTER TABLE "sessions" ALTER COLUMN "options_allow_timer" SET DEFAULT true`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "sessions" ALTER COLUMN "options_allow_timer" SET DEFAULT true`); + await queryRunner.query(`ALTER TABLE "sessions" ALTER COLUMN "options_allow_cancel_vote" SET DEFAULT true`); + await queryRunner.query(`ALTER TABLE "templates" ALTER COLUMN "options_allow_timer" SET DEFAULT true`); + await queryRunner.query(`ALTER TABLE "templates" ALTER COLUMN "options_allow_cancel_vote" SET DEFAULT true`); + } + +} diff --git a/docs/package.json b/docs/package.json index e94e18d3b..bed82a0ae 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "4.18.1", + "version": "4.19.0", "private": true, "scripts": { "docusaurus": "docusaurus", diff --git a/frontend/package.json b/frontend/package.json index 9bb3a78eb..9334c4d3c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@retrospected/frontend", - "version": "4.18.1", + "version": "4.19.0", "license": "GNU GPLv3", "private": true, "dependencies": { diff --git a/frontend/src/common/models.ts b/frontend/src/common/models.ts index 3ae6c1c38..7c93cb3e5 100644 --- a/frontend/src/common/models.ts +++ b/frontend/src/common/models.ts @@ -13,9 +13,9 @@ export const defaultOptions: SessionOptions = { allowReordering: true, blurCards: false, newPostsFirst: true, - allowCancelVote: false, - allowTimer: false, - timerDuration: 0, + allowCancelVote: true, + allowTimer: true, + timerDuration: 15 * 60, readonlyOnTimerEnd: true, }; diff --git a/frontend/src/views/Game.tsx b/frontend/src/views/Game.tsx index e111190e0..d72a6e4a2 100644 --- a/frontend/src/views/Game.tsx +++ b/frontend/src/views/Game.tsx @@ -201,11 +201,11 @@ function GamePage() { diff --git a/frontend/src/views/game/footer/GameFooter.tsx b/frontend/src/views/game/footer/GameFooter.tsx index 55dc21f52..8abc234e0 100644 --- a/frontend/src/views/game/footer/GameFooter.tsx +++ b/frontend/src/views/game/footer/GameFooter.tsx @@ -11,7 +11,7 @@ import styled from '@emotion/styled'; import useUser from '../../../auth/useUser'; import { useCallback, useEffect, useState } from 'react'; import { trackEvent } from '../../../track'; -import { Message } from 'common'; +import { Message, SessionOptions } from 'common'; import useModal from '../../../hooks/useModal'; import ChatModal from '../chat/ChatModal'; import { useTranslation } from 'react-i18next'; @@ -21,22 +21,22 @@ import useCanModifyOptions from '../board/header/useCanModifyOptions'; type GameFooterProps = { onReady: () => void; - timer: boolean; - timerDuration: number; messages: Message[]; + options: SessionOptions; onMessage: (content: string) => void; onTimerStart: () => void; onTimerReset: () => void; + onConfigure: (options: SessionOptions) => void; }; function GameFooter({ onReady, onMessage, messages, - timer, - timerDuration, + options, onTimerStart, onTimerReset, + onConfigure, }: GameFooterProps) { const { session } = useSession(); const user = useUser(); @@ -61,16 +61,15 @@ function GameFooter({ - {timer ? ( - - - - ) : null} + + + {user && !fullScreen ? ( @@ -86,7 +85,7 @@ function GameFooter({ + + + + ); +} diff --git a/integration/package.json b/integration/package.json index 141a36d6b..435ec69bd 100644 --- a/integration/package.json +++ b/integration/package.json @@ -1,6 +1,6 @@ { "name": "retro-board-integration", - "version": "4.18.1", + "version": "4.19.0", "description": "Integrations tests", "main": "index.js", "directories": { diff --git a/package.json b/package.json index 6b9c217fa..939ad717d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "retrospected", - "version": "4.18.1", + "version": "4.19.0", "description": "An agile retrospective board - Powering www.retrospected.com", "private": true, "scripts": {