diff --git a/backend/src/enums/widget-type.enum.ts b/backend/src/enums/widget-type.enum.ts index 4a421be86..7af6c010e 100644 --- a/backend/src/enums/widget-type.enum.ts +++ b/backend/src/enums/widget-type.enum.ts @@ -18,5 +18,6 @@ export enum WidgetTypeEnum { URL = 'URL', Code = 'Code', Phone = 'Phone', - Country = 'Country' + Country = 'Country', + Color = 'Color' } diff --git a/frontend/src/app/components/dashboard/db-table-widgets/db-table-widgets.component.ts b/frontend/src/app/components/dashboard/db-table-widgets/db-table-widgets.component.ts index bf1076cb6..55af1b0b0 100644 --- a/frontend/src/app/components/dashboard/db-table-widgets/db-table-widgets.component.ts +++ b/frontend/src/app/components/dashboard/db-table-widgets/db-table-widgets.component.ts @@ -193,6 +193,8 @@ export class DbTableWidgetsComponent implements OnInit { "allow_negative": true } `, + Color: `// No settings required +// You can use this field to display colors in hex format, like #FF5733 or #333.`, } constructor( diff --git a/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.css b/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.css new file mode 100644 index 000000000..4e1b787a7 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.css @@ -0,0 +1,31 @@ +.color-edit-container { + width: 100%; +} + +.color-form-field { + width: 100%; +} + +.color-picker-container { + display: flex; + align-items: center; + margin-left: 8px; +} + +.color-picker-input { + width: 32px; + height: 32px; + border: none; + border-radius: 4px; + cursor: pointer; + outline: none; + background: none; + padding: 0; + margin-right: 8px; +} + +.color-picker-input:disabled { + cursor: not-allowed; + opacity: 0.6; +} + diff --git a/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.html b/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.html new file mode 100644 index 000000000..99e173663 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.html @@ -0,0 +1,19 @@ +
+ + {{normalizedLabel}} + +
+ +
+
+
\ No newline at end of file diff --git a/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.ts new file mode 100644 index 000000000..16d8c5b66 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.ts @@ -0,0 +1,36 @@ +import { Component, Injectable, Input } from '@angular/core'; + +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; +import { FormsModule } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; + +@Injectable() + +@Component({ + selector: 'app-edit-color', + templateUrl: './color.component.html', + styleUrls: ['./color.component.css'], + imports: [MatFormFieldModule, MatInputModule, FormsModule] +}) +export class ColorEditComponent extends BaseEditFieldComponent { + @Input() value: string; + + static type = 'color'; + + get isValidColor(): boolean { + if (!this.value) return false; + const colorRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/; + return colorRegex.test(this.value); + } + + onColorPickerChange(event: Event) { + const target = event.target as HTMLInputElement; + this.value = target.value; + this.onFieldChange.emit(this.value); + } + + onTextInputChange() { + this.onFieldChange.emit(this.value); + } +} \ No newline at end of file diff --git a/frontend/src/app/components/ui-components/table-display-fields/color/color.component.css b/frontend/src/app/components/ui-components/table-display-fields/color/color.component.css new file mode 100644 index 000000000..273272d64 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/color/color.component.css @@ -0,0 +1,17 @@ +.color-display { + display: flex; + align-items: center; + gap: 8px; +} + +.color-swatch { + width: 20px; + height: 20px; + border-radius: 4px; + /* border: 1px solid #ccc; */ + flex-shrink: 0; +} + +.field-value { + font-family: monospace; +} \ No newline at end of file diff --git a/frontend/src/app/components/ui-components/table-display-fields/color/color.component.html b/frontend/src/app/components/ui-components/table-display-fields/color/color.component.html new file mode 100644 index 000000000..331411389 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/color/color.component.html @@ -0,0 +1,18 @@ +
+
+
+ {{value || '—'}} +
+ +
\ No newline at end of file diff --git a/frontend/src/app/components/ui-components/table-display-fields/color/color.component.ts b/frontend/src/app/components/ui-components/table-display-fields/color/color.component.ts new file mode 100644 index 000000000..ed3651077 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/color/color.component.ts @@ -0,0 +1,23 @@ +import { Component, Injectable } from '@angular/core'; + +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { NgIf } from '@angular/common'; + +@Injectable() +@Component({ + selector: 'app-display-color', + templateUrl: './color.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './color.component.css'], + imports: [NgIf, ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class ColorDisplayComponent extends BaseTableDisplayFieldComponent { + get isValidColor(): boolean { + if (!this.value) return false; + const colorRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/; + return colorRegex.test(this.value); + } +} \ No newline at end of file diff --git a/frontend/src/app/consts/record-edit-types.ts b/frontend/src/app/consts/record-edit-types.ts index eb0295eed..efefaa413 100644 --- a/frontend/src/app/consts/record-edit-types.ts +++ b/frontend/src/app/consts/record-edit-types.ts @@ -1,6 +1,7 @@ import { BinaryDataCaptionEditComponent } from '../components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component'; import { BooleanEditComponent } from 'src/app/components/ui-components/record-edit-fields/boolean/boolean.component' import { CodeEditComponent } from '../components/ui-components/record-edit-fields/code/code.component'; +import { ColorEditComponent } from '../components/ui-components/record-edit-fields/color/color.component'; import { CountryEditComponent } from '../components/ui-components/record-edit-fields/country/country.component'; import { DateEditComponent } from '../components/ui-components/record-edit-fields/date/date.component'; import { DateTimeEditComponent } from '../components/ui-components/record-edit-fields/date-time/date-time.component'; @@ -49,6 +50,7 @@ export const UIwidgets = { Phone: PhoneEditComponent, Money: MoneyEditComponent, Foreign_key: ForeignKeyEditComponent, + Color: ColorEditComponent, } export const recordEditTypes = { diff --git a/frontend/src/app/consts/table-display-types.ts b/frontend/src/app/consts/table-display-types.ts index 9513fefb3..9dd1a089f 100644 --- a/frontend/src/app/consts/table-display-types.ts +++ b/frontend/src/app/consts/table-display-types.ts @@ -1,5 +1,6 @@ import { BooleanDisplayComponent } from 'src/app/components/ui-components/table-display-fields/boolean/boolean.component'; import { CodeDisplayComponent } from '../components/ui-components/table-display-fields/code/code.component'; +import { ColorDisplayComponent } from '../components/ui-components/table-display-fields/color/color.component'; import { CountryDisplayComponent } from '../components/ui-components/table-display-fields/country/country.component'; import { DateDisplayComponent } from '../components/ui-components/table-display-fields/date/date.component'; import { DateTimeDisplayComponent } from '../components/ui-components/table-display-fields/date-time/date-time.component'; @@ -42,6 +43,7 @@ export const UIwidgets = { Phone: PhoneDisplayComponent, Money: MoneyDisplayComponent, Foreign_key: ForeignKeyDisplayComponent, + Color: ColorDisplayComponent, } export const tableDisplayTypes = { diff --git a/shared-code/src/data-access-layer/shared/enums/table-widget-type.enum.ts b/shared-code/src/data-access-layer/shared/enums/table-widget-type.enum.ts index cbedd9c46..eac6aabeb 100644 --- a/shared-code/src/data-access-layer/shared/enums/table-widget-type.enum.ts +++ b/shared-code/src/data-access-layer/shared/enums/table-widget-type.enum.ts @@ -19,4 +19,5 @@ export enum TableWidgetTypeEnum { Code = 'Code', Phone = 'Phone', Country = 'Country', + Color = 'Color', }