* Revert "refactor: add version to session endpoint"
This reverts commit cd40a6e55e.
* Revert "Remove public event feature (#1645)"
This reverts commit 08d9e24871.
* Revert "Fix: rearrange playing event (#1640)"
This reverts commit 0649678dca.
* Revert "refactor: style tweaks to edit css modal"
This reverts commit a00ec2d02a.
* Revert "refactor: remove usages of framer-motion"
This reverts commit 54a74ccc2a.
* Revert "Upgrade expressjs (#1633)"
This reverts commit 6f3ab274bd.
* Revert "Refactor: require trigger in all events objects (#1636)"
This reverts commit 90870ecfb6.
* Revert "Fix: Correct boundary condition in applyDelay"
This reverts commit b640e0e181.
* Revert "let vite be the proxy to the dev server (#1630)"
This reverts commit c41fe824cf.
* Revert "refactor: migrate custom fields to transactions"
This reverts commit 62c8319d70.
* Revert "refactor: simplify validations"
This reverts commit b1d23467a2.
* Revert "refactor: create transaction system and apply to adding entry (#1620)"
This reverts commit 9a62daf047.
* Revert "Refactor: better rounding (#1594)"
This reverts commit b9ab1c6fd7.
* Revert "refactor: improve reorder logic"
This reverts commit c1054711b0.
* Revert "chore: simplify URLs"
This reverts commit a4d4f29a37.
* Revert "refactor: order is single source of truth"
This reverts commit 2793aadea0.
* Revert "refactor: refetch targets is enum"
This reverts commit e7cfb7d9d9.
* Revert "refactor: small ux improvements"
This reverts commit 256a851c9b.
* Revert "refactor: remove trivially inferred numEvents"
This reverts commit 4ab9c81cb8.
* Revert "feat: duplicate groups"
This reverts commit 2f13d6c89e.
* Revert "feat: create group from entry selection"
This reverts commit f1f7bad25e.
* Revert "feat: create block from rundown empty"
This reverts commit a8b52a48f7.
* Revert "fix: collapsed blocks dont render children"
This reverts commit cd0999b2ab.
* Revert "refactor: type cleanup and test improvements"
This reverts commit b4c60f3f04.
* Revert "feat: allow dissolving a block"
This reverts commit 5cefad3666.
* Revert "fix: uncontrolled prop on controlled component"
This reverts commit 7a6ecd8c34.
* Revert "refactor: improve return of reorder"
This reverts commit ba96ecfd91.
* Revert "refactor: mutations on batch elements must have IDs"
This reverts commit 7bed3757f2.
* Revert "chore: upgrade dependencies"
This reverts commit e2e755b1d2.
* Revert "refactor: extract utility to merge two arrays"
This reverts commit a77d23109d.
* Revert "refactor: change network mode defaults"
This reverts commit 0eb3b8d382.
* Revert "fix: delete nested events"
This reverts commit 0021185288.
* Revert "fix: add event at end of block"
This reverts commit 94c72ff4f6.
* Revert "refactor: make finder available in exported rundown"
This reverts commit e4c08dc9b2.
* Revert "assert non null and update test (#1604)"
This reverts commit ec74af0d62.
* Revert "Fix project renumber (#1597)"
This reverts commit b6d72dd082.
* Revert "Refactor: WebSocket from flush queue to one patch (#1595)"
This reverts commit 31c311daf0.
* Revert "Refactor: ms for api calls (#1593)"
This reverts commit e9b3cc6090.
* Revert "fix test (#1601)"
This reverts commit 543b04a097.
* Revert "fix: rebase master"
This reverts commit d39b85b6e6.
* Revert "chore: correct test path"
This reverts commit bbe107bb2b.
* Revert "refactor: extract rundown parsing"
This reverts commit c616240db1.
* Revert "chore: improve convention entry <> event"
This reverts commit 166be66ce3.
* Revert "refactor: maintain flat orders"
This reverts commit 4180d0a337.
* Revert "refactor: implement operations on nested events"
This reverts commit 78108e316c.
* Revert "refactor: process events in rundown"
This reverts commit 3bb8b70915.
* Revert "chore: improve convention entry <> event"
This reverts commit 1c4f13a0ed.
* Revert "chore: rename currentBlock > parent"
This reverts commit 3ca0abad53.
* Revert "refactor: fix delay positioning in gaps"
This reverts commit 030c8f897f.
* Revert "refactor(e2e): skip flaky test"
This reverts commit 68175cfa3b.
* Revert "refactor: improve project loading"
This reverts commit fd8f757851.
* Revert "refactor: gather group metadata"
This reverts commit 876d111c61.
* Revert "refactor: swap maintains schedule"
This reverts commit 730cb95c04.
* Revert "chore: rename files"
This reverts commit 3c388d4fb5.
* Revert "refactor: restructure model to contain an object of rundowns"
This reverts commit 2e23718d73.
* Revert "refactor: clearer relationship on rundown elements"
This reverts commit 89ea8c470b.
* Revert "refactor: use strict typing"
This reverts commit 178640bfc4.
* Revert "refactor: remove stop as a possible end action"
This reverts commit 4ed38340e0.
* Revert "refactor: restructure model to contain an object of rundowns"
This reverts commit 69eb9a5eff.
* Revert "chore: remove IDE files"
This reverts commit 351425127a.
* Revert "refactor: remove unused and legacy code"
This reverts commit 95f2ba37cc.
* creat failing test
* find and pass index of eventNow in case it moved
* fix cache invalidate edits should also recalculate timer
* use coluor as test indicator
* fixed empty cue guard
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
---------
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* upgrade expressjs
* migration
* reenable test
* extend timeout on download test
* fixup! migration
* move empty body test from controller to validator
* enusre not empty
* extract validation function
* fixup! reenable test
* remove thin controllers
* disable e2e test of project file download
The `applyDelay` function had a condition that incorrectly used `rundown.order.length` instead of `rundownMetadata.flatEntryOrder.length` to check if a delay entry was the last in the sequence. `rundown.order` only contains top-level entries, while `flatEntryOrder` contains all entries, including those within blocks, which is the relevant list for this check.
This commit corrects the condition to use `rundownMetadata.flatEntryOrder.length`.
Existing tests in `rundown.dao.test.ts` (specifically the test `removes delays in last position without applying changes`) already cover this scenario and pass with the correction, ensuring the fix behaves as expected.
* fix: generateUniqueFileName
* loadProject should not generate new names
* update comments
* extract and test getProjectNumber
* spell
* finish jsdoc
* use getProjectNumber
* cleanup loadProject
* create a `incrementProjectNumber` function
* spelling
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
---------
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* refactor
* separate in and out time
* keep element on screen
* animate on play
* spelling
* explain animation decisions
* guard numbers from url params
* spelling
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* rename safeParseNumber
* use view data
* refactor getOptionsFromParams
* rebalance animation timing
---------
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* inti relative mode
* send imediat update on mode change
* add relative to test
* don't persist offset mode
* add test relative and update calc function
* pass data from ssocket
* add dev guard
* spelling and comments
* show relative in offset overview
* remove comments
* refactor: move totalDelay to _rundown
* update clear naming and comments
* remove old testing values
* crude UI
* add server functionalety
* better event trigger list
* fix default value
* remove log
* add trigger to recalculate whitelist
* use DTO type
* fix rebase
* one callback for delete and submit
* refactor
* add invalid description
* clean up commits
* cleanup
* refactor: find event triggers in `triggerAutomations`
* refactor: switch to flat array for event triggers
* prevent deleting a automation that is in use
* refactor
* refactor: extract EventEditorCustom
* move trigger options to separate file
* move trigger edit down a file level
* cleanup
* spelling
* refactor: ui review proposal
* change default value
* fix delete filter
---------
Co-authored-by: Carlos Valente <carlosvalente@pm.me>
* create report service
* write report from runtimeState
* use in UI
* clear report
* update types
* clear all from settings menu
* rearence rightclik menu
* refactor styling
* also report roll events
* ontime/under time is same colour
* refactor reporter
* add target to ontime-refetch
* remove menu
* fectch only on message from server
* memo useGetEventReport
* refactor
* use staleTime
* dont add to menu yet
* implement review
* clear all from menu
* fix merge
* start end show
* combine test for the go button text and action
* add report to menu
* extract csv utility
* report management
* unneeded async
* small refacort of triggerReportEntry
---------
Co-authored-by: Carlos Valente <carlosvalente@pm.me>
refactor: improve empty state
refactor: review schedule design
- fit as many elements as possible
- expose cycle interval as an option
- stabilise rundown reference
- style tweaks
welcome modal is persisted in app state
created endpoints to set the visibility
added UI to support feature
Co-authored-by: Carlos Valente
<34649812+cpvalente@users.noreply.github.com>
* add dayOffset to OntimeEvent
* refactor: isNewLatest
* calculate totalDays
* refactor: getTimeFromPrevious
* add gap as dataset in OntimeEvent
* use in ui
* format overlap is just a simple text formatting, big test is not needed
* add new fields where needed
* update apply delay
* show nex day eaven if there is no gap
* create test
* use buildin day offset in timeline
* remove todo
* consistent naming
* make a calculateDayOffset util for rundownCache
* refactor: checkIsNextDay to use dayOffset
* spelling
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* remove unneeded test
* remove todo
* update test db
* use data-testid
* spelling
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* update comments
* remove null option
---------
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* create db event type
* dont use it yet
* convert to and from database type
* type needed in one place in client
* use flatMap to filter out unknow stuff
* leave revision in save file
* move to utils
* make test
* destructur entry
* simple test
* throw in rundownToDatabaseRundown
* clerify comment
* Refactor: avoid shadowing the rundown variable in rundownCache (#1409)
---------
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* rename to DAO
* add simple edit test
* only the generate function clears the state state
* strict guard for custom fields
* fix small strict issues
* ensure deep copy
* safely set isStale
* todo is done
* small type error
* these functions can work on DAO entries
* only reat rundown as DAO on initial load and the cast immediately and esure all fields are present
* eslint comment
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* fix spelling
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* fix spelling
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* comment not needed
* setIsStale
* remove DAO
* clean up commits
* remove unneeded async/await
* revert test
---------
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* detect `EADDRINUSE` on server start
* @ts-expect-error
* send portError to electron
* use escalateErrorFn
* dont move in docker
* allow errors to be sendt to electron UI
* Log after the new port is found
* Update comment
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* update comment
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* update comment
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* rename to escalate
* extract `serverTryDesiredPort`
* type check server.address()
* request shutdown on `unrecoverable` `escalateError`
* combine network utils
* reject promise
* not unrecoverable by default
* unneeded assignment
---------
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* pass on all event edits
* MakePublic
* trim value in cell
* edit notes
* title
* add key check
* don't log error
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* checkbox
* refactor
* remove log
* fix test
* use row number to test value
---------
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* feat: add lock icon when param `locked=true`
* chore: move `isViewLocked` logic up the component tree
* chore: remove extra container from lock icon
* chore: move fading logic into separate hook
* chore: move locked icon into separate component
* chore: rename variables
* use xlsx
* add existing custom fields to import map
* keep colours of existing custom fields
* use unknown
* fix
* revert
* allow space and upper case
* fix test
* define empty sheet
* remove custom field lowercasing
* don't allow custom field form to submit duplicate field
* remove unused
* update custom field tests
* also keep upper case when editing
* show key in UI
* also kep upper case when creating a new field
* fix test
* allow old forced case keys to stay as is
* allow space
* add extension to import
* supply initial key to CustomFieldForm
* refactor: improve element contrast
* refactor: style and composition
* consistent use of `customFieldLabelToKey`
* fix CopyTag
* remove log
---------
Co-authored-by: arc-alex <ac@omnivox.dk>
Co-authored-by: Carlos Valente <carlosvalente@pm.me>
* Revert "refactor: allow messages not starting with http"
This reverts commit 887e5c448e.
* Revert "refactor: allow messages not starting with http"
This reverts commit 6ce275da7a.
* pass full rundown to loadNow
* remove prevBlock from state
* refactor: simplify load logic (#1174)
* send clock to client on block start to avoid it showing -1 in the client
---------
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* chore: escalate stack trace to console
* refactor: event finding in roll
* docs: initial roll specification
* refactor: call to roll
* refactor: normalise index
* refactor: roll into next event
* refactor: hot reload on waiting to roll
* refactor: wait to roll next
* add frozen flag to runtime store
* add middleware for when frozen
* prevent rundown editing when frozen
* add endpoint to router to set frozen state
* add frozen property to rundown placeholder in client
* remove demo and test db JSON
* remove demo-db reference in Dockerfile
* remove preloaded-db folder in server
* cleanup package.json scripts
* remove db.json references from server
* setup detection of TImerPhase changes
* add integration event for transition to warning
* add integration event for transition to danger
---------
Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
* add test for linking start time in excel import
* link ids
* add link to UI
* ensure times with cachedRundown
---------
Co-authored-by: Carlos Valente <carlosvalente@pm.me>
- __Run docker image from compose__ by running `docker-compose up -d`
Other useful commands
- __List running processes__ by running `docker ps`
- __Kill running process__ by running `docker kill <process-id>`
## General Info
# APP Building
We build the app from app.js for almost all applications. The output file will still be named index.cjs. This is because of Electron.
Building the app from index.ts only applies for applications that don't use electron. index.ts will take over the initialization of the server and UI when electron isn't present.
<a href="https://www.buymeacoffee.com/cpvalente" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" height="32"></a>
<a href="https://hub.docker.com/r/getontime/ontime"><img alt="Get from Dockerhub" src="https://github.com/cpvalente/ontime/blob/master/.github/aux-images/dockerhub.png"/></a>
</div>
- Download for <a href="https://github.com/cpvalente/ontime/releases/latest/download/ontime-win64.exe">Windows</a>
- Download for <a href="https://github.com/cpvalente/ontime/releases/latest/download/ontime-macOS-arm64.dmg">MacOS Arm</a>
- Download for <a href="https://github.com/cpvalente/ontime/releases/latest/download/ontime-macOS-x64.dmg">MacOS Intel</a>
- Download AppImage for <a href="https://github.com/cpvalente/ontime/releases/latest/download/ontime-linux.AppImage">Linux</a>
... or
- Get from <a href="https://hub.docker.com/r/getontime/ontime">Docker hub</a>
- Install from <a href="https://www.npmjs.com/package/ontime">NPM</a>
- Install from <a href="https://formulae.brew.sh/cask/ontime">Homebrew</a>
## Need help?
We do our best to have most topics covered by the documentation. However, if your question is not covered, you are welcome to [fill in a bug report in an issue](https://github.com/cpvalente/ontime/issues), [ask a question in GitHub discussions](https://github.com/cpvalente/ontime/discussions) or hop in the [discord server](https://discord.com/invite/eje3CSUEXm) for a chat.
## Using Ontime?
Let us know!
Ontime improves from the collaboration with its users. We would like to understand how you use Ontime and appreciate your feedback.
We would also like to include a testimonials section in our ✨new website✨. It would be great to showcase the diversity of users running Ontime.
# Ontime
Ontime is an application for creating and managing event running order and timers.
Ontime is a browser-based application that manages event rundowns, scheduling, and cueing.
The user inputs a list of events along with scheduling and event information.
This will then populate a series of screens which are available to be rendered by any device in the Network.
With Ontime, you can plan, track your schedule, manage automation and cross-department show information all in one place.
This makes for a simple and cheap way to distribute over a venue using a network infrastructure instead of video
outputs.
Ontime is made by entertainment and broadcast engineers and used by
- [x]**Multiplatform**: Available for Windows / MacOS, Linux. You can also self host with the docker image
- [x]**In any device**: Ontime is available in the local network to any device with a browser, eg: tablets, mobile phones, laptops, signage, media servers...
- [x]**Made for teams**: Ontime caters to different roles in your production team: directors, operators, backstage and front of house signage...
- [x]**Delay workflows**: Manage and communicate runtime delays in real-time to your team
- [x]**Automatable**: Ontime can be fully or partially controlled by an operator, or run standalone with the system clock
- [x]**Focus on integrations**: Use one of the APIs provided (OSC, HTTP, Websocket) or the available [Companion module](https://bitfocus.io/connections/getontime-ontime) to integrate into your workflow (vMix, disguise, Qlab, OBS)
... and a lot more ...
### For live environments
Ontime is designed for use in live environments. \
This guides the application into being flexible and efficiently integrating into different workflows.
### For teams
All information added in Ontime is shared with the production team and other software / hardware in your workflow. \
Ontime also improves team collaboration with dedicated views for cuesheets and operators, and for public and production
signage.
### Simple infrastructure
All the data is distributed over the network, making its distribution and infrastructure flexible and cheap. \
With the availability of the docker image, you can also leverage IT infrastructure to make Ontime available online for
your team and clients.
Ontime is made by video engineers and entertainment technicians.
We want Ontime to be unique by targeting freelancers instead of roles.
We believe most freelancers work in different fields and we want to give you a tool that you can leverage across your
many environments and workflows.
We are not interested in forcing workflows and have made Ontime so, it is flexible to whichever way you would like to
work.
## Rich APIs for workflow integrations
The app is currently being developed for a broad user base, from broadcast to entertainment and
conference halls.
Taking advantage of the integrations, we currently use Ontime with:
-`disguise`: trigger Ontime from d3's timeline using the **OSC API**, and **render views** using d3's
webmodule
-`OBS`: **render views** using the Browser Module
-`QLab`: trigger Ontime using **OSC API**
-`Companion`: Ontime has a **companion module**. Issue report and feature requests should be done
in the [repository getontime/ontime](https://github.com/bitfocus/companion-module-getontime-ontime)
### Make your own viewer
Ontime broadcasts its data over WebSockets. This allows you to consume its data outside the application.
Writing a new view for the browser can be done with basic knowledge of HTML + CSS + Javascript (or any other language
that can run in the browser).
<br />
See [this repository](https://github.com/cpvalente/ontime-viewer-template-v2) with a small template on
how to get you started and read the docs about
the [Websocket API](https://ontime.gitbook.io/v2/control-and-feedback/ontime-apis#osc-and-websocket-api)
### Headless run️
You can self-host and run Ontime in a docker image.
The docker image along with documentation is [available Docker Hub at getontime/ontime](https://hub.docker.com/r/getontime/ontime)
If you want to run this image in a Raspberry Pi, please see [the docs](https://ontime.gitbook.io/v2/additional-notes/use-in-raspberry-pi)
More information is available [in our docs](https://docs.getontime.no)
## Roadmap
### Continued development
Several features are planned in the roadmap, and we continuously adjust this to match how users interact with the app.
<br />
Ontime is under active development. We continue adding and improving features in collaboration with users.
Have an idea? Reach out via [email](mail@getontime.no)
or [open an issue](https://github.com/cpvalente/ontime/issues/new)
### Issues
We use Github's issue tracking for bug reporting and feature requests. <br />
We use Github's issue tracking for bug reporting and feature requests. \
Found a bug? [Open an issue](https://github.com/cpvalente/ontime/issues/new).
#### Unsigned App
When installing the app you would see warning screens from the Operating System like:
in Windows
`Microsoft Defender SmartScreen prevented an unrecognised app from starting. Running this app might put your PC at risk.`
or
`Ontime can't be opened because it is from an unidentified developer`
or in Linux
`Could Not Display "ontime-linux.AppImage`
We currently only sign MacOS releases. \
Purchasing the certificates for both Mac and Windows would mean a recurrent expense which we are not able to cover.
You can circumvent this by allowing the execution of the app manually.
- In Windows: click more and select "Run Anyway"
-in macOS: the solution in macOS is different across versions, please refer to the [apple documentation](https://support.apple.com/en-gb/guide/mac-help/mh40616/mac)
- In Linux: right-click the AppImage file -> Properties -> Permissions -> select Allow Executing
File as a Program
- In Windows: click `more` -> `Run Anyway`
-In Linux: right-click the AppImage file: `Properties` -> `Permissions` -> `Allow Executing File as a Program`
Long story short: Ontime app is unsigned. </br>Purchasing the certificates for both Mac and Windows
would mean a recurrent expense and is not a priority. This is unlikely to change in future. If you
have tips on how to improve this or would like to sponsor the code signing,
If you have tips on how to improve this or would like to sponsor the code signing,
please [open an issue](https://github.com/cpvalente/ontime/issues/new)
#### Safari
There are known issues with Safari versions lower than 13:
- Spacing and text styles might have small inconsistencies
- Table view does not work
There is no plan for any further work on this.
# Contributing
## Contributing
Looking to contribute? All types of help are appreciated, from coding to testing and feature specification.
<br /><br />
If you are a developer and would like to contribute with some code, please open an issue to discuss before opening a
Pull Request.
<br />
If you are a developer and would like to contribute with code, please open an issue to discuss before opening a Pull Request.
Information about the project setup can be found in the [development documentation](./DEVELOPMENT.md)
Help is underway! ... and can be found [here](https://ontime.gitbook.io)
# License
## License
This project is licensed under the terms of the GNU GPL v3
## Sponsor
You can help the development of this project or say thank you with a one time donation. \
See [the terms of donations](https://github.com/cpvalente/ontime/blob/master/.github/FUNDING.md).
<p align="center">
<br>
<a href="https://www.buymeacoffee.com/cpvalente" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" width="200"></a>
Ontime does not exist as a fiscal entity. The sponsorship recipient is the project owner. In this light, contributors are funding the project owner's capacity to work on the project, not the project itself. As a contribution recipient, the code owner reserves the right to redistribute.
## Why sponsor
Ontime is and will remain free, regardless of your decision to contribute.
Regardless, you may choose to provide a monetary contribution:
### Improve user experience
Certain parts of the application user experience are tied to our capacity to pay for services. App signing and Google Sheets integration are good examples of this.
### Cool stuff
We may choose not to implement some features. This could be related to the complexity required, to the skill set, or to the fact that we just feel it doesn't improve the app for a significant percentage of users. In those cases, a feature may be considered "not worth it," regardless of its pertinence.
As a user, you can choose to sponsor a particular feature or donate to the app so that we can create bounties for features.
### Priorities
Monetary contributions are most immediately needed to offset the costs of presenting and distributing Ontime, i.e., hosting, domains, and certificates.
Additional funding will be considered according to the needs at the time.
@@ -21,6 +20,7 @@ export default function DelayInput(props: DelayInputProps) {
// avoid wrong submit on cancel
letignoreChange=false;
// set internal value on duration change
useEffect(()=>{
if(typeofduration==='undefined'){
return;
@@ -39,7 +39,7 @@ export default function DelayInput(props: DelayInputProps) {
}
constisNegative=newValue.startsWith('-');
letnewMillis=forgivingStringToMillis(newValue);
letnewMillis=parseUserTime(newValue);
if(isNegative){
newMillis=newMillis*-1;
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.