mirror of
https://github.com/coder/coder.git
synced 2025-07-13 21:36:50 +00:00
chore: replace todos with issues (#1066)
This commit is contained in:
1
Makefile
1
Makefile
@ -35,7 +35,6 @@ endif
|
|||||||
.PHONY: fmt/prettier
|
.PHONY: fmt/prettier
|
||||||
|
|
||||||
fmt/sql: $(wildcard coderd/database/queries/*.sql)
|
fmt/sql: $(wildcard coderd/database/queries/*.sql)
|
||||||
# TODO: this is slightly slow
|
|
||||||
for fi in coderd/database/queries/*.sql; do \
|
for fi in coderd/database/queries/*.sql; do \
|
||||||
npx sql-formatter \
|
npx sql-formatter \
|
||||||
--language postgresql \
|
--language postgresql \
|
||||||
|
@ -3,8 +3,6 @@ package usershell
|
|||||||
import "os"
|
import "os"
|
||||||
|
|
||||||
// Get returns the $SHELL environment variable.
|
// Get returns the $SHELL environment variable.
|
||||||
// TODO: This should use "dscl" to fetch the proper value. See:
|
|
||||||
// https://stackoverflow.com/questions/16375519/how-to-get-the-default-shell
|
|
||||||
func Get(username string) (string, error) {
|
func Get(username string) (string, error) {
|
||||||
return os.Getenv("SHELL"), nil
|
return os.Getenv("SHELL"), nil
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ func workspaceAutostart() *cobra.Command {
|
|||||||
Short: "schedule a workspace to automatically start at a regular time",
|
Short: "schedule a workspace to automatically start at a regular time",
|
||||||
Long: autostartDescriptionLong,
|
Long: autostartDescriptionLong,
|
||||||
Example: "coder workspaces autostart enable my-workspace --minute 30 --hour 9 --days 1-5 --tz Europe/Dublin",
|
Example: "coder workspaces autostart enable my-workspace --minute 30 --hour 9 --days 1-5 --tz Europe/Dublin",
|
||||||
Hidden: true, // TODO(cian): un-hide when autostart scheduling implemented
|
Hidden: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
autostartCmd.AddCommand(workspaceAutostartEnable())
|
autostartCmd.AddCommand(workspaceAutostartEnable())
|
||||||
|
@ -22,7 +22,7 @@ func workspaceAutostop() *cobra.Command {
|
|||||||
Short: "schedule a workspace to automatically stop at a regular time",
|
Short: "schedule a workspace to automatically stop at a regular time",
|
||||||
Long: autostopDescriptionLong,
|
Long: autostopDescriptionLong,
|
||||||
Example: "coder workspaces autostop enable my-workspace --minute 0 --hour 18 --days 1-5 -tz Europe/Dublin",
|
Example: "coder workspaces autostop enable my-workspace --minute 0 --hour 18 --days 1-5 -tz Europe/Dublin",
|
||||||
Hidden: true, // TODO(cian): un-hide when autostop scheduling implemented
|
Hidden: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
autostopCmd.AddCommand(workspaceAutostopEnable())
|
autostopCmd.AddCommand(workspaceAutostopEnable())
|
||||||
|
@ -20,8 +20,6 @@ type Role struct {
|
|||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Site []Permission `json:"site"`
|
Site []Permission `json:"site"`
|
||||||
// Org is a map of orgid to permissions. We represent orgid as a string.
|
// Org is a map of orgid to permissions. We represent orgid as a string.
|
||||||
// TODO: Maybe switch to uuid, but tokens might need to support a "wildcard" org
|
|
||||||
// which could be a special uuid (like all 0s?)
|
|
||||||
Org map[string][]Permission `json:"org"`
|
Org map[string][]Permission `json:"org"`
|
||||||
User []Permission `json:"user"`
|
User []Permission `json:"user"`
|
||||||
}
|
}
|
||||||
@ -49,7 +47,6 @@ var (
|
|||||||
RoleAuditor = Role{
|
RoleAuditor = Role{
|
||||||
Name: "auditor",
|
Name: "auditor",
|
||||||
Site: permissions(map[Object][]Action{
|
Site: permissions(map[Object][]Action{
|
||||||
// TODO: @emyrk when audit logs are added, add back a read perm
|
|
||||||
//ResourceAuditLogs: {ActionRead},
|
//ResourceAuditLogs: {ActionRead},
|
||||||
// Should be able to read user details to associate with logs.
|
// Should be able to read user details to associate with logs.
|
||||||
// Without this the user-id in logs is not very helpful
|
// Without this the user-id in logs is not very helpful
|
||||||
|
@ -245,9 +245,9 @@ func (c *Channel) Write(bytes []byte) (n int, err error) {
|
|||||||
if c.dc.BufferedAmount()+uint64(len(bytes)) >= maxBufferedAmount {
|
if c.dc.BufferedAmount()+uint64(len(bytes)) >= maxBufferedAmount {
|
||||||
<-c.sendMore
|
<-c.sendMore
|
||||||
}
|
}
|
||||||
// TODO (@kyle): There's an obvious race-condition here.
|
// REMARK: There's an obvious race-condition here. This is an edge-case, as
|
||||||
// This is an edge-case, as most-frequently data won't
|
// most-frequently data won't be pooled so synchronously, but is
|
||||||
// be pooled so synchronously, but is definitely possible.
|
// definitely possible.
|
||||||
//
|
//
|
||||||
// See: https://github.com/pion/sctp/issues/181
|
// See: https://github.com/pion/sctp/issues/181
|
||||||
time.Sleep(time.Microsecond)
|
time.Sleep(time.Microsecond)
|
||||||
|
@ -57,10 +57,10 @@ interface WaitForClientSideNavigationOpts {
|
|||||||
* @remark This is necessary in a client-side SPA world since playwright
|
* @remark This is necessary in a client-side SPA world since playwright
|
||||||
* waitForNavigation waits for load events on the DOM (ex: after a page load
|
* waitForNavigation waits for load events on the DOM (ex: after a page load
|
||||||
* from the server).
|
* from the server).
|
||||||
*
|
|
||||||
* @todo Better logging for this.
|
|
||||||
*/
|
*/
|
||||||
export const waitForClientSideNavigation = async (page: Page, opts: WaitForClientSideNavigationOpts): Promise<void> => {
|
export const waitForClientSideNavigation = async (page: Page, opts: WaitForClientSideNavigationOpts): Promise<void> => {
|
||||||
|
console.info(`--- waitForClientSideNavigation: start`)
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
waitFor(() => {
|
waitFor(() => {
|
||||||
const conditions: boolean[] = []
|
const conditions: boolean[] = []
|
||||||
@ -74,9 +74,12 @@ export const waitForClientSideNavigation = async (page: Page, opts: WaitForClien
|
|||||||
}
|
}
|
||||||
|
|
||||||
const unmetConditions = conditions.filter((condition) => !condition)
|
const unmetConditions = conditions.filter((condition) => !condition)
|
||||||
|
console.info(`--- waitForClientSideNavigation: ${unmetConditions.length} conditions not met`)
|
||||||
|
|
||||||
return Promise.resolve(unmetConditions.length === 0)
|
return Promise.resolve(unmetConditions.length === 0)
|
||||||
}),
|
}),
|
||||||
page.waitForLoadState("networkidle"),
|
page.waitForLoadState("networkidle"),
|
||||||
])
|
])
|
||||||
|
|
||||||
|
console.info(`--- waitForClientSideNavigation: done`)
|
||||||
}
|
}
|
||||||
|
@ -270,8 +270,6 @@ func secureHeaders(next http.Handler) http.Handler {
|
|||||||
|
|
||||||
// Only scripts can manipulate the dom. This prevents someone from
|
// Only scripts can manipulate the dom. This prevents someone from
|
||||||
// naming themselves something like '<svg onload="alert(/cross-site-scripting/)" />'.
|
// naming themselves something like '<svg onload="alert(/cross-site-scripting/)" />'.
|
||||||
// TODO: @emyrk we need to make FE changes to enable this. We get 'TrustedHTML' and 'TrustedURL' errors
|
|
||||||
// that require FE changes to work.
|
|
||||||
// "require-trusted-types-for" : []string{"'script'"},
|
// "require-trusted-types-for" : []string{"'script'"},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ export interface FormTextFieldProps<T>
|
|||||||
* }}
|
* }}
|
||||||
* />
|
* />
|
||||||
*/
|
*/
|
||||||
eventTransform?: (value: string) => unknown
|
eventTransform?: (value: string) => string
|
||||||
/**
|
/**
|
||||||
* isPassword uses a PasswordField component when `true`; otherwise a
|
* isPassword uses a PasswordField component when `true`; otherwise a
|
||||||
* TextField component is used.
|
* TextField component is used.
|
||||||
@ -145,13 +145,8 @@ export const FormTextField = <T,>({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const event = e
|
const event = e
|
||||||
if (typeof eventTransform !== "undefined") {
|
if (typeof eventTransform !== "undefined" && typeof event.target.value === "string") {
|
||||||
// TODO(Grey): Asserting the type as a string here is not quite
|
event.target.value = eventTransform(e.target.value)
|
||||||
// right in that when an input is of type="number", the value will
|
|
||||||
// be a number. Type asserting is better than conversion for this
|
|
||||||
// reason, but perhaps there's a better way to do this without any
|
|
||||||
// assertions.
|
|
||||||
event.target.value = eventTransform(e.target.value) as string
|
|
||||||
}
|
}
|
||||||
form.handleChange(event)
|
form.handleChange(event)
|
||||||
}}
|
}}
|
||||||
|
@ -25,9 +25,8 @@ export const TemplatePage: React.FC = () => {
|
|||||||
() => `/api/v2/organizations/${unsafeSWRArgument(organizationInfo).id}/templates/${templateName}`,
|
() => `/api/v2/organizations/${unsafeSWRArgument(organizationInfo).id}/templates/${templateName}`,
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: The workspaces endpoint was recently changed, so that we can't get
|
// This just grabs all workspaces... and then later filters them to match the
|
||||||
// workspaces per-template. This just grabs all workspaces... and then
|
// current template.
|
||||||
// later filters them to match the current template.
|
|
||||||
const { data: workspaces, error: workspacesError } = useSWR<Workspace[], Error>(() => `/api/v2/users/me/workspaces`)
|
const { data: workspaces, error: workspacesError } = useSWR<Workspace[], Error>(() => `/api/v2/users/me/workspaces`)
|
||||||
|
|
||||||
if (organizationError) {
|
if (organizationError) {
|
||||||
|
Reference in New Issue
Block a user