유형별 구성으로 프로젝트의 데이터 구조를 확장하기 위해 새로운 사용자 정의 필드를 추가합니다.
사용자 정의 필드 생성
사용자 정의 필드는 기록에 구조화된 데이터 필드를 추가하여 Blue를 특정 비즈니스 요구에 맞게 조정할 수 있게 해줍니다. 이 엔드포인트는 각 필드 유형에 특정한 구성을 가진 새로운 사용자 정의 필드를 생성합니다.
기본 예제
mutation CreateTextField {
createCustomField(input: {
name: "Customer Name"
type: TEXT_SINGLE
description: "Primary customer contact name"
}) {
id
uid
name
type
position
}
}
고급 예제
mutation CreateAdvancedField {
createCustomField(input: {
name: "Project Budget"
type: CURRENCY
description: "Total allocated budget for this project"
currency: "USD"
min: 0
max: 1000000
}) {
id
uid
name
type
currency
min
max
position
createdAt
}
}
입력 매개변수
CreateCustomFieldInput
매개변수 | 유형 | 필수 | 설명 |
---|---|---|---|
name |
String! | ✅ 예 | 사용자 정의 필드의 표시 이름 |
type |
CustomFieldType! | ✅ 예 | 필드 유형 (아래 유형 참조) |
description |
String | 아니오 | 필드의 목적을 설명하는 선택적 설명 |
min |
Float | 아니오 | NUMBER, RATING, PERCENT 필드의 최소값 |
max |
Float | 아니오 | NUMBER, RATING, PERCENT 필드의 최대값 |
currency |
String | 아니오 | CURRENCY 필드의 ISO 통화 코드 |
prefix |
String | 아니오 | UNIQUE_ID 필드의 텍스트 접두사 |
isDueDate |
Boolean | 아니오 | DATE 필드가 마감일을 나타내는지 여부 |
formula |
JSON | 아니오 | FORMULA 필드의 공식 구성 |
referenceProjectId |
String | 아니오 | REFERENCE 필드의 대상 프로젝트 ID |
referenceMultiple |
Boolean | 아니오 | REFERENCE 필드에서 여러 선택 허용 |
referenceFilter |
TodoFilterInput | 아니오 | REFERENCE 필드의 필터 옵션 |
lookupOption |
CustomFieldLookupOptionInput | 아니오 | LOOKUP 필드의 구성 |
timeDurationDisplay |
CustomFieldTimeDurationDisplayType | 아니오 | TIME_DURATION의 표시 형식 |
timeDurationTargetTime |
Float | 아니오 | TIME_DURATION의 초 단위 목표 시간 |
timeDurationStartInput |
CustomFieldTimeDurationInput | 아니오 | TIME_DURATION의 시작 트리거 |
timeDurationEndInput |
CustomFieldTimeDurationInput | 아니오 | TIME_DURATION의 종료 트리거 |
buttonType |
String | 아니오 | BUTTON 필드의 버튼 동작 유형 |
buttonConfirmText |
String | 아니오 | BUTTON 필드의 확인 프롬프트 |
useSequenceUniqueId |
Boolean | 아니오 | UNIQUE_ID에 대한 순차 번호 사용 |
sequenceDigits |
Int | 아니오 | 시퀀스의 자릿수 (예: 5 → 00001) |
sequenceStartingNumber |
Int | 아니오 | 시퀀스의 시작 번호 |
currencyFieldId |
String | 아니오 | CURRENCY_CONVERSION의 참조 통화 필드 |
conversionDate |
String | 아니오 | CURRENCY_CONVERSION의 변환 날짜 |
conversionDateType |
String | 아니오 | CURRENCY_CONVERSION의 변환 날짜 유형 |
metadata |
JSON | 아니오 | 사용자 정의 필드에 대한 추가 메타데이터 |
CustomFieldType 값
값 | 설명 | 필수 매개변수 |
---|---|---|
TEXT_SINGLE |
단일 행 텍스트 입력 | 없음 |
TEXT_MULTI |
다중 행 텍스트 영역 | 없음 |
SELECT_SINGLE |
단일 선택 드롭다운 | Create options separately |
SELECT_MULTI |
다중 선택 드롭다운 | Create options separately |
CHECKBOX |
불리언 체크박스 | 없음 |
RATING |
별점 필드 | Optional: max (default: 5) |
PHONE |
유효성 검사와 함께 전화번호 | 없음 |
NUMBER |
숫자 입력 | Optional: min , max |
CURRENCY |
통화 금액 | Optional: currency , min , max |
PERCENT |
백분율 (0-100) | Optional: min , max |
EMAIL |
유효성 검사와 함께 이메일 | 없음 |
URL |
유효성 검사와 함께 웹 URL | 없음 |
UNIQUE_ID |
자동 생성된 식별자 | Optional: prefix , useSequenceUniqueId |
LOCATION |
지리적 좌표 | 없음 |
FILE |
파일 첨부 | 없음 |
DATE |
날짜 선택기 | Optional: isDueDate |
COUNTRY |
국가 선택기 | 없음 |
FORMULA |
계산된 필드 | Required: formula |
REFERENCE |
다른 기록에 대한 링크 | Required: referenceProjectId |
LOOKUP |
참조에서 데이터 가져오기 | Required: lookupOption |
TIME_DURATION |
시간 추적 | Required: duration inputs (see below) |
BUTTON |
액션 버튼 | Optional: buttonType , buttonConfirmText |
CURRENCY_CONVERSION |
통화 변환기 | Special configuration |
필드 유형 구성 예제
제약 조건이 있는 숫자 필드
mutation CreateQuantityField {
createCustomField(input: {
name: "Quantity"
type: NUMBER
description: "Number of items"
min: 1
max: 999
}) {
id
name
min
max
}
}
통화 필드
mutation CreateBudgetField {
createCustomField(input: {
name: "Budget"
type: CURRENCY
currency: "EUR"
min: 0
}) {
id
name
currency
min
}
}
마감일 플래그가 있는 날짜 필드
mutation CreateDeadlineField {
createCustomField(input: {
name: "Project Deadline"
type: DATE
isDueDate: true
description: "When this project must be completed"
}) {
id
name
isDueDate
}
}
참조 필드
mutation CreateRelatedTasksField {
createCustomField(input: {
name: "Dependencies"
type: REFERENCE
referenceProjectId: "proj_abc123"
referenceMultiple: true
referenceFilter: {
statusIds: ["status_open", "status_inprogress"]
}
}) {
id
name
referenceProjectId
referenceMultiple
}
}
조회 필드
mutation CreateLookupField {
createCustomField(input: {
name: "Customer Email"
type: LOOKUP
lookupOption: {
referenceId: "field_customer_ref"
lookupId: "field_email"
lookupType: TODO_CUSTOM_FIELD
}
}) {
id
name
customFieldLookupOption {
referenceId
lookupId
lookupType
}
}
}
시퀀스가 있는 고유 ID
mutation CreateOrderNumberField {
createCustomField(input: {
name: "Order Number"
type: UNIQUE_ID
prefix: "ORD-"
useSequenceUniqueId: true
sequenceDigits: 6
sequenceStartingNumber: 1000
}) {
id
name
prefix
}
}
시간 지속 필드
mutation CreateTimeTrackingField {
createCustomField(input: {
name: "Time to Resolution"
type: TIME_DURATION
timeDurationDisplay: FULL_DATE_STRING
timeDurationStartInput: {
type: TODO_CREATED_AT
condition: FIRST
}
timeDurationEndInput: {
type: TODO_MARKED_AS_COMPLETE
condition: FIRST
}
}) {
id
name
}
}
유효한 시간 지속 유형
TODO_CREATED_AT
- 레코드가 생성된 시간TODO_CUSTOM_FIELD
- 사용자 정의 필드가 변경될 때TODO_DUE_DATE
- 마감일이 설정/변경될 때TODO_MARKED_AS_COMPLETE
- 레코드가 완료로 표시될 때TODO_MOVED
- 레코드가 다른 목록으로 이동될 때TODO_TAG_ADDED
- 태그가 추가될 때TODO_ASSIGNEE_ADDED
- 담당자가 추가될 때
선택 옵션 생성
SELECT_SINGLE 또는 SELECT_MULTI 필드를 생성한 후 옵션을 추가합니다:
mutation CreateSelectOptions {
createCustomFieldOptions(input: {
customFieldId: "field_xyz789"
customFieldOptions: [
{ title: "High", color: "#FF0000", position: 1 }
{ title: "Medium", color: "#FFA500", position: 2 }
{ title: "Low", color: "#00FF00", position: 3 }
]
}) {
id
title
color
position
}
}
응답 필드
CustomField
필드 | 유형 | 설명 |
---|---|---|
id |
String! | 고유 식별자 |
uid |
String! | 사용자 친화적인 고유 ID |
name |
String! | 표시 이름 |
type |
CustomFieldType! | 필드 유형 |
description |
String | 필드 설명 |
position |
Float! | 표시 순서 위치 |
createdAt |
DateTime! | 생성 타임스탬프 |
updatedAt |
DateTime! | 마지막 업데이트 타임스탬프 |
min |
Float | 최소값 (해당되는 경우) |
max |
Float | 최대값 (해당되는 경우) |
currency |
String | 통화 코드 (CURRENCY 유형) |
prefix |
String | ID 접두사 (UNIQUE_ID 유형) |
isDueDate |
Boolean | 마감일 플래그 (DATE 유형) |
formula |
JSON | 공식 구성 (FORMULA 유형) |
referenceProjectId |
String | 참조된 프로젝트 (REFERENCE 유형) |
customFieldLookupOption |
CustomFieldLookupOption | 조회 구성 (LOOKUP 유형) |
필수 권한
사용자 정의 필드를 생성하려면 프로젝트 접근이 필요합니다:
역할 | 사용자 정의 필드 생성 가능 |
---|---|
OWNER |
✅ 예 |
ADMIN |
✅ 예 |
MEMBER |
✅ 예 |
CLIENT |
❌ 아니오 |
참고: 사용자 정의 역할은 필드 관리에 대한 추가 제한이 있을 수 있습니다.
오류 응답
잘못된 필드 유형
{
"errors": [{
"message": "Variable \"$input\" got invalid value \"INVALID\" at \"input.type\"; Value \"INVALID\" does not exist in \"CustomFieldType\" enum.",
"extensions": {
"code": "GRAPHQL_VALIDATION_FAILED"
}
}]
}
참조 프로젝트를 찾을 수 없음
{
"errors": [{
"message": "Reference project not found or access denied",
"extensions": {
"code": "PROJECT_NOT_FOUND"
}
}]
}
필수 구성 누락
{
"errors": [{
"message": "REFERENCE fields require referenceProjectId",
"extensions": {
"code": "VALIDATION_ERROR"
}
}]
}
중요 사항
- 필드 위치: 기존 필드의 끝에 나타나도록 자동으로 계산됨
- 필드 제한: 프로젝트는 사용자 정의 필드의 수에 제한이 있을 수 있음
- 즉시 사용 가능: 생성된 필드는 즉시 사용 가능
- 부작용: 필드를 생성하면 다음이 발생함:
- 활동 로그 항목
- 연결된 사용자에 대한 실시간 업데이트
- 웹훅 알림
- FORMULA, LOOKUP 및 UNIQUE_ID 필드에 대한 백그라운드 작업
- 특별 고려 사항:
- REFERENCE 필드는 대상 프로젝트에 대한 접근이 필요함
- LOOKUP 필드는 기존 REFERENCE 필드에 의존함
- FORMULA 필드는 자신을 참조할 수 없음
- UNIQUE_ID 시퀀스는 비동기적으로 처리됨
- SELECT 필드는 별도로 옵션을 생성해야 함
- 명명: 필드 이름은 UI에 나타나는 대로 명확하고 설명적이어야 함
관련 엔드포인트
- 사용자 정의 필드 목록 - 기존 사용자 정의 필드 보기
- 사용자 정의 필드 업데이트 - 필드 속성 수정
- 사용자 정의 필드 삭제 - 사용자 정의 필드 제거
- 필드 옵션 생성 - 선택 필드에 옵션 추가
- 사용자 정의 필드 값 설정 - 레코드에 값 설정