diff --git a/frontend/src/app/components/dashboard/db-table-filters-dialog/db-table-filters-dialog.component.ts b/frontend/src/app/components/dashboard/db-table-filters-dialog/db-table-filters-dialog.component.ts index 4db8e92dc..897e3bb01 100644 --- a/frontend/src/app/components/dashboard/db-table-filters-dialog/db-table-filters-dialog.component.ts +++ b/frontend/src/app/components/dashboard/db-table-filters-dialog/db-table-filters-dialog.component.ts @@ -11,7 +11,7 @@ import { MatSelectModule } from '@angular/material/select'; import { TablesService } from 'src/app/services/tables.service'; import { TableField, TableForeignKey, Widget } from 'src/app/models/table'; import { ConnectionsService } from 'src/app/services/connections.service'; -import { UIwidgets } from 'src/app/consts/field-types'; +import { UIwidgets } from 'src/app/consts/record-edit-types'; import { filterTypes } from 'src/app/consts/filter-types'; import { ActivatedRoute } from '@angular/router'; import { getComparatorsFromUrl, getFiltersFromUrl } from 'src/app/lib/parse-filter-params'; diff --git a/frontend/src/app/components/dashboard/db-table-widgets/db-table-widgets.component.html b/frontend/src/app/components/dashboard/db-table-widgets/db-table-widgets.component.html index a00c04e3d..32f005a3d 100644 --- a/frontend/src/app/components/dashboard/db-table-widgets/db-table-widgets.component.html +++ b/frontend/src/app/components/dashboard/db-table-widgets/db-table-widgets.component.html @@ -71,36 +71,36 @@
- - + arrow_downward - - +
- - + arrow_downward - - +
- - + arrow_downward - - +
- - + arrow_downward - - +
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 879a4777f..a4f56314b 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 @@ -4,31 +4,31 @@ import { TableField, Widget } from 'src/app/models/table'; import { AlertComponent } from '../../ui-components/alert/alert.component'; import { BreadcrumbsComponent } from '../../ui-components/breadcrumbs/breadcrumbs.component'; -import { CodeRowComponent } from '../../ui-components/row-fields/code/code.component'; +import { CodeEditComponent } from '../../ui-components/record-edit-fields/code/code.component'; import { CommonModule } from '@angular/common'; import { CompanyService } from 'src/app/services/company.service'; import { ConnectionsService } from 'src/app/services/connections.service'; import { FormsModule } from '@angular/forms'; -import { ImageRowComponent } from '../../ui-components/row-fields/image/image.component'; +import { ImageEditComponent } from '../../ui-components/record-edit-fields/image/image.component'; import { Location } from '@angular/common'; -import { LongTextRowComponent } from '../../ui-components/row-fields/long-text/long-text.component'; +import { LongTextEditComponent } from '../../ui-components/record-edit-fields/long-text/long-text.component'; import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { MatDialogModule } from '@angular/material/dialog'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; -import { PasswordRowComponent } from '../../ui-components/row-fields/password/password.component'; +import { PasswordEditComponent } from '../../ui-components/record-edit-fields/password/password.component'; import { PlaceholderTableWidgetsComponent } from '../../skeletons/placeholder-table-widgets/placeholder-table-widgets.component'; import { Router } from '@angular/router'; import { RouterModule } from '@angular/router'; -import { SelectRowComponent } from '../../ui-components/row-fields/select/select.component'; +import { SelectEditComponent } from '../../ui-components/record-edit-fields/select/select.component'; import { TablesService } from 'src/app/services/tables.service'; -import { TextRowComponent } from '../../ui-components/row-fields/text/text.component'; +import { TextEditComponent } from '../../ui-components/record-edit-fields/text/text.component'; import { Title } from '@angular/platform-browser'; -import { UIwidgets } from "src/app/consts/field-types"; +import { UIwidgets } from "src/app/consts/record-edit-types"; import { UiSettingsService } from 'src/app/services/ui-settings.service'; -import { UrlRowComponent } from '../../ui-components/row-fields/url/url.component'; +import { UrlEditComponent } from '../../ui-components/record-edit-fields/url/url.component'; import { WidgetComponent } from './widget/widget.component'; import { WidgetDeleteDialogComponent } from './widget-delete-dialog/widget-delete-dialog.component'; import { difference } from "lodash"; @@ -50,13 +50,13 @@ import { normalizeTableName } from 'src/app/lib/normalize'; AlertComponent, PlaceholderTableWidgetsComponent, BreadcrumbsComponent, - PasswordRowComponent, - ImageRowComponent, - CodeRowComponent, + PasswordEditComponent, + ImageEditComponent, + CodeEditComponent, WidgetComponent, - TextRowComponent, - LongTextRowComponent, - SelectRowComponent, + TextEditComponent, + LongTextEditComponent, + SelectEditComponent, Angulartics2OnModule ], }) diff --git a/frontend/src/app/components/dashboard/db-table/db-table.component.css b/frontend/src/app/components/dashboard/db-table/db-table.component.css index 9404e6aad..dbacd76ee 100644 --- a/frontend/src/app/components/dashboard/db-table/db-table.component.css +++ b/frontend/src/app/components/dashboard/db-table/db-table.component.css @@ -444,66 +444,18 @@ th.mat-header-cell, td.mat-cell { } } -.field-value { - position: relative; - display: inline-block; - width: 100%; -} - @media (prefers-color-scheme: light) { - .field-value { + .table-cell-content { color: rgba(0, 0, 0, 0.64) } } @media (prefers-color-scheme: dark) { - .field-value { + .table-cell-content { color: rgba(255, 255, 255, 0.64) } } -.field-image { - display: block; - height: var(--height); - margin: 12px 0; -} - -.field-link { - display: flex; - align-items: center; - gap: 4px; - color: var(--color-primaryPalette-500); -} - -.field-link__icon { - flex-shrink: 0; - margin-bottom: -2px; - width: 16px; - height: 16px; - font-size: 16px; -} - -.field-value-copy-button { - position: absolute; - right: -6px; - top: 50%; - display: none; - transform: translate(0, -50%) scale(0.85); - background-color: var(--hover-color); -} - -@media (prefers-color-scheme: dark) { - .field-value-copy-button { - --hover-color: var(--color-primaryPalette-800); - } -} - -@media (prefers-color-scheme: light) { - .field-value-copy-button { - --hover-color: var(--color-primaryPalette-50); - } -} - .db-table-cell:hover .field-value-copy-button { display: initial; } @@ -533,32 +485,6 @@ tr.mat-row:hover { top: 40px; } -.foreign-key-button { - background: transparent; - border: 1px solid transparent; - border-radius: 12px; - color: var(--color-accentedPalette-500); - cursor: pointer; - font-size: inherit; - padding: 2px 8px; - overflow: hidden; - text-overflow: ellipsis; - text-align: left; - max-width: 100%; - transition: background 100ms, border-color 100ms; -} - -.foreign-key-button:hover{ - background-color: var(--color-accentedPalette-100); - border: 1px solid var(--color-accentedPalette-300); -} - -.foreign-key-button_selected { - background-color: var(--color-accentedPalette-100); - border-radius: 12px; - border: 1px solid var(--color-accentedPalette-300); -} - .empty-table { display: flex; flex-direction: column; diff --git a/frontend/src/app/components/dashboard/db-table/db-table.component.html b/frontend/src/app/components/dashboard/db-table/db-table.component.html index ab93ad4c2..64474682d 100644 --- a/frontend/src/app/components/dashboard/db-table/db-table.component.html +++ b/frontend/src/app/components/dashboard/db-table/db-table.component.html @@ -216,81 +216,39 @@

{{ displayName }}

{{ tableData.dataNormalizedColumns[column] }}
- - - - - + + + + -
- - - - link - {{element[column]}} - - - {{ getWidgetValue(column, element[column]) }} - - -
+ + - - {{element[column] || 'โ€”'}} - - - - - {{element[column] || 'โ€”'}} - - - + +
diff --git a/frontend/src/app/components/dashboard/db-table/db-table.component.spec.ts b/frontend/src/app/components/dashboard/db-table/db-table.component.spec.ts index 6366f8b31..7af381b95 100644 --- a/frontend/src/app/components/dashboard/db-table/db-table.component.spec.ts +++ b/frontend/src/app/components/dashboard/db-table/db-table.component.spec.ts @@ -132,24 +132,6 @@ describe('DbTableComponent', () => { expect(isWigetAge).toBeTrue(); }); - it('should return label from id for Select widget', () => { - component.tableData.widgets = mockWidgets; - component.tableData.selectWidgetsOptions = mockSelectOption; - - const selectDisplayedValue = component.getWidgetValue('Region', 'CA'); - - expect(selectDisplayedValue).toEqual('California'); - }); - - it('should return value if widget is not Select', () => { - component.tableData.widgets = mockWidgets; - component.tableData.selectWidgetsOptions = mockSelectOption; - - const selectDisplayedValue = component.getWidgetValue('address_id', '0987654321'); - - expect(selectDisplayedValue).toEqual('0987654321'); - }); - it('should return 2 for active filters with object of two fileds', () => { const numberOfFilters = component.getFiltersCount({ "Country": "ะก", "Name": "John"}) diff --git a/frontend/src/app/components/dashboard/db-table/db-table.component.ts b/frontend/src/app/components/dashboard/db-table/db-table.component.ts index bbe84a653..b4a586bb5 100644 --- a/frontend/src/app/components/dashboard/db-table/db-table.component.ts +++ b/frontend/src/app/components/dashboard/db-table/db-table.component.ts @@ -5,16 +5,32 @@ import { Component, EventEmitter, Input, OnInit, Output, SimpleChanges, ViewChil import { CustomAction, TableForeignKey, TablePermissions, TableProperties, TableRow, Widget } from 'src/app/models/table'; import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { Observable, merge, of } from 'rxjs'; +import { UIwidgets, tableDisplayTypes } from '../../../consts/table-display-types'; import { map, startWith, tap } from 'rxjs/operators'; import { AccessLevel } from 'src/app/models/user'; import { Angulartics2OnModule } from 'angulartics2'; +// Import all display components +import { BaseTableDisplayFieldComponent } from '../../ui-components/table-display-fields/base-table-display-field/base-table-display-field.component'; +import { BooleanDisplayComponent } from '../../ui-components/table-display-fields/boolean/boolean.component'; import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CodeDisplayComponent } from '../../ui-components/table-display-fields/code/code.component'; import { CommonModule } from '@angular/common'; +import { ConnectionsService } from 'src/app/services/connections.service'; +import { CountryDisplayComponent } from '../../ui-components/table-display-fields/country/country.component'; +import { DateDisplayComponent } from '../../ui-components/table-display-fields/date/date.component'; +import { DateTimeDisplayComponent } from '../../ui-components/table-display-fields/date-time/date-time.component'; import { DbTableExportDialogComponent } from '../db-table-export-dialog/db-table-export-dialog.component'; import { DbTableImportDialogComponent } from '../db-table-import-dialog/db-table-import-dialog.component'; import { DragDropModule } from '@angular/cdk/drag-drop'; +import { DynamicModule } from 'ng-dynamic-component'; +import { FileDisplayComponent } from '../../ui-components/table-display-fields/file/file.component'; +import { ForeignKeyDisplayComponent } from '../../ui-components/table-display-fields/foreign-key/foreign-key.component'; +import { IdDisplayComponent } from '../../ui-components/table-display-fields/id/id.component'; +import { ImageDisplayComponent } from '../../ui-components/table-display-fields/image/image.component'; +import { JsonEditorDisplayComponent } from '../../ui-components/table-display-fields/json-editor/json-editor.component'; import JsonURL from "@jsonurl/jsonurl"; +import { LongTextDisplayComponent } from '../../ui-components/table-display-fields/long-text/long-text.component'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; @@ -31,14 +47,26 @@ import { MatSort } from '@angular/material/sort'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; import { MatTooltipModule } from '@angular/material/tooltip'; +import { MoneyDisplayComponent } from '../../ui-components/table-display-fields/money/money.component'; import { NotificationsService } from 'src/app/services/notifications.service'; +import { NumberDisplayComponent } from '../../ui-components/table-display-fields/number/number.component'; +import { PasswordDisplayComponent } from '../../ui-components/table-display-fields/password/password.component'; +import { PhoneDisplayComponent } from '../../ui-components/table-display-fields/phone/phone.component'; import { PlaceholderTableDataComponent } from '../../skeletons/placeholder-table-data/placeholder-table-data.component'; +import { PointDisplayComponent } from '../../ui-components/table-display-fields/point/point.component'; import { RouterModule } from '@angular/router'; +import { SelectDisplayComponent } from '../../ui-components/table-display-fields/select/select.component'; import { SelectionModel } from '@angular/cdk/collections'; +import { StaticTextDisplayComponent } from '../../ui-components/table-display-fields/static-text/static-text.component'; import { TableRowService } from 'src/app/services/table-row.service'; import { TableStateService } from 'src/app/services/table-state.service'; +import { TextDisplayComponent } from '../../ui-components/table-display-fields/text/text.component'; +import { TimeDisplayComponent } from '../../ui-components/table-display-fields/time/time.component'; +import { TimeIntervalDisplayComponent } from '../../ui-components/table-display-fields/time-interval/time-interval.component'; +import { UrlDisplayComponent } from '../../ui-components/table-display-fields/url/url.component'; import { formatFieldValue } from 'src/app/lib/format-field-value'; import { normalizeTableName } from '../../../lib/normalize' +import { getTableTypes } from 'src/app/lib/setup-table-row-structure'; interface Column { title: string, @@ -70,7 +98,32 @@ interface Column { ClipboardModule, DragDropModule, Angulartics2OnModule, - PlaceholderTableDataComponent + PlaceholderTableDataComponent, + DynamicModule, + // Display components for different field types + // BaseTableDisplayFieldComponent, + // TextDisplayComponent, + // LongTextDisplayComponent, + // IdDisplayComponent, + // BooleanDisplayComponent, + ForeignKeyDisplayComponent, + // DateDisplayComponent, + // DateTimeDisplayComponent, + // TimeDisplayComponent, + // SelectDisplayComponent, + // CodeDisplayComponent, + // MoneyDisplayComponent, + // PasswordDisplayComponent, + // FileDisplayComponent, + // ImageDisplayComponent, + // UrlDisplayComponent, + // JsonEditorDisplayComponent, + // NumberDisplayComponent, + // StaticTextDisplayComponent, + // CountryDisplayComponent, + // PhoneDisplayComponent, + // PointDisplayComponent, + // TimeIntervalDisplayComponent ] }) @@ -118,6 +171,9 @@ export class DbTableComponent implements OnInit { public selectedRow: TableRow = null; public selectedRowType: 'record' | 'foreignKey' = 'record'; public tableRelatedRecords: any = null; + public displayCellComponents; + public UIwidgets = UIwidgets; + public tableTypes: object; @Input() set table(value){ if (value) this.tableData = value; @@ -130,6 +186,7 @@ export class DbTableComponent implements OnInit { private _tableState: TableStateService, private _notifications: NotificationsService, private _tableRow: TableRowService, + private _connections: ConnectionsService, private route: ActivatedRoute, public router: Router, public dialog: MatDialog, @@ -163,6 +220,10 @@ export class DbTableComponent implements OnInit { ngOnInit() { this.searchString = this.route.snapshot.queryParams.search; + + const connectionType = this._connections.currentConnection.type; + this.displayCellComponents = tableDisplayTypes[connectionType]; + this._tableState.cast.subscribe(row => { this.selectedRow = row; }); @@ -223,17 +284,6 @@ export class DbTableComponent implements OnInit { if (this.tableData.widgetsList) return this.tableData.widgetsList.includes(column); } - getWidgetValue(column: string, value: string) { - if (this.tableData.widgets[column].widget_type === 'Select') { - const fieldOptions = this.tableData.widgets[column].widget_params.options; - if (fieldOptions) { - const cellValue = fieldOptions.find(option => option.value === value); - if (cellValue) return cellValue.label - } - } - return value; - } - getCellValue(foreignKey: TableForeignKey, cell) { const identityColumnName = Object.keys(cell).find(key => key !== foreignKey.referenced_column_name); if (identityColumnName) { @@ -406,8 +456,7 @@ export class DbTableComponent implements OnInit { }); } - handleForeignKeyView(event, foreignKeys, row) { - event.stopPropagation(); + handleForeignKeyView(foreignKeys, row) { this.selectedRowType = 'foreignKey'; this._tableState.selectRow({ @@ -489,7 +538,7 @@ export class DbTableComponent implements OnInit { return false; } - showCopyNotification(message: string) { + showCopyNotification = (message: string) => { this._notifications.showSuccessSnackbar(message); } diff --git a/frontend/src/app/components/dashboard/db-tables-data-source.ts b/frontend/src/app/components/dashboard/db-tables-data-source.ts index aeb3875a8..3d6452fee 100644 --- a/frontend/src/app/components/dashboard/db-tables-data-source.ts +++ b/frontend/src/app/components/dashboard/db-tables-data-source.ts @@ -18,6 +18,7 @@ import { UiSettingsService } from 'src/app/services/ui-settings.service'; import { UserService } from 'src/app/services/user.service'; import { filter } from "lodash"; import { formatFieldValue } from 'src/app/lib/format-field-value'; +import { getTableTypes } from 'src/app/lib/setup-table-row-structure'; import { normalizeFieldName } from 'src/app/lib/normalize'; interface Column { @@ -67,6 +68,7 @@ export class TablesDataSource implements DataSource { } = {}; public widgetsCount: number = 0; public selectWidgetsOptions: object; + public tableTypes: object = {}; public relatedRecords = { referenced_on_column_name: '', referenced_by: [] @@ -211,6 +213,8 @@ export class TablesDataSource implements DataSource { ); } + this.tableTypes = getTableTypes(res.structure, this.foreignKeysList); + let orderedColumns: TableField[]; if (res.list_fields.length) { orderedColumns = res.structure.sort((fieldA: TableField, fieldB: TableField) => res.list_fields.indexOf(fieldA.column_name) - res.list_fields.indexOf(fieldB.column_name)); diff --git a/frontend/src/app/components/db-table-row-edit/db-table-row-edit.component.ts b/frontend/src/app/components/db-table-row-edit/db-table-row-edit.component.ts index beccb522c..488e2d4a1 100644 --- a/frontend/src/app/components/db-table-row-edit/db-table-row-edit.component.ts +++ b/frontend/src/app/components/db-table-row-edit/db-table-row-edit.component.ts @@ -6,7 +6,7 @@ import { Component, NgZone, OnInit } from '@angular/core'; import { CustomAction, CustomActionType, CustomEvent, TableField, TableForeignKey, TablePermissions, Widget } from 'src/app/models/table'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatProgressSpinnerModule, MatSpinner } from '@angular/material/progress-spinner'; -import { UIwidgets, defaultTimestampValues, fieldTypes, timestampTypes } from 'src/app/consts/field-types'; +import { UIwidgets, defaultTimestampValues, recordEditTypes, timestampTypes } from 'src/app/consts/record-edit-types'; import { normalizeFieldName, normalizeTableName } from 'src/app/lib/normalize'; import { AlertComponent } from '../ui-components/alert/alert.component'; @@ -436,7 +436,7 @@ export class DbTableRowEditComponent implements OnInit { } get inputs() { - return fieldTypes[this.connectionType] + return recordEditTypes[this.connectionType] } get currentConnection() { @@ -547,7 +547,7 @@ export class DbTableRowEditComponent implements OnInit { if (this.connectionType === DBtype.MySQL) { const datetimeFields = Object.entries(this.tableTypes) - .filter(([key, value]) => value === 'datetime'); + .filter(([key, value]) => value === 'datetime' || value === 'timestamp'); if (datetimeFields.length) { for (const datetimeField of datetimeFields) { if (updatedRow[datetimeField[0]]) { diff --git a/frontend/src/app/components/ui-components/row-fields/base-row-field/base-row-field.component.css b/frontend/src/app/components/ui-components/record-edit-fields/base-row-field/base-row-field.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/base-row-field/base-row-field.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/base-row-field/base-row-field.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/base-row-field/base-row-field.component.html b/frontend/src/app/components/ui-components/record-edit-fields/base-row-field/base-row-field.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/base-row-field/base-row-field.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/base-row-field/base-row-field.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/base-row-field/base-row-field.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/base-row-field/base-row-field.component.spec.ts similarity index 50% rename from frontend/src/app/components/ui-components/row-fields/base-row-field/base-row-field.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/base-row-field/base-row-field.component.spec.ts index 95d449c9f..47585d69e 100644 --- a/frontend/src/app/components/ui-components/row-fields/base-row-field/base-row-field.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/base-row-field/base-row-field.component.spec.ts @@ -1,17 +1,18 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { BaseRowFieldComponent } from './base-row-field.component'; +import { BaseEditFieldComponent } from './base-row-field.component'; -describe('BaseRowFieldComponent', () => { - let component: BaseRowFieldComponent; - let fixture: ComponentFixture; +describe('BaseEditFieldComponent', () => { + let component: BaseEditFieldComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [BaseRowFieldComponent] + imports: [BaseEditFieldComponent] }).compileComponents(); - fixture = TestBed.createComponent(BaseRowFieldComponent); + + fixture = TestBed.createComponent(BaseEditFieldComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/base-row-field/base-row-field.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/base-row-field/base-row-field.component.ts similarity index 90% rename from frontend/src/app/components/ui-components/row-fields/base-row-field/base-row-field.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/base-row-field/base-row-field.component.ts index 4ec3cfc32..24f1e7f80 100644 --- a/frontend/src/app/components/ui-components/row-fields/base-row-field/base-row-field.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/base-row-field/base-row-field.component.ts @@ -5,12 +5,12 @@ import { CommonModule } from '@angular/common'; import { normalizeFieldName } from '../../../../lib/normalize'; @Component({ - selector: 'app-base-row-field', + selector: 'app-base-edit-field', templateUrl: './base-row-field.component.html', styleUrl: './base-row-field.component.css', imports: [CommonModule] }) -export class BaseRowFieldComponent implements OnInit { +export class BaseEditFieldComponent implements OnInit { @Input() key: string; @Input() label: string; @Input() required: boolean; diff --git a/frontend/src/app/components/ui-components/row-fields/binary-data-caption/binary-data-caption.component.css b/frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/binary-data-caption/binary-data-caption.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/binary-data-caption/binary-data-caption.component.html b/frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/binary-data-caption/binary-data-caption.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.html diff --git a/frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.spec.ts new file mode 100644 index 000000000..6144b27d8 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BinaryDataCaptionEditComponent } from './binary-data-caption.component'; + +describe('BinaryDataCaptionEditComponent', () => { + let component: BinaryDataCaptionEditComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [BinaryDataCaptionEditComponent] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(BinaryDataCaptionEditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/components/ui-components/row-fields/binary-data-caption/binary-data-caption.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.ts similarity index 54% rename from frontend/src/app/components/ui-components/row-fields/binary-data-caption/binary-data-caption.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.ts index 3f08d6620..30770f1e3 100644 --- a/frontend/src/app/components/ui-components/row-fields/binary-data-caption/binary-data-caption.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.ts @@ -1,11 +1,11 @@ -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { CommonModule } from '@angular/common'; import { Component } from '@angular/core'; @Component({ - selector: 'app-row-static-text', + selector: 'app-edit-static-text', templateUrl: './binary-data-caption.component.html', styleUrls: ['./binary-data-caption.component.css'], imports: [CommonModule] }) -export class BinaryDataCaptionRowComponent extends BaseRowFieldComponent { } +export class BinaryDataCaptionEditComponent extends BaseEditFieldComponent { } diff --git a/frontend/src/app/components/ui-components/row-fields/boolean/boolean.component.css b/frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/boolean/boolean.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/boolean/boolean.component.html b/frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/boolean/boolean.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/boolean/boolean.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.spec.ts similarity index 89% rename from frontend/src/app/components/ui-components/row-fields/boolean/boolean.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.spec.ts index 935d0b179..8926e786a 100644 --- a/frontend/src/app/components/ui-components/row-fields/boolean/boolean.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.spec.ts @@ -1,14 +1,14 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { BooleanRowComponent } from './boolean.component'; +import { BooleanEditComponent } from './boolean.component'; import { MatDialogModule } from '@angular/material/dialog'; import { MatSnackBarModule } from '@angular/material/snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { provideHttpClient } from '@angular/common/http'; -describe('BooleanRowComponent', () => { - let component: BooleanRowComponent; - let fixture: ComponentFixture; +describe('BooleanEditComponent', () => { + let component: BooleanEditComponent; + let fixture: ComponentFixture; const fakeStructure = { "column_name": "banned", @@ -26,7 +26,7 @@ describe('BooleanRowComponent', () => { imports: [ MatSnackBarModule, MatDialogModule, - BooleanRowComponent, + BooleanEditComponent, BrowserAnimationsModule ], providers: [provideHttpClient()] @@ -34,7 +34,7 @@ describe('BooleanRowComponent', () => { }); beforeEach(() => { - fixture = TestBed.createComponent(BooleanRowComponent); + fixture = TestBed.createComponent(BooleanEditComponent); component = fixture.componentInstance; }); diff --git a/frontend/src/app/components/ui-components/row-fields/boolean/boolean.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.ts similarity index 88% rename from frontend/src/app/components/ui-components/row-fields/boolean/boolean.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.ts index a21ced554..bdd457ef6 100644 --- a/frontend/src/app/components/ui-components/row-fields/boolean/boolean.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.ts @@ -1,19 +1,19 @@ import { Component, Input, OnInit } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { MatButtonToggleModule } from '@angular/material/button-toggle'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; +import { CommonModule } from '@angular/common'; import { ConnectionsService } from 'src/app/services/connections.service'; import { DBtype } from 'src/app/models/connection'; +import { FormsModule } from '@angular/forms'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; @Component({ - selector: 'app-row-boolean', + selector: 'app-edit-boolean', templateUrl: './boolean.component.html', styleUrls: ['./boolean.component.css'], imports: [CommonModule, FormsModule, MatButtonToggleModule] }) -export class BooleanRowComponent extends BaseRowFieldComponent { +export class BooleanEditComponent extends BaseEditFieldComponent { @Input() value: boolean | number | string | null; public isRadiogroup: boolean; diff --git a/frontend/src/app/components/ui-components/row-fields/code/code.component.css b/frontend/src/app/components/ui-components/record-edit-fields/code/code.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/code/code.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/code/code.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/code/code.component.html b/frontend/src/app/components/ui-components/record-edit-fields/code/code.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/code/code.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/code/code.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/code/code.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/code/code.component.spec.ts similarity index 73% rename from frontend/src/app/components/ui-components/row-fields/code/code.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/code/code.component.spec.ts index ce6e63212..d3b237de1 100644 --- a/frontend/src/app/components/ui-components/row-fields/code/code.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/code/code.component.spec.ts @@ -1,21 +1,21 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { CodeRowComponent } from './code.component'; +import { CodeEditComponent } from './code.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { UiSettingsService } from 'src/app/services/ui-settings.service'; import { provideHttpClient } from '@angular/common/http'; describe('CodeComponent', () => { - let component: CodeRowComponent; - let fixture: ComponentFixture; + let component: CodeEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [CodeRowComponent, BrowserAnimationsModule], + imports: [CodeEditComponent, BrowserAnimationsModule], providers: [provideHttpClient()] }).compileComponents(); - fixture = TestBed.createComponent(CodeRowComponent); + fixture = TestBed.createComponent(CodeEditComponent); component = fixture.componentInstance; component.widgetStructure = { diff --git a/frontend/src/app/components/ui-components/row-fields/code/code.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/code/code.component.ts similarity index 84% rename from frontend/src/app/components/ui-components/row-fields/code/code.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/code/code.component.ts index 58faf0ce0..0f4c1849e 100644 --- a/frontend/src/app/components/ui-components/row-fields/code/code.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/code/code.component.ts @@ -1,17 +1,17 @@ import { Component, Input } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { CodeEditorModule } from '@ngstack/code-editor'; import { CommonModule } from '@angular/common'; import { UiSettingsService } from 'src/app/services/ui-settings.service'; @Component({ - selector: 'app-code', + selector: 'app-edit-code', templateUrl: './code.component.html', styleUrl: './code.component.css', imports: [CommonModule, CodeEditorModule], }) -export class CodeRowComponent extends BaseRowFieldComponent { +export class CodeEditComponent extends BaseEditFieldComponent { @Input() value; public mutableCodeModel: Object; diff --git a/frontend/src/app/components/ui-components/row-fields/country/country.component.css b/frontend/src/app/components/ui-components/record-edit-fields/country/country.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/country/country.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/country/country.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/country/country.component.html b/frontend/src/app/components/ui-components/record-edit-fields/country/country.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/country/country.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/country/country.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/country/country.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/country/country.component.ts similarity index 93% rename from frontend/src/app/components/ui-components/row-fields/country/country.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/country/country.component.ts index f9cc611f2..1538e8f15 100644 --- a/frontend/src/app/components/ui-components/row-fields/country/country.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/country/country.component.ts @@ -1,25 +1,25 @@ +import { COUNTRIES, getCountryFlag } from '../../../../consts/countries'; import { CUSTOM_ELEMENTS_SCHEMA, Component, Input } from '@angular/core'; +import { map, startWith } from 'rxjs/operators'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { CommonModule } from '@angular/common'; +import { FormControl } from '@angular/forms'; import { FormsModule } from '@angular/forms'; -import { MatFormFieldModule } from '@angular/material/form-field'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; -import { COUNTRIES, getCountryFlag } from '../../../../consts/countries'; -import { map, startWith } from 'rxjs/operators'; import { Observable } from 'rxjs'; -import { FormControl } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms'; @Component({ - selector: 'app-row-country', + selector: 'app-edit-country', imports: [CommonModule, FormsModule, ReactiveFormsModule, MatFormFieldModule, MatAutocompleteModule, MatInputModule], templateUrl: './country.component.html', styleUrls: ['./country.component.css'], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) -export class CountryRowComponent extends BaseRowFieldComponent { +export class CountryEditComponent extends BaseEditFieldComponent { @Input() value: string; public countries: {value: string | null, label: string, flag: string}[] = []; diff --git a/frontend/src/app/components/ui-components/row-fields/date-time/date-time.component.css b/frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/date-time/date-time.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/date-time/date-time.component.html b/frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/date-time/date-time.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/date-time/date-time.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.spec.ts similarity index 89% rename from frontend/src/app/components/ui-components/row-fields/date-time/date-time.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.spec.ts index 17b432471..395b97b95 100644 --- a/frontend/src/app/components/ui-components/row-fields/date-time/date-time.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.spec.ts @@ -1,22 +1,22 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { DBtype } from 'src/app/models/connection'; -import { DateTimeRowComponent } from './date-time.component'; +import { DateTimeEditComponent } from './date-time.component'; import { MatDialogModule } from '@angular/material/dialog'; import { MatSnackBarModule } from '@angular/material/snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { provideHttpClient } from '@angular/common/http'; -describe('DateTimeRowComponent', () => { - let component: DateTimeRowComponent; - let fixture: ComponentFixture; +describe('DateTimeEditComponent', () => { + let component: DateTimeEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ MatSnackBarModule, MatDialogModule, - DateTimeRowComponent, + DateTimeEditComponent, BrowserAnimationsModule ], providers: [provideHttpClient()] @@ -24,7 +24,7 @@ describe('DateTimeRowComponent', () => { }); beforeEach(() => { - fixture = TestBed.createComponent(DateTimeRowComponent); + fixture = TestBed.createComponent(DateTimeEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/date-time/date-time.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.ts similarity index 89% rename from frontend/src/app/components/ui-components/row-fields/date-time/date-time.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.ts index 49240956f..89ef49a2b 100644 --- a/frontend/src/app/components/ui-components/row-fields/date-time/date-time.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.ts @@ -1,16 +1,16 @@ import { Component, Input } from '@angular/core'; + +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { CommonModule } from '@angular/common'; +import { ConnectionsService } from 'src/app/services/connections.service'; +import { DBtype } from 'src/app/models/connection'; import { FormsModule } from '@angular/forms'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; - -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; -import { ConnectionsService } from 'src/app/services/connections.service'; -import { DBtype } from 'src/app/models/connection'; import { format } from 'date-fns' @Component({ - selector: 'app-row-date-time', + selector: 'app-edit-date-time', templateUrl: './date-time.component.html', styleUrls: ['./date-time.component.css'], imports: [ @@ -20,7 +20,7 @@ import { format } from 'date-fns' MatInputModule ] }) -export class DateTimeRowComponent extends BaseRowFieldComponent { +export class DateTimeEditComponent extends BaseEditFieldComponent { @Input() value: string; static type = 'datetime'; diff --git a/frontend/src/app/components/ui-components/row-fields/date/date.component.css b/frontend/src/app/components/ui-components/record-edit-fields/date/date.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/date/date.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/date/date.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/date/date.component.html b/frontend/src/app/components/ui-components/record-edit-fields/date/date.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/date/date.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/date/date.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/date/date.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/date/date.component.spec.ts similarity index 77% rename from frontend/src/app/components/ui-components/row-fields/date/date.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/date/date.component.spec.ts index 99b67c4bf..6822b298e 100644 --- a/frontend/src/app/components/ui-components/row-fields/date/date.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/date/date.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { DateRowComponent } from './date.component'; +import { DateEditComponent } from './date.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -describe('DateRowComponent', () => { - let component: DateRowComponent; - let fixture: ComponentFixture; +describe('DateEditComponent', () => { + let component: DateEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [DateRowComponent, BrowserAnimationsModule] + imports: [DateEditComponent, BrowserAnimationsModule] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(DateRowComponent); + fixture = TestBed.createComponent(DateEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/date/date.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/date/date.component.ts similarity index 81% rename from frontend/src/app/components/ui-components/row-fields/date/date.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/date/date.component.ts index 68ba59c1a..9063dfda8 100644 --- a/frontend/src/app/components/ui-components/row-fields/date/date.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/date/date.component.ts @@ -1,19 +1,19 @@ import { Component, Input } from '@angular/core'; + +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; -import { FormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; - -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; import { format } from 'date-fns' @Component({ - selector: 'app-row-date', + selector: 'app-edit-date', templateUrl: './date.component.html', styleUrls: ['./date.component.css'], imports: [CommonModule, MatFormFieldModule, MatInputModule, FormsModule] }) -export class DateRowComponent extends BaseRowFieldComponent { +export class DateEditComponent extends BaseEditFieldComponent { @Input() value: string; static type = 'datetime'; diff --git a/frontend/src/app/components/ui-components/row-fields/file/file.component.css b/frontend/src/app/components/ui-components/record-edit-fields/file/file.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/file/file.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/file/file.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/file/file.component.html b/frontend/src/app/components/ui-components/record-edit-fields/file/file.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/file/file.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/file/file.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/file/file.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/file/file.component.spec.ts similarity index 70% rename from frontend/src/app/components/ui-components/row-fields/file/file.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/file/file.component.spec.ts index 9b59a0554..24ce58af9 100644 --- a/frontend/src/app/components/ui-components/row-fields/file/file.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/file/file.component.spec.ts @@ -1,27 +1,27 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { FileRowComponent } from './file.component'; +import { FileEditComponent } from './file.component'; import { FormsModule } from '@angular/forms'; import { MatRadioModule } from '@angular/material/radio'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -describe('FileRowComponent', () => { - let component: FileRowComponent; - let fixture: ComponentFixture; +describe('FileEditComponent', () => { + let component: FileEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ FormsModule, MatRadioModule, - FileRowComponent, + FileEditComponent, BrowserAnimationsModule ] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(FileRowComponent); + fixture = TestBed.createComponent(FileEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/file/file.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/file/file.component.ts similarity index 95% rename from frontend/src/app/components/ui-components/row-fields/file/file.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/file/file.component.ts index 9c82fb10f..462530245 100644 --- a/frontend/src/app/components/ui-components/row-fields/file/file.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/file/file.component.ts @@ -2,7 +2,7 @@ import { Component, Input } from '@angular/core'; import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; import { Base64ValidationDirective } from 'src/app/directives/base64Validator.directive'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { FormsModule } from '@angular/forms'; import { HexValidationDirective } from 'src/app/directives/hexValidator.directive'; import { MatButtonModule } from '@angular/material/button'; @@ -25,7 +25,7 @@ enum FileType { } @Component({ - selector: 'app-row-file', + selector: 'app-edit-file', templateUrl: './file.component.html', styleUrls: ['./file.component.css'], imports: [ @@ -39,7 +39,7 @@ enum FileType { Base64ValidationDirective ] }) -export class FileRowComponent extends BaseRowFieldComponent { +export class FileEditComponent extends BaseEditFieldComponent { @Input() value: Blob; static type = 'file'; diff --git a/frontend/src/app/components/ui-components/row-fields/foreign-key/foreign-key.component.css b/frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/foreign-key/foreign-key.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/foreign-key/foreign-key.component.html b/frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/foreign-key/foreign-key.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/foreign-key/foreign-key.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.spec.ts similarity index 97% rename from frontend/src/app/components/ui-components/row-fields/foreign-key/foreign-key.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.spec.ts index bff8282a5..498f475a5 100644 --- a/frontend/src/app/components/ui-components/row-fields/foreign-key/foreign-key.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { ForeignKeyRowComponent } from './foreign-key.component'; +import { ForeignKeyEditComponent } from './foreign-key.component'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatDialogModule } from '@angular/material/dialog'; import { MatSnackBarModule } from '@angular/material/snack-bar'; @@ -11,9 +11,9 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { provideHttpClient } from '@angular/common/http'; import { provideRouter } from '@angular/router'; -describe('ForeignKeyRowComponent', () => { - let component: ForeignKeyRowComponent; - let fixture: ComponentFixture; +describe('ForeignKeyEditComponent', () => { + let component: ForeignKeyEditComponent; + let fixture: ComponentFixture; let tablesService: TablesService; const structureNetwork = [ @@ -127,7 +127,7 @@ describe('ForeignKeyRowComponent', () => { MatAutocompleteModule, MatDialogModule, Angulartics2Module.forRoot(), - ForeignKeyRowComponent, + ForeignKeyEditComponent, BrowserAnimationsModule ], providers: [provideHttpClient(), provideRouter([])] @@ -135,7 +135,7 @@ describe('ForeignKeyRowComponent', () => { }); beforeEach(() => { - fixture = TestBed.createComponent(ForeignKeyRowComponent); + fixture = TestBed.createComponent(ForeignKeyEditComponent); component = fixture.componentInstance; component.relations = fakeRelations; tablesService = TestBed.inject(TablesService); diff --git a/frontend/src/app/components/ui-components/row-fields/foreign-key/foreign-key.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.ts similarity index 97% rename from frontend/src/app/components/ui-components/row-fields/foreign-key/foreign-key.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.ts index 80dc6d042..aeb9fd0fa 100644 --- a/frontend/src/app/components/ui-components/row-fields/foreign-key/foreign-key.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.ts @@ -1,7 +1,7 @@ import { Component, Input } from '@angular/core'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { CommonModule } from '@angular/common'; import { ConnectionsService } from 'src/app/services/connections.service'; import { FormsModule } from '@angular/forms'; @@ -24,7 +24,7 @@ interface Suggestion { } @Component({ - selector: 'app-row-foreign-key', + selector: 'app-edit-foreign-key', templateUrl: './foreign-key.component.html', styleUrls: ['./foreign-key.component.css'], imports: [ @@ -39,7 +39,7 @@ interface Suggestion { RouterModule ] }) -export class ForeignKeyRowComponent extends BaseRowFieldComponent { +export class ForeignKeyEditComponent extends BaseEditFieldComponent { @Input() value; public connectionID: string; diff --git a/frontend/src/app/components/ui-components/row-fields/id/id.component.css b/frontend/src/app/components/ui-components/record-edit-fields/id/id.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/id/id.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/id/id.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/id/id.component.html b/frontend/src/app/components/ui-components/record-edit-fields/id/id.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/id/id.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/id/id.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/id/id.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/id/id.component.spec.ts similarity index 61% rename from frontend/src/app/components/ui-components/row-fields/id/id.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/id/id.component.spec.ts index ba3083ebb..ee562aa5d 100644 --- a/frontend/src/app/components/ui-components/row-fields/id/id.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/id/id.component.spec.ts @@ -1,21 +1,21 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; -import { IdRowComponent } from './id.component'; +import { IdEditComponent } from './id.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -describe('IdRowComponent', () => { - let component: IdRowComponent; - let fixture: ComponentFixture; +describe('IdEditComponent', () => { + let component: IdEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [FormsModule, IdRowComponent, BrowserAnimationsModule] + imports: [FormsModule, IdEditComponent, BrowserAnimationsModule] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(IdRowComponent); + fixture = TestBed.createComponent(IdEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/id/id.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/id/id.component.ts similarity index 69% rename from frontend/src/app/components/ui-components/row-fields/id/id.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/id/id.component.ts index 6e2289e22..586012801 100644 --- a/frontend/src/app/components/ui-components/row-fields/id/id.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/id/id.component.ts @@ -1,16 +1,16 @@ import { Component, Input } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +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'; @Component({ - selector: 'app-row-id', + selector: 'app-edit-id', templateUrl: './id.component.html', styleUrls: ['./id.component.css'], imports: [FormsModule, MatFormFieldModule, MatInputModule] }) -export class IdRowComponent extends BaseRowFieldComponent { +export class IdEditComponent extends BaseEditFieldComponent { @Input() value: string; } diff --git a/frontend/src/app/components/ui-components/row-fields/image/image.component.css b/frontend/src/app/components/ui-components/record-edit-fields/image/image.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/image/image.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/image/image.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/image/image.component.html b/frontend/src/app/components/ui-components/record-edit-fields/image/image.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/image/image.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/image/image.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/image/image.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/image/image.component.spec.ts similarity index 70% rename from frontend/src/app/components/ui-components/row-fields/image/image.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/image/image.component.spec.ts index 98f10c54e..ce1331767 100644 --- a/frontend/src/app/components/ui-components/row-fields/image/image.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/image/image.component.spec.ts @@ -1,22 +1,22 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { ImageRowComponent } from './image.component'; +import { ImageEditComponent } from './image.component'; import { FormsModule } from '@angular/forms'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; describe('ImageComponent', () => { - let component: ImageRowComponent; - let fixture: ComponentFixture; + let component: ImageEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ FormsModule, - ImageRowComponent, + ImageEditComponent, BrowserAnimationsModule ]}).compileComponents(); - fixture = TestBed.createComponent(ImageRowComponent); + fixture = TestBed.createComponent(ImageEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/image/image.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/image/image.component.ts similarity index 76% rename from frontend/src/app/components/ui-components/row-fields/image/image.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/image/image.component.ts index 8be63f163..41fdafc4f 100644 --- a/frontend/src/app/components/ui-components/row-fields/image/image.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/image/image.component.ts @@ -1,6 +1,6 @@ import { Component, Input } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatFormFieldModule } from '@angular/material/form-field'; @@ -8,7 +8,7 @@ import { MatInputModule } from '@angular/material/input'; import { UrlValidatorDirective } from 'src/app/directives/url-validator.directive'; @Component({ - selector: 'app-image', + selector: 'app-edit-image', templateUrl: './image.component.html', styleUrl: './image.component.css', imports: [ @@ -19,6 +19,6 @@ import { UrlValidatorDirective } from 'src/app/directives/url-validator.directiv UrlValidatorDirective ] }) -export class ImageRowComponent extends BaseRowFieldComponent { +export class ImageEditComponent extends BaseEditFieldComponent { @Input() value: string; } diff --git a/frontend/src/app/components/ui-components/row-fields/json-editor/json-editor.component.css b/frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/json-editor/json-editor.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/json-editor/json-editor.component.html b/frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/json-editor/json-editor.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/json-editor/json-editor.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.spec.ts similarity index 55% rename from frontend/src/app/components/ui-components/row-fields/json-editor/json-editor.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.spec.ts index 3911ebd1d..dea378882 100644 --- a/frontend/src/app/components/ui-components/row-fields/json-editor/json-editor.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { JsonEditorRowComponent } from './json-editor.component'; +import { JsonEditorEditComponent } from './json-editor.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -describe('JsonEditorRowComponent', () => { - let component: JsonEditorRowComponent; - let fixture: ComponentFixture; +describe('JsonEditorEditComponent', () => { + let component: JsonEditorEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [JsonEditorRowComponent, BrowserAnimationsModule] + imports: [JsonEditorEditComponent, BrowserAnimationsModule] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(JsonEditorRowComponent); + fixture = TestBed.createComponent(JsonEditorEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/json-editor/json-editor.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.ts similarity index 79% rename from frontend/src/app/components/ui-components/row-fields/json-editor/json-editor.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.ts index b2056ac11..5cfb4855e 100644 --- a/frontend/src/app/components/ui-components/row-fields/json-editor/json-editor.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.ts @@ -1,16 +1,16 @@ import { Component, Input } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { CodeEditorModule } from '@ngstack/code-editor'; import { CommonModule } from '@angular/common'; @Component({ - selector: 'app-row-json-editor', + selector: 'app-edit-json-editor', templateUrl: './json-editor.component.html', styleUrls: ['./json-editor.component.css'], imports: [CommonModule, CodeEditorModule], }) -export class JsonEditorRowComponent extends BaseRowFieldComponent { +export class JsonEditorEditComponent extends BaseEditFieldComponent { @Input() value: Object; public mutableCodeModel: Object; diff --git a/frontend/src/app/components/ui-components/row-fields/long-text/long-text.component.css b/frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/long-text/long-text.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/long-text/long-text.component.html b/frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/long-text/long-text.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/long-text/long-text.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.spec.ts similarity index 56% rename from frontend/src/app/components/ui-components/row-fields/long-text/long-text.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.spec.ts index 50780c6fa..2247db972 100644 --- a/frontend/src/app/components/ui-components/row-fields/long-text/long-text.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { LongTextRowComponent } from './long-text.component'; +import { LongTextEditComponent } from './long-text.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -describe('LongTextRowComponent', () => { - let component: LongTextRowComponent; - let fixture: ComponentFixture; +describe('LongTextEditComponent', () => { + let component: LongTextEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [LongTextRowComponent, BrowserAnimationsModule] + imports: [LongTextEditComponent, BrowserAnimationsModule] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(LongTextRowComponent); + fixture = TestBed.createComponent(LongTextEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/long-text/long-text.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.ts similarity index 78% rename from frontend/src/app/components/ui-components/row-fields/long-text/long-text.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.ts index 4d50497c3..c7ebb0558 100644 --- a/frontend/src/app/components/ui-components/row-fields/long-text/long-text.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.ts @@ -1,17 +1,17 @@ import { Component, 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'; -import { FormsModule } from '@angular/forms'; - -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; @Component({ - selector: 'app-row-long-text', + selector: 'app-edit-long-text', templateUrl: './long-text.component.html', styleUrls: ['./long-text.component.css'], imports: [MatFormFieldModule, MatInputModule, FormsModule] }) -export class LongTextRowComponent extends BaseRowFieldComponent { +export class LongTextEditComponent extends BaseEditFieldComponent { @Input() value: string; static type = 'text'; diff --git a/frontend/src/app/components/ui-components/row-fields/money/money.component.css b/frontend/src/app/components/ui-components/record-edit-fields/money/money.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/money/money.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/money/money.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/money/money.component.html b/frontend/src/app/components/ui-components/record-edit-fields/money/money.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/money/money.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/money/money.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/money/money.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/money/money.component.spec.ts similarity index 95% rename from frontend/src/app/components/ui-components/row-fields/money/money.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/money/money.component.spec.ts index 90949aa65..63a8a89e4 100644 --- a/frontend/src/app/components/ui-components/row-fields/money/money.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/money/money.component.spec.ts @@ -6,16 +6,16 @@ import { MatSelectModule } from '@angular/material/select'; import { CommonModule } from '@angular/common'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { MoneyRowComponent } from './money.component'; +import { MoneyEditComponent } from './money.component'; -describe('MoneyRowComponent', () => { - let component: MoneyRowComponent; - let fixture: ComponentFixture; +describe('MoneyEditComponent', () => { + let component: MoneyEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ - MoneyRowComponent, + MoneyEditComponent, CommonModule, FormsModule, MatFormFieldModule, @@ -25,7 +25,7 @@ describe('MoneyRowComponent', () => { ] }).compileComponents(); - fixture = TestBed.createComponent(MoneyRowComponent); + fixture = TestBed.createComponent(MoneyEditComponent); component = fixture.componentInstance; // Set required properties from base component diff --git a/frontend/src/app/components/ui-components/row-fields/money/money.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/money/money.component.ts similarity index 67% rename from frontend/src/app/components/ui-components/row-fields/money/money.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/money/money.component.ts index 04931eca6..65d52d5da 100644 --- a/frontend/src/app/components/ui-components/row-fields/money/money.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/money/money.component.ts @@ -1,30 +1,20 @@ +import { CURRENCIES, Money, MoneyValue } from 'src/app/consts/currencies'; import { Component, Input, OnInit } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; + +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; +import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; -import { CommonModule } from '@angular/common'; - -interface Money { - code: string; - name: string; - symbol: string; - flag?: string; -} - -interface MoneyValue { - amount: number | string; - currency: string; -} @Component({ - selector: 'app-row-money', + selector: 'app-edit-money', templateUrl: './money.component.html', styleUrls: ['./money.component.css'], imports: [CommonModule, MatFormFieldModule, MatInputModule, MatSelectModule, FormsModule] }) -export class MoneyRowComponent extends BaseRowFieldComponent implements OnInit { +export class MoneyEditComponent extends BaseEditFieldComponent implements OnInit { @Input() value: string | number | MoneyValue = ''; static type = 'money'; @@ -38,41 +28,7 @@ export class MoneyRowComponent extends BaseRowFieldComponent implements OnInit { amount: number | string = ''; displayAmount: string = ''; - currencies: Money[] = [ - { code: 'USD', name: 'US Dollar', symbol: '$', flag: '๐Ÿ‡บ๐Ÿ‡ธ' }, - { code: 'EUR', name: 'Euro', symbol: 'โ‚ฌ', flag: '๐Ÿ‡ช๐Ÿ‡บ' }, - { code: 'GBP', name: 'British Pound', symbol: 'ยฃ', flag: '๐Ÿ‡ฌ๐Ÿ‡ง' }, - { code: 'JPY', name: 'Japanese Yen', symbol: 'ยฅ', flag: '๐Ÿ‡ฏ๐Ÿ‡ต' }, - { code: 'CHF', name: 'Swiss Franc', symbol: 'CHF', flag: '๐Ÿ‡จ๐Ÿ‡ญ' }, - { code: 'CAD', name: 'Canadian Dollar', symbol: 'C$', flag: '๐Ÿ‡จ๐Ÿ‡ฆ' }, - { code: 'AUD', name: 'Australian Dollar', symbol: 'A$', flag: '๐Ÿ‡ฆ๐Ÿ‡บ' }, - { code: 'CNY', name: 'Chinese Yuan', symbol: 'ยฅ', flag: '๐Ÿ‡จ๐Ÿ‡ณ' }, - { code: 'INR', name: 'Indian Rupee', symbol: 'โ‚น', flag: '๐Ÿ‡ฎ๐Ÿ‡ณ' }, - { code: 'KRW', name: 'South Korean Won', symbol: 'โ‚ฉ', flag: '๐Ÿ‡ฐ๐Ÿ‡ท' }, - { code: 'SGD', name: 'Singapore Dollar', symbol: 'S$', flag: '๐Ÿ‡ธ๐Ÿ‡ฌ' }, - { code: 'HKD', name: 'Hong Kong Dollar', symbol: 'HK$', flag: '๐Ÿ‡ญ๐Ÿ‡ฐ' }, - { code: 'NOK', name: 'Norwegian Krone', symbol: 'kr', flag: '๐Ÿ‡ณ๐Ÿ‡ด' }, - { code: 'SEK', name: 'Swedish Krona', symbol: 'kr', flag: '๐Ÿ‡ธ๐Ÿ‡ช' }, - { code: 'DKK', name: 'Danish Krone', symbol: 'kr', flag: '๐Ÿ‡ฉ๐Ÿ‡ฐ' }, - { code: 'PLN', name: 'Polish Zloty', symbol: 'zล‚', flag: '๐Ÿ‡ต๐Ÿ‡ฑ' }, - { code: 'CZK', name: 'Czech Koruna', symbol: 'Kฤ', flag: '๐Ÿ‡จ๐Ÿ‡ฟ' }, - { code: 'HUF', name: 'Hungarian Forint', symbol: 'Ft', flag: '๐Ÿ‡ญ๐Ÿ‡บ' }, - { code: 'RUB', name: 'Russian Ruble', symbol: 'โ‚ฝ', flag: '๐Ÿ‡ท๐Ÿ‡บ' }, - { code: 'BRL', name: 'Brazilian Real', symbol: 'R$', flag: '๐Ÿ‡ง๐Ÿ‡ท' }, - { code: 'MXN', name: 'Mexican Peso', symbol: '$', flag: '๐Ÿ‡ฒ๐Ÿ‡ฝ' }, - { code: 'ZAR', name: 'South African Rand', symbol: 'R', flag: '๐Ÿ‡ฟ๐Ÿ‡ฆ' }, - { code: 'TRY', name: 'Turkish Lira', symbol: 'โ‚บ', flag: '๐Ÿ‡น๐Ÿ‡ท' }, - { code: 'AED', name: 'UAE Dirham', symbol: 'ุฏ.ุฅ', flag: '๐Ÿ‡ฆ๐Ÿ‡ช' }, - { code: 'SAR', name: 'Saudi Riyal', symbol: '๏ทผ', flag: '๐Ÿ‡ธ๐Ÿ‡ฆ' }, - { code: 'ILS', name: 'Israeli Shekel', symbol: 'โ‚ช', flag: '๐Ÿ‡ฎ๐Ÿ‡ฑ' }, - { code: 'EGP', name: 'Egyptian Pound', symbol: 'ยฃ', flag: '๐Ÿ‡ช๐Ÿ‡ฌ' }, - { code: 'THB', name: 'Thai Baht', symbol: 'เธฟ', flag: '๐Ÿ‡น๐Ÿ‡ญ' }, - { code: 'MYR', name: 'Malaysian Ringgit', symbol: 'RM', flag: '๐Ÿ‡ฒ๐Ÿ‡พ' }, - { code: 'IDR', name: 'Indonesian Rupiah', symbol: 'Rp', flag: '๐Ÿ‡ฎ๐Ÿ‡ฉ' }, - { code: 'PHP', name: 'Philippine Peso', symbol: 'โ‚ฑ', flag: '๐Ÿ‡ต๐Ÿ‡ญ' }, - { code: 'VND', name: 'Vietnamese Dong', symbol: 'โ‚ซ', flag: '๐Ÿ‡ป๐Ÿ‡ณ' }, - { code: 'UAH', name: 'Ukrainian Hryvnia', symbol: 'โ‚ด', flag: '๐Ÿ‡บ๐Ÿ‡ฆ' } - ]; + currencies: Money[] = CURRENCIES; ngOnInit(): void { super.ngOnInit(); @@ -83,19 +39,19 @@ export class MoneyRowComponent extends BaseRowFieldComponent implements OnInit { configureFromWidgetParams(): void { if (this.widgetStructure && this.widgetStructure.widget_params) { const params = this.widgetStructure.widget_params; - + if (typeof params.default_currency === 'string') { this.defaultCurrency = params.default_currency; } - + if (typeof params.show_currency_selector === 'boolean') { this.showCurrencySelector = params.show_currency_selector; } - + if (typeof params.decimal_places === 'number') { this.decimalPlaces = Math.max(0, Math.min(10, params.decimal_places)); } - + if (typeof params.allow_negative === 'boolean') { this.allowNegative = params.allow_negative; } @@ -127,7 +83,7 @@ export class MoneyRowComponent extends BaseRowFieldComponent implements OnInit { // Try to parse formats like "100.50 USD", "USD 100.50", "$100.50", "โ‚ฌ100,50" const currencyMatch = stringValue.match(/([A-Z]{3})/); const numberMatch = stringValue.match(/([\d,.-]+)/); - + if (currencyMatch) { this.selectedCurrency = currencyMatch[1]; } else { @@ -139,7 +95,7 @@ export class MoneyRowComponent extends BaseRowFieldComponent implements OnInit { this.selectedCurrency = this.defaultCurrency; } } - + if (numberMatch) { const cleanNumber = numberMatch[1].replace(/,/g, ''); this.amount = parseFloat(cleanNumber) || ''; @@ -157,15 +113,15 @@ export class MoneyRowComponent extends BaseRowFieldComponent implements OnInit { onAmountChange(): void { // Clean and validate the input let cleanValue = this.displayAmount.replace(/[^\d.-]/g, ''); - + // Handle negative values if (!this.allowNegative) { cleanValue = cleanValue.replace(/-/g, ''); } - + // Parse the number const numericValue = parseFloat(cleanValue); - + if (!isNaN(numericValue)) { this.amount = numericValue; // Don't reformat while user is typing to preserve focus @@ -179,7 +135,7 @@ export class MoneyRowComponent extends BaseRowFieldComponent implements OnInit { // Invalid input, revert to previous value this.displayAmount = this.formatAmount(this.amount); } - + this.updateValue(); } @@ -194,13 +150,13 @@ export class MoneyRowComponent extends BaseRowFieldComponent implements OnInit { if (amount === '' || amount === null || amount === undefined) { return ''; } - + const numericAmount = typeof amount === 'string' ? parseFloat(amount) : amount; - + if (isNaN(numericAmount)) { return ''; } - + return numericAmount.toFixed(this.decimalPlaces); } @@ -219,7 +175,7 @@ export class MoneyRowComponent extends BaseRowFieldComponent implements OnInit { this.value = typeof this.amount === 'string' ? parseFloat(this.amount) || 0 : this.amount; } } - + this.onFieldChange.emit(this.value); } @@ -236,10 +192,10 @@ export class MoneyRowComponent extends BaseRowFieldComponent implements OnInit { if (!this.amount && this.amount !== 0) { return ''; } - + const currency = this.selectedCurrencyData; const formattedAmount = this.formatAmount(this.amount); - + return `${currency.symbol}${formattedAmount}`; } diff --git a/frontend/src/app/components/ui-components/row-fields/number/number.component.css b/frontend/src/app/components/ui-components/record-edit-fields/number/number.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/number/number.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/number/number.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/number/number.component.html b/frontend/src/app/components/ui-components/record-edit-fields/number/number.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/number/number.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/number/number.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/number/number.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/number/number.component.spec.ts similarity index 63% rename from frontend/src/app/components/ui-components/row-fields/number/number.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/number/number.component.spec.ts index 2199cd7ba..a2cfa5c03 100644 --- a/frontend/src/app/components/ui-components/row-fields/number/number.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/number/number.component.spec.ts @@ -1,23 +1,23 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { NumberRowComponent } from './number.component'; +import { NumberEditComponent } from './number.component'; -describe('NumberRowComponent', () => { - let component: NumberRowComponent; - let fixture: ComponentFixture; +describe('NumberEditComponent', () => { + let component: NumberEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ BrowserAnimationsModule, - NumberRowComponent + NumberEditComponent ] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(NumberRowComponent); + fixture = TestBed.createComponent(NumberEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/number/number.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/number/number.component.ts similarity index 70% rename from frontend/src/app/components/ui-components/row-fields/number/number.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/number/number.component.ts index 5f5ff2c43..adafd3c39 100644 --- a/frontend/src/app/components/ui-components/row-fields/number/number.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/number/number.component.ts @@ -1,17 +1,17 @@ import { Component, 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'; -import { FormsModule } from '@angular/forms'; - -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; @Component({ - selector: 'app-row-number', + selector: 'app-edit-number', templateUrl: './number.component.html', styleUrls: ['./number.component.css'], imports: [MatFormFieldModule, MatInputModule, FormsModule] }) -export class NumberRowComponent extends BaseRowFieldComponent { +export class NumberEditComponent extends BaseEditFieldComponent { @Input() value: number; static type = 'number'; diff --git a/frontend/src/app/components/ui-components/row-fields/password/password.component.css b/frontend/src/app/components/ui-components/record-edit-fields/password/password.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/password/password.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/password/password.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/password/password.component.html b/frontend/src/app/components/ui-components/record-edit-fields/password/password.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/password/password.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/password/password.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/password/password.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/password/password.component.spec.ts similarity index 90% rename from frontend/src/app/components/ui-components/row-fields/password/password.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/password/password.component.spec.ts index 2a89f4b44..155d844e1 100644 --- a/frontend/src/app/components/ui-components/row-fields/password/password.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/password/password.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { PasswordRowComponent } from './password.component'; +import { PasswordEditComponent } from './password.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -describe('PasswordRowComponent', () => { - let component: PasswordRowComponent; - let fixture: ComponentFixture; +describe('PasswordEditComponent', () => { + let component: PasswordEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [PasswordRowComponent, BrowserAnimationsModule] + imports: [PasswordEditComponent, BrowserAnimationsModule] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(PasswordRowComponent); + fixture = TestBed.createComponent(PasswordEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/password/password.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/password/password.component.ts similarity index 85% rename from frontend/src/app/components/ui-components/row-fields/password/password.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/password/password.component.ts index 049cd44fe..91f51cd81 100644 --- a/frontend/src/app/components/ui-components/row-fields/password/password.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/password/password.component.ts @@ -1,13 +1,13 @@ import { Component, Input } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { FormsModule } from '@angular/forms'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; @Component({ - selector: 'app-row-password', + selector: 'app-edit-password', templateUrl: './password.component.html', styleUrls: ['./password.component.css'], imports: [ @@ -17,7 +17,7 @@ import { MatInputModule } from '@angular/material/input'; FormsModule ] }) -export class PasswordRowComponent extends BaseRowFieldComponent { +export class PasswordEditComponent extends BaseEditFieldComponent { @Input() value: string; public clearPassword: boolean; diff --git a/frontend/src/app/components/ui-components/row-fields/phone/phone.component.css b/frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/phone/phone.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/phone/phone.component.html b/frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/phone/phone.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/phone/phone.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.spec.ts similarity index 94% rename from frontend/src/app/components/ui-components/row-fields/phone/phone.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.spec.ts index 4c4d4d893..8089a2b2a 100644 --- a/frontend/src/app/components/ui-components/row-fields/phone/phone.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.spec.ts @@ -6,16 +6,16 @@ import { MatSelectModule } from '@angular/material/select'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { CommonModule } from '@angular/common'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { PhoneRowComponent } from './phone.component'; +import { PhoneEditComponent } from './phone.component'; -describe('PhoneRowComponent', () => { - let component: PhoneRowComponent; - let fixture: ComponentFixture; +describe('PhoneEditComponent', () => { + let component: PhoneEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ - PhoneRowComponent, + PhoneEditComponent, CommonModule, ReactiveFormsModule, FormsModule, @@ -27,13 +27,13 @@ describe('PhoneRowComponent', () => { ] }).compileComponents(); - fixture = TestBed.createComponent(PhoneRowComponent); + fixture = TestBed.createComponent(PhoneEditComponent); component = fixture.componentInstance; - + // Set basic required properties component.label = 'Phone'; component.key = 'phone'; - + fixture.detectChanges(); }); @@ -53,45 +53,45 @@ describe('PhoneRowComponent', () => { it('should format US phone number in E164 format when user enters local number', () => { const localNumber = '(202) 456-1111'; component.displayPhoneNumber = localNumber; - + component.onPhoneNumberChange(); - + expect(component.value).toBe('+12024561111'); }); it('should format US phone number in E164 format when user enters raw digits', () => { const rawDigits = '2024561111'; component.displayPhoneNumber = rawDigits; - + component.onPhoneNumberChange(); - + expect(component.value).toBe('+12024561111'); }); it('should handle US phone number with different formatting', () => { const formattedNumber = '202.456.1111'; component.displayPhoneNumber = formattedNumber; - + component.onPhoneNumberChange(); - + expect(component.value).toBe('+12024561111'); }); it('should handle US phone number with country code already included', () => { const withCountryCode = '+1 202 456 1111'; component.displayPhoneNumber = withCountryCode; - + component.onPhoneNumberChange(); - + expect(component.value).toBe('+12024561111'); }); it('should not format invalid US phone number', () => { const invalidNumber = '123'; component.displayPhoneNumber = invalidNumber; - + component.onPhoneNumberChange(); - + // Should either be empty or the cleaned input, but not a malformed international number expect(component.value).not.toMatch(/^\+1123$/); }); @@ -103,12 +103,12 @@ describe('PhoneRowComponent', () => { component.selectedCountry = ukCountry!; component.countryControl.setValue(ukCountry!); component.initializeFormatter(); - + const localNumber = '020 7946 0958'; component.displayPhoneNumber = localNumber; - + component.onPhoneNumberChange(); - + expect(component.value).toBe('+442079460958'); }); @@ -117,12 +117,12 @@ describe('PhoneRowComponent', () => { component.selectedCountry = deCountry!; component.countryControl.setValue(deCountry!); component.initializeFormatter(); - + const localNumber = '030 12345678'; component.displayPhoneNumber = localNumber; - + component.onPhoneNumberChange(); - + expect(component.value).toBe('+493012345678'); }); }); @@ -136,17 +136,17 @@ describe('PhoneRowComponent', () => { const usCountry = component.countries.find(c => c.code === 'US'); component.selectedCountry = usCountry!; component.displayPhoneNumber = '(202) 456-1111'; - + const isValid = component.isValidPhoneNumber(); - + expect(isValid).toBe(true); }); it('should validate international phone number as valid', () => { component.displayPhoneNumber = '+442079460958'; - + const isValid = component.isValidPhoneNumber(); - + expect(isValid).toBe(true); }); @@ -154,17 +154,17 @@ describe('PhoneRowComponent', () => { const usCountry = component.countries.find(c => c.code === 'US'); component.selectedCountry = usCountry!; component.displayPhoneNumber = '123'; - + const isValid = component.isValidPhoneNumber(); - + expect(isValid).toBe(false); }); it('should treat empty phone number as valid when validation is enabled', () => { component.displayPhoneNumber = ''; - + const isValid = component.isValidPhoneNumber(); - + expect(isValid).toBe(true); // Empty is valid, let required validation handle it }); }); @@ -173,9 +173,9 @@ describe('PhoneRowComponent', () => { it('should detect country from international number', () => { const internationalNumber = '+442079460958'; component.displayPhoneNumber = internationalNumber; - + component.onPhoneNumberChange(); - + expect(component.selectedCountry.code).toBe('GB'); expect(component.countryControl.value?.code).toBe('GB'); }); @@ -183,9 +183,9 @@ describe('PhoneRowComponent', () => { it('should detect US from +1 number', () => { const usInternationalNumber = '+12024561111'; component.displayPhoneNumber = usInternationalNumber; - + component.onPhoneNumberChange(); - + expect(component.selectedCountry.code).toBe('US'); expect(component.countryControl.value?.code).toBe('US'); }); @@ -194,30 +194,30 @@ describe('PhoneRowComponent', () => { describe('Autocomplete Functionality', () => { it('should filter countries by name', () => { const filtered = component._filterCountries('United'); - + expect(filtered.length).toBeGreaterThan(0); expect(filtered.some(country => country.name.includes('United'))).toBe(true); }); it('should filter countries by code', () => { const filtered = component._filterCountries('US'); - + expect(filtered.length).toBeGreaterThan(0); expect(filtered.some(country => country.code === 'US')).toBe(true); }); it('should filter countries by dial code', () => { const filtered = component._filterCountries('+1'); - + expect(filtered.length).toBeGreaterThan(0); expect(filtered.some(country => country.dialCode === '+1')).toBe(true); }); it('should display country with flag, name and dial code', () => { const usCountry = component.countries.find(c => c.code === 'US')!; - + const displayText = component.displayCountryFn(usCountry); - + expect(displayText).toContain('๐Ÿ‡บ๐Ÿ‡ธ'); expect(displayText).toContain('United States'); expect(displayText).toContain('+1'); @@ -225,9 +225,9 @@ describe('PhoneRowComponent', () => { it('should handle country selection', () => { const ukCountry = component.countries.find(c => c.code === 'GB')!; - + component.onCountrySelected(ukCountry); - + expect(component.selectedCountry).toBe(ukCountry); expect(component.formatter).toBeDefined(); }); @@ -237,26 +237,26 @@ describe('PhoneRowComponent', () => { it('should return correct example for US', () => { const usCountry = component.countries.find(c => c.code === 'US')!; component.selectedCountry = usCountry; - + const example = component.getExamplePhoneNumber(); - + expect(example).toBe('(202) 456-1111'); }); it('should return correct example for UK', () => { const ukCountry = component.countries.find(c => c.code === 'GB')!; component.selectedCountry = ukCountry; - + const example = component.getExamplePhoneNumber(); - + expect(example).toBe('020 7946 0958'); }); it('should return fallback example for unknown country', () => { component.selectedCountry = { code: 'XX', name: 'Unknown', dialCode: '+999', flag: '๐Ÿณ๏ธ' }; - + const example = component.getExamplePhoneNumber(); - + expect(example).toBe('+999 123 4567'); }); }); @@ -264,26 +264,26 @@ describe('PhoneRowComponent', () => { describe('Edge Cases and Error Handling', () => { it('should handle malformed phone numbers gracefully', () => { component.displayPhoneNumber = 'not-a-phone-number'; - + expect(() => component.onPhoneNumberChange()).not.toThrow(); }); it('should handle empty selected country', () => { component.selectedCountry = null as any; component.displayPhoneNumber = '5551234567'; - + expect(() => component.onPhoneNumberChange()).not.toThrow(); }); it('should emit field change events', () => { spyOn(component.onFieldChange, 'emit'); - + const usCountry = component.countries.find(c => c.code === 'US'); component.selectedCountry = usCountry!; component.displayPhoneNumber = '5551234567'; - + component.onPhoneNumberChange(); - + expect(component.onFieldChange.emit).toHaveBeenCalledWith(component.value); }); }); @@ -297,9 +297,9 @@ describe('PhoneRowComponent', () => { phone_validation: false } } as any; - + component.configureFromWidgetParams(); - + expect(component.preferredCountries).toEqual(['CA', 'GB']); expect(component.enablePlaceholder).toBe(false); expect(component.phoneValidation).toBe(false); @@ -307,7 +307,7 @@ describe('PhoneRowComponent', () => { it('should handle missing widget params', () => { component.widgetStructure = {} as any; - + expect(() => component.configureFromWidgetParams()).not.toThrow(); }); }); diff --git a/frontend/src/app/components/ui-components/row-fields/phone/phone.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.ts similarity index 99% rename from frontend/src/app/components/ui-components/row-fields/phone/phone.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.ts index 47732e4f9..d9d1caf9d 100644 --- a/frontend/src/app/components/ui-components/row-fields/phone/phone.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.ts @@ -1,15 +1,16 @@ +import { AsYouType, CountryCode as LibPhoneCountryCode, getCountries, getCountryCallingCode, parsePhoneNumber } from 'libphonenumber-js'; import { Component, Injectable, Input, OnInit } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { Observable, map, startWith } from 'rxjs'; + +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; +import { CommonModule } from '@angular/common'; +import { FormControl } from '@angular/forms'; import { FormsModule } from '@angular/forms'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { CommonModule } from '@angular/common'; -import { Observable, map, startWith } from 'rxjs'; -import { FormControl } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms'; -import { parsePhoneNumber, getCountries, getCountryCallingCode, AsYouType, CountryCode as LibPhoneCountryCode } from 'libphonenumber-js'; interface CountryCode { code: string; @@ -21,12 +22,12 @@ interface CountryCode { @Injectable() @Component({ - selector: 'app-row-phone', + selector: 'app-edit-phone', templateUrl: './phone.component.html', styleUrls: ['./phone.component.css'], imports: [CommonModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatAutocompleteModule, FormsModule, ReactiveFormsModule] }) -export class PhoneRowComponent extends BaseRowFieldComponent implements OnInit { +export class PhoneEditComponent extends BaseEditFieldComponent implements OnInit { @Input() value: string = ''; static type = 'phone'; diff --git a/frontend/src/app/components/ui-components/row-fields/point/point.component.css b/frontend/src/app/components/ui-components/record-edit-fields/point/point.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/point/point.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/point/point.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/point/point.component.html b/frontend/src/app/components/ui-components/record-edit-fields/point/point.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/point/point.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/point/point.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/point/point.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/point/point.component.spec.ts similarity index 58% rename from frontend/src/app/components/ui-components/row-fields/point/point.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/point/point.component.spec.ts index 96afa2db5..ce7ed2239 100644 --- a/frontend/src/app/components/ui-components/row-fields/point/point.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/point/point.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { PointRowComponent } from './point.component'; +import { PointEditComponent } from './point.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -describe('PointRowComponent', () => { - let component: PointRowComponent; - let fixture: ComponentFixture; +describe('PointEditComponent', () => { + let component: PointEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [PointRowComponent, BrowserAnimationsModule] + imports: [PointEditComponent, BrowserAnimationsModule] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(PointRowComponent); + fixture = TestBed.createComponent(PointEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/point/point.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/point/point.component.ts similarity index 69% rename from frontend/src/app/components/ui-components/row-fields/point/point.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/point/point.component.ts index 2f90678ad..7bf7206da 100644 --- a/frontend/src/app/components/ui-components/row-fields/point/point.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/point/point.component.ts @@ -1,16 +1,16 @@ import { Component, Input } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +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'; @Component({ - selector: 'app-row-point', + selector: 'app-edit-point', templateUrl: './point.component.html', styleUrls: ['./point.component.css'], imports: [MatFormFieldModule, MatInputModule, FormsModule] }) -export class PointRowComponent extends BaseRowFieldComponent { +export class PointEditComponent extends BaseEditFieldComponent { @Input() value; } diff --git a/frontend/src/app/components/ui-components/row-fields/select/select.component.css b/frontend/src/app/components/ui-components/record-edit-fields/select/select.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/select/select.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/select/select.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/select/select.component.html b/frontend/src/app/components/ui-components/record-edit-fields/select/select.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/select/select.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/select/select.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/select/select.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/select/select.component.spec.ts similarity index 58% rename from frontend/src/app/components/ui-components/row-fields/select/select.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/select/select.component.spec.ts index 5c9375b07..582b26768 100644 --- a/frontend/src/app/components/ui-components/row-fields/select/select.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/select/select.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { SelectRowComponent } from './select.component'; +import { SelectEditComponent } from './select.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -describe('SelectRowComponent', () => { - let component: SelectRowComponent; - let fixture: ComponentFixture; +describe('SelectEditComponent', () => { + let component: SelectEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [SelectRowComponent, BrowserAnimationsModule] + imports: [SelectEditComponent, BrowserAnimationsModule] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(SelectRowComponent); + fixture = TestBed.createComponent(SelectEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/select/select.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/select/select.component.ts similarity index 86% rename from frontend/src/app/components/ui-components/row-fields/select/select.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/select/select.component.ts index 90fddc5ce..3a222c330 100644 --- a/frontend/src/app/components/ui-components/row-fields/select/select.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/select/select.component.ts @@ -1,19 +1,19 @@ import { CUSTOM_ELEMENTS_SCHEMA, Component, Input } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; @Component({ - selector: 'app-row-select', + selector: 'app-edit-select', imports: [CommonModule, FormsModule, MatFormFieldModule, MatSelectModule], templateUrl: './select.component.html', styleUrls: ['./select.component.css'], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) -export class SelectRowComponent extends BaseRowFieldComponent { +export class SelectEditComponent extends BaseEditFieldComponent { @Input() value: string; public options: {value: string | null, label: string}[] = []; diff --git a/frontend/src/app/components/ui-components/row-fields/static-text/static-text.component.css b/frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/static-text/static-text.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/static-text/static-text.component.html b/frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/static-text/static-text.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/static-text/static-text.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.spec.ts similarity index 55% rename from frontend/src/app/components/ui-components/row-fields/static-text/static-text.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.spec.ts index 66fe77b56..2bc3fa6cd 100644 --- a/frontend/src/app/components/ui-components/row-fields/static-text/static-text.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { StaticTextRowComponent } from './static-text.component'; +import { StaticTextEditComponent } from './static-text.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -describe('StaticTextRowComponent', () => { - let component: StaticTextRowComponent; - let fixture: ComponentFixture; +describe('StaticTextEditComponent', () => { + let component: StaticTextEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [StaticTextRowComponent, BrowserAnimationsModule] + imports: [StaticTextEditComponent, BrowserAnimationsModule] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(StaticTextRowComponent); + fixture = TestBed.createComponent(StaticTextEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/static-text/static-text.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.ts similarity index 57% rename from frontend/src/app/components/ui-components/row-fields/static-text/static-text.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.ts index df41c46d8..4d0e89887 100644 --- a/frontend/src/app/components/ui-components/row-fields/static-text/static-text.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.ts @@ -1,14 +1,14 @@ import { Component, Input } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { CommonModule } from '@angular/common'; @Component({ - selector: 'app-row-static-text', + selector: 'app-edit-static-text', imports: [CommonModule], templateUrl: './static-text.component.html', styleUrls: ['./static-text.component.css'] }) -export class StaticTextRowComponent extends BaseRowFieldComponent { +export class StaticTextEditComponent extends BaseEditFieldComponent { @Input() value: string; } diff --git a/frontend/src/app/components/ui-components/row-fields/text/text.component.css b/frontend/src/app/components/ui-components/record-edit-fields/text/text.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/text/text.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/text/text.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/text/text.component.html b/frontend/src/app/components/ui-components/record-edit-fields/text/text.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/text/text.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/text/text.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/text/text.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/text/text.component.spec.ts similarity index 59% rename from frontend/src/app/components/ui-components/row-fields/text/text.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/text/text.component.spec.ts index 1d34589c3..e326ae971 100644 --- a/frontend/src/app/components/ui-components/row-fields/text/text.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/text/text.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { TextRowComponent } from './text.component'; +import { TextEditComponent } from './text.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -describe('TextRowComponent', () => { - let component: TextRowComponent; - let fixture: ComponentFixture; +describe('TextEditComponent', () => { + let component: TextEditComponent; + let fixture: ComponentFixture; beforeEach(async() => { await TestBed.configureTestingModule({ - imports: [TextRowComponent, BrowserAnimationsModule] + imports: [TextEditComponent, BrowserAnimationsModule] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(TextRowComponent); + fixture = TestBed.createComponent(TextEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/text/text.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/text/text.component.ts similarity index 72% rename from frontend/src/app/components/ui-components/row-fields/text/text.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/text/text.component.ts index f6a7ec83b..b4edca35a 100644 --- a/frontend/src/app/components/ui-components/row-fields/text/text.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/text/text.component.ts @@ -1,6 +1,6 @@ import { Component, Injectable, Input } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +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'; @@ -8,12 +8,12 @@ import { MatInputModule } from '@angular/material/input'; @Injectable() @Component({ - selector: 'app-row-text', + selector: 'app-edit-text', templateUrl: './text.component.html', styleUrls: ['./text.component.css'], imports: [MatFormFieldModule, MatInputModule, FormsModule] }) -export class TextRowComponent extends BaseRowFieldComponent { +export class TextEditComponent extends BaseEditFieldComponent { @Input() value: string; static type = 'text'; diff --git a/frontend/src/app/components/ui-components/row-fields/time-interval/time-interval.component.css b/frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/time-interval/time-interval.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/time-interval/time-interval.component.html b/frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/time-interval/time-interval.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.html diff --git a/frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.spec.ts new file mode 100644 index 000000000..2e018cc47 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TimeIntervalEditComponent } from './time-interval.component'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; + +describe('TimeIntervalEditComponent', () => { + let component: TimeIntervalEditComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TimeIntervalEditComponent, BrowserAnimationsModule] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(TimeIntervalEditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/components/ui-components/row-fields/time-interval/time-interval.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.ts similarity index 83% rename from frontend/src/app/components/ui-components/row-fields/time-interval/time-interval.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.ts index 56a61ce7f..197dc27b2 100644 --- a/frontend/src/app/components/ui-components/row-fields/time-interval/time-interval.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.ts @@ -2,19 +2,19 @@ import * as pgInterval from 'postgres-interval'; import { Component, Input } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; @Component({ - selector: 'app-row-time-interval', + selector: 'app-edit-time-interval', imports: [CommonModule, MatFormFieldModule, MatInputModule, FormsModule], templateUrl: './time-interval.component.html', styleUrls: ['./time-interval.component.css'] }) -export class TimeIntervalRowComponent extends BaseRowFieldComponent { +export class TimeIntervalEditComponent extends BaseEditFieldComponent { @Input() value; public interval = { diff --git a/frontend/src/app/components/ui-components/row-fields/time/time.component.css b/frontend/src/app/components/ui-components/record-edit-fields/time/time.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/time/time.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/time/time.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/time/time.component.html b/frontend/src/app/components/ui-components/record-edit-fields/time/time.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/time/time.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/time/time.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/time/time.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/time/time.component.spec.ts similarity index 59% rename from frontend/src/app/components/ui-components/row-fields/time/time.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/time/time.component.spec.ts index 3680ad1aa..149214c79 100644 --- a/frontend/src/app/components/ui-components/row-fields/time/time.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/time/time.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { TimeRowComponent } from './time.component'; +import { TimeEditComponent } from './time.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -describe('TimeRowComponent', () => { - let component: TimeRowComponent; - let fixture: ComponentFixture; +describe('TimeEditComponent', () => { + let component: TimeEditComponent; + let fixture: ComponentFixture; beforeEach(async() => { await TestBed.configureTestingModule({ - imports: [TimeRowComponent, BrowserAnimationsModule] + imports: [TimeEditComponent, BrowserAnimationsModule] }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(TimeRowComponent); + fixture = TestBed.createComponent(TimeEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/time/time.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/time/time.component.ts similarity index 74% rename from frontend/src/app/components/ui-components/row-fields/time/time.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/time/time.component.ts index 55a727650..620492ff7 100644 --- a/frontend/src/app/components/ui-components/row-fields/time/time.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/time/time.component.ts @@ -1,17 +1,17 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +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'; @Component({ - selector: 'app-row-time', + selector: 'app-edit-time', templateUrl: './time.component.html', styleUrls: ['./time.component.css'], imports: [MatFormFieldModule, MatInputModule, FormsModule] }) -export class TimeRowComponent extends BaseRowFieldComponent { +export class TimeEditComponent extends BaseEditFieldComponent { @Input() value: string; @Output() onFieldChange = new EventEmitter(); static type = 'datetime'; diff --git a/frontend/src/app/components/ui-components/row-fields/url/url.component.css b/frontend/src/app/components/ui-components/record-edit-fields/url/url.component.css similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/url/url.component.css rename to frontend/src/app/components/ui-components/record-edit-fields/url/url.component.css diff --git a/frontend/src/app/components/ui-components/row-fields/url/url.component.html b/frontend/src/app/components/ui-components/record-edit-fields/url/url.component.html similarity index 100% rename from frontend/src/app/components/ui-components/row-fields/url/url.component.html rename to frontend/src/app/components/ui-components/record-edit-fields/url/url.component.html diff --git a/frontend/src/app/components/ui-components/row-fields/url/url.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/url/url.component.spec.ts similarity index 71% rename from frontend/src/app/components/ui-components/row-fields/url/url.component.spec.ts rename to frontend/src/app/components/ui-components/record-edit-fields/url/url.component.spec.ts index d2e25c698..ace360aef 100644 --- a/frontend/src/app/components/ui-components/row-fields/url/url.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/url/url.component.spec.ts @@ -1,23 +1,23 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { UrlRowComponent } from './url.component'; +import { UrlEditComponent } from './url.component'; import { FormsModule } from '@angular/forms'; describe('UrlComponent', () => { - let component: UrlRowComponent; - let fixture: ComponentFixture; + let component: UrlEditComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ FormsModule, - UrlRowComponent, + UrlEditComponent, BrowserAnimationsModule ] }).compileComponents(); - fixture = TestBed.createComponent(UrlRowComponent); + fixture = TestBed.createComponent(UrlEditComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/frontend/src/app/components/ui-components/row-fields/url/url.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/url/url.component.ts similarity index 77% rename from frontend/src/app/components/ui-components/row-fields/url/url.component.ts rename to frontend/src/app/components/ui-components/record-edit-fields/url/url.component.ts index 23d246e01..5fd85384b 100644 --- a/frontend/src/app/components/ui-components/row-fields/url/url.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/url/url.component.ts @@ -1,6 +1,6 @@ import { Component, Input } from '@angular/core'; -import { BaseRowFieldComponent } from '../base-row-field/base-row-field.component'; +import { BaseEditFieldComponent } from '../base-row-field/base-row-field.component'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatFormFieldModule } from '@angular/material/form-field'; @@ -8,7 +8,7 @@ import { MatInputModule } from '@angular/material/input'; import { UrlValidatorDirective } from 'src/app/directives/url-validator.directive'; @Component({ - selector: 'app-url', + selector: 'app-edit-url', imports: [ CommonModule, FormsModule, @@ -19,6 +19,6 @@ import { UrlValidatorDirective } from 'src/app/directives/url-validator.directiv templateUrl: './url.component.html', styleUrl: './url.component.css' }) -export class UrlRowComponent extends BaseRowFieldComponent { +export class UrlEditComponent extends BaseEditFieldComponent { @Input() value: string; } diff --git a/frontend/src/app/components/ui-components/row-fields/binary-data-caption/binary-data-caption.component.spec.ts b/frontend/src/app/components/ui-components/row-fields/binary-data-caption/binary-data-caption.component.spec.ts deleted file mode 100644 index 78d9925ae..000000000 --- a/frontend/src/app/components/ui-components/row-fields/binary-data-caption/binary-data-caption.component.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { BinaryDataCaptionRowComponent } from './binary-data-caption.component'; - -describe('BinaryDataCaptionRowComponent', () => { - let component: BinaryDataCaptionRowComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [BinaryDataCaptionRowComponent] - }).compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(BinaryDataCaptionRowComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontend/src/app/components/ui-components/row-fields/time-interval/time-interval.component.spec.ts b/frontend/src/app/components/ui-components/row-fields/time-interval/time-interval.component.spec.ts deleted file mode 100644 index b22c2e019..000000000 --- a/frontend/src/app/components/ui-components/row-fields/time-interval/time-interval.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { TimeIntervalRowComponent } from './time-interval.component'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; - -describe('TimeIntervalRowComponent', () => { - let component: TimeIntervalRowComponent; - let fixture: ComponentFixture; - - beforeEach(async() => { - await TestBed.configureTestingModule({ - imports: [TimeIntervalRowComponent, BrowserAnimationsModule] - }).compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(TimeIntervalRowComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontend/src/app/components/ui-components/table-display-fields/base-table-display-field/base-table-display-field.component.css b/frontend/src/app/components/ui-components/table-display-fields/base-table-display-field/base-table-display-field.component.css new file mode 100644 index 000000000..eb518d97e --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/base-table-display-field/base-table-display-field.component.css @@ -0,0 +1,26 @@ +.field-display { + position: relative; + display: flex; + align-items: center; +} + +.field-value { + flex-grow: 1 0 auto; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.field-copy-button { + position: absolute; + right: -6px; + top: 50%; + background-color: var(--hover-color); + transform: translate(0, -50%) scale(0.85); + opacity: 0; + transition: opacity 0.1s ease-in-out; +} + +.field-display:hover .field-copy-button { + opacity: 1; +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/base-table-display-field/base-table-display-field.component.html b/frontend/src/app/components/ui-components/table-display-fields/base-table-display-field/base-table-display-field.component.html new file mode 100644 index 000000000..67e1f2808 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/base-table-display-field/base-table-display-field.component.html @@ -0,0 +1 @@ + diff --git a/frontend/src/app/components/ui-components/table-display-fields/base-table-display-field/base-table-display-field.component.ts b/frontend/src/app/components/ui-components/table-display-fields/base-table-display-field/base-table-display-field.component.ts new file mode 100644 index 000000000..8663c31d0 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/base-table-display-field/base-table-display-field.component.ts @@ -0,0 +1,21 @@ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { TableField, TableForeignKey, WidgetStructure } from 'src/app/models/table'; + +import { CommonModule } from '@angular/common'; +import { normalizeFieldName } from '../../../../lib/normalize'; + +@Component({ + selector: 'app-base-display-field', + templateUrl: './base-table-display-field.component.html', + styleUrl: './base-table-display-field.component.css', + imports: [CommonModule] +}) +export class BaseTableDisplayFieldComponent { + @Input() key: string; + @Input() value: any; + @Input() structure: TableField; + @Input() widgetStructure: WidgetStructure; + // @Input() relations: TableForeignKey; + + @Output() onCopyToClipboard = new EventEmitter(); +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.html b/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.html new file mode 100644 index 000000000..ea5a639c0 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.html @@ -0,0 +1,3 @@ +
+ {{value || 'โ€”'}} +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.ts b/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.ts new file mode 100644 index 000000000..86073def1 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.ts @@ -0,0 +1,15 @@ +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-binary-data-caption-display', + templateUrl: './binary-data-caption.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './binary-data-caption.component.css'], + imports: [CommonModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class BinaryDataCaptionDisplayComponent extends BaseTableDisplayFieldComponent { +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.css b/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.css new file mode 100644 index 000000000..603046a74 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.css @@ -0,0 +1,27 @@ +.boolean-icon { + transform: scale(0.85); +} + +@media (prefers-color-scheme: light) { + .boolean-icon-true { + color: #1B5E20; + } + + .boolean-icon-false { + color: #B71C1C; + } +} + +@media (prefers-color-scheme: dark) { + .boolean-icon-true { + color: #4CAF50; + } + + .boolean-icon-false { + color: #E53935; + } +} + + + + diff --git a/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.html b/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.html new file mode 100644 index 000000000..a83870454 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.html @@ -0,0 +1,7 @@ +
+
+ check_small + close_small + โ€” +
+
diff --git a/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.ts b/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.ts new file mode 100644 index 000000000..dc78799f4 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.ts @@ -0,0 +1,18 @@ +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 { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Injectable() +@Component({ + selector: 'app-display-boolean', + templateUrl: './boolean.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './boolean.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule, CommonModule] +}) +export class BooleanDisplayComponent extends BaseTableDisplayFieldComponent { +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/code/code.component.css b/frontend/src/app/components/ui-components/table-display-fields/code/code.component.css new file mode 100644 index 000000000..1e61ec077 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/code/code.component.css @@ -0,0 +1,12 @@ +.field-value { + background-color: #EAEAFF; + border-radius: 4px; + font-family: monospace; + padding: 0 8px; +} + +@media (prefers-color-scheme: dark) { + .field-value { + background-color: #2C2C54; + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/code/code.component.html b/frontend/src/app/components/ui-components/table-display-fields/code/code.component.html new file mode 100644 index 000000000..acf48b2d5 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/code/code.component.html @@ -0,0 +1,11 @@ +
+ {{value || 'โ€”'}} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/code/code.component.ts b/frontend/src/app/components/ui-components/table-display-fields/code/code.component.ts new file mode 100644 index 000000000..85a949984 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/code/code.component.ts @@ -0,0 +1,15 @@ +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-code-display', + templateUrl: './code.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './code.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class CodeDisplayComponent extends BaseTableDisplayFieldComponent { +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/country/country.component.css b/frontend/src/app/components/ui-components/table-display-fields/country/country.component.css new file mode 100644 index 000000000..b3e456f15 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/country/country.component.css @@ -0,0 +1,27 @@ +.field-wrapper { + display: flex; + align-items: center; +} + +.value-wrapper { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 300px; + display: flex; + align-items: center; +} + +.country-flag { + margin-right: 6px; + font-size: 1.2em; +} + +.copy-button { + visibility: hidden; + margin-left: 4px; +} + +.field-wrapper:hover .copy-button { + visibility: visible; +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/country/country.component.html b/frontend/src/app/components/ui-components/table-display-fields/country/country.component.html new file mode 100644 index 000000000..8acfa685c --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/country/country.component.html @@ -0,0 +1,14 @@ +
+ + + {{ countryName }} + + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/country/country.component.ts b/frontend/src/app/components/ui-components/table-display-fields/country/country.component.ts new file mode 100644 index 000000000..ab2d4f131 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/country/country.component.ts @@ -0,0 +1,33 @@ +import { COUNTRIES, getCountryFlag } from '../../../../consts/countries'; +import { Component, OnChanges, OnInit, SimpleChanges } from '@angular/core'; + +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-country-display', + templateUrl: './country.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './country.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule, CommonModule] +}) +export class CountryDisplayComponent extends BaseTableDisplayFieldComponent implements OnInit { + static type = 'country'; + + public countryName: string = ''; + public countryFlag: string = ''; + + ngOnInit(): void { + if (this.value) { + const country = COUNTRIES.find(c => c.code === this.value); + this.countryName = country ? country.name : this.value; + this.countryFlag = getCountryFlag(this.value); + } else { + this.countryName = 'โ€”'; + this.countryFlag = ''; + } + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.css b/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.css new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.css @@ -0,0 +1 @@ + diff --git a/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.html b/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.html new file mode 100644 index 000000000..43432b87e --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.html @@ -0,0 +1,11 @@ +
+ {{formattedDateTime || 'โ€”'}} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.ts b/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.ts new file mode 100644 index 000000000..08a32c1d2 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit } 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 { format } from 'date-fns'; + +@Component({ + selector: 'app-date-time-display', + templateUrl: './date-time.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './date-time.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class DateTimeDisplayComponent extends BaseTableDisplayFieldComponent implements OnInit { + static type = 'datetime'; + + public formattedDateTime: string; + + ngOnInit(): void { + if (this.value) { + try { + const date = new Date(this.value); + if (!isNaN(date.getTime())) { + this.formattedDateTime = format(date, "P p"); + } else { + this.formattedDateTime = this.value; + } + } catch (error) { + this.formattedDateTime = this.value; + } + } + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/date/date.component.css b/frontend/src/app/components/ui-components/table-display-fields/date/date.component.css new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/date/date.component.css @@ -0,0 +1 @@ + diff --git a/frontend/src/app/components/ui-components/table-display-fields/date/date.component.html b/frontend/src/app/components/ui-components/table-display-fields/date/date.component.html new file mode 100644 index 000000000..36172b273 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/date/date.component.html @@ -0,0 +1,11 @@ +
+ {{formattedDate || 'โ€”'}} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/date/date.component.ts b/frontend/src/app/components/ui-components/table-display-fields/date/date.component.ts new file mode 100644 index 000000000..28eaabab7 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/date/date.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit } from '@angular/core'; +import { format, parseISO } from 'date-fns'; + +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'; + +@Component({ + selector: 'app-date-display', + templateUrl: './date.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './date.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class DateDisplayComponent extends BaseTableDisplayFieldComponent implements OnInit { + static type = 'date'; + + public formattedDate: string; + + ngOnInit(): void { + if (this.value) { + try { + const date = new Date(this.value); + if (!isNaN(date.getTime())) { + this.formattedDate = format(date, "P"); + } else { + this.formattedDate = this.value; + } + } catch (error) { + this.formattedDate = this.value; + } + } + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/file/file.component.css b/frontend/src/app/components/ui-components/table-display-fields/file/file.component.css new file mode 100644 index 000000000..7f667e698 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/file/file.component.css @@ -0,0 +1,4 @@ +.field-value { + font-style: italic; + color: #666; +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/file/file.component.html b/frontend/src/app/components/ui-components/table-display-fields/file/file.component.html new file mode 100644 index 000000000..e490bcd7b --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/file/file.component.html @@ -0,0 +1,3 @@ +
+ {{displayText}} +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/file/file.component.ts b/frontend/src/app/components/ui-components/table-display-fields/file/file.component.ts new file mode 100644 index 000000000..ee2aec579 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/file/file.component.ts @@ -0,0 +1,33 @@ +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +interface Blob { + type: string; + data: any[]; +} + +@Component({ + selector: 'app-file-display', + templateUrl: './file.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './file.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule, CommonModule] +}) +export class FileDisplayComponent extends BaseTableDisplayFieldComponent { + get isBlob(): boolean { + return typeof this.value === 'object' && this.value !== null && 'type' in this.value && 'data' in this.value; + } + + get displayText(): string { + if (this.isBlob) { + return 'Binary Data'; + } else if (typeof this.value === 'string' && this.value.length > 20) { + return 'Binary Data'; + } + return this.value ? String(this.value) : 'โ€”'; + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.css b/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.css new file mode 100644 index 000000000..e818ae5cc --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.css @@ -0,0 +1,27 @@ +.foreign-key-button { + background: transparent; + border: 1px solid transparent; + border-radius: 12px; + color: var(--color-accentedPalette-500); + cursor: pointer; + font-size: inherit; + padding: 2px 8px; + overflow: hidden; + text-overflow: ellipsis; + text-align: left; + max-width: 100%; + transition: background 100ms, border-color 100ms; +} + +.foreign-key-button:hover{ + background-color: var(--color-accentedPalette-100); + border: 1px solid var(--color-accentedPalette-300); +} + +.foreign-key-button_selected { + background-color: var(--color-accentedPalette-100); + border-radius: 12px; + border: 1px solid var(--color-accentedPalette-300); +} + + diff --git a/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.html b/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.html new file mode 100644 index 000000000..c4e04ce2f --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.html @@ -0,0 +1,21 @@ +
+
+ + {{ value || 'โ€”' }} +
+ +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.ts b/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.ts new file mode 100644 index 000000000..6f7ec39d5 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.ts @@ -0,0 +1,37 @@ +import { Component, EventEmitter, Injectable, Input, Output } from '@angular/core'; + +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { TableForeignKey } from 'src/app/models/table'; + +@Injectable() +@Component({ + selector: 'app-display-foreign-key', + templateUrl: './foreign-key.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './foreign-key.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule, CommonModule] +}) +export class ForeignKeyDisplayComponent extends BaseTableDisplayFieldComponent { + @Input() isSelected: boolean = false; + @Input() relations: TableForeignKey; + + @Output() onForeignKeyClick = new EventEmitter<{foreignKey: any, value: string}>(); + + constructor() { + super(); + } + + handleForeignKeyClick($event): void { + $event.stopPropagation(); + if (this.relations && this.value) { + this.onForeignKeyClick.emit({ + foreignKey: this.relations, + value: this.value + }); + } + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/id/id.component.css b/frontend/src/app/components/ui-components/table-display-fields/id/id.component.css new file mode 100644 index 000000000..277f14993 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/id/id.component.css @@ -0,0 +1,9 @@ +.field-display-id { + display: flex; + align-items: center; +} + +.field-value-id { + font-weight: 500; + flex-grow: 1; +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/id/id.component.html b/frontend/src/app/components/ui-components/table-display-fields/id/id.component.html new file mode 100644 index 000000000..1f1908b5a --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/id/id.component.html @@ -0,0 +1,12 @@ +
+ {{value || 'โ€”'}} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/id/id.component.ts b/frontend/src/app/components/ui-components/table-display-fields/id/id.component.ts new file mode 100644 index 000000000..e219738b4 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/id/id.component.ts @@ -0,0 +1,17 @@ +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'; + +@Injectable() +@Component({ + selector: 'app-display-id', + templateUrl: './id.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './id.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class IdDisplayComponent extends BaseTableDisplayFieldComponent { +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/image/image.component.css b/frontend/src/app/components/ui-components/table-display-fields/image/image.component.css new file mode 100644 index 000000000..fad6ddbcf --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/image/image.component.css @@ -0,0 +1,10 @@ +.field-value { + font-style: italic; + color: #666; +} + +.image-thumbnail { + display: block; + height: var(--height); + margin: 12px 0; +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/image/image.component.html b/frontend/src/app/components/ui-components/table-display-fields/image/image.component.html new file mode 100644 index 000000000..dd64c06b4 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/image/image.component.html @@ -0,0 +1,15 @@ +
+ [Image URL] + Image + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/image/image.component.ts b/frontend/src/app/components/ui-components/table-display-fields/image/image.component.ts new file mode 100644 index 000000000..ac168f9ff --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/image/image.component.ts @@ -0,0 +1,25 @@ +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-image-display', + templateUrl: './image.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './image.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule, CommonModule] +}) +export class ImageDisplayComponent extends BaseTableDisplayFieldComponent { + get isUrl(): boolean { + if (!this.value) return false; + try { + new URL(this.value); + return true; + } catch { + return false; + } + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/index.ts b/frontend/src/app/components/ui-components/table-display-fields/index.ts new file mode 100644 index 000000000..375fd368f --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/index.ts @@ -0,0 +1,25 @@ +import { BaseTableFieldDisplayComponent } from './base-table-display-field/base-table-field-display.component'; +import { BooleanDisplayComponent } from './boolean/boolean.component'; +import { ForeignKeyDisplayComponent } from './foreign-key/foreign-key.component'; +import { IdDisplayComponent } from './id/id.component'; +import { LongTextDisplayComponent } from './long-text/long-text.component'; +import { TextDisplayComponent } from './text/text.component'; + +export const DisplayComponents = { + 'text': TextDisplayComponent, + 'long_text': LongTextDisplayComponent, + 'id': IdDisplayComponent, + 'boolean': BooleanDisplayComponent, + 'foreign key': ForeignKeyDisplayComponent, + // Add additional components as needed + // These should match the types used in tableTypes object +}; + +export { + BaseTableFieldDisplayComponent, + TextDisplayComponent, + LongTextDisplayComponent, + IdDisplayComponent, + BooleanDisplayComponent, + ForeignKeyDisplayComponent +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.css b/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.css new file mode 100644 index 000000000..354fa288a --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.css @@ -0,0 +1,6 @@ +.json-display { + background-color: #EAEAFF; + border-radius: 4px; + font-family: monospace; + padding: 0 8px; +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.html b/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.html new file mode 100644 index 000000000..4a6211393 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.html @@ -0,0 +1,11 @@ +
+
{{ formattedJson }}
+ +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.ts b/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.ts new file mode 100644 index 000000000..fba837ed6 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.ts @@ -0,0 +1,26 @@ +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-json-editor-display', + templateUrl: './json-editor.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './json-editor.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule, CommonModule] +}) +export class JsonEditorDisplayComponent extends BaseTableDisplayFieldComponent { + get formattedJson(): string { + if (!this.value) return ''; + + try { + const parsedValue = typeof this.value === 'string' ? JSON.parse(this.value) : this.value; + return JSON.stringify(parsedValue, null, 2); + } catch (e) { + return String(this.value); + } + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.css b/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.css new file mode 100644 index 000000000..adb834c90 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.css @@ -0,0 +1,4 @@ +.field-value { + height: 36px; + line-height: 36px; +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.html b/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.html new file mode 100644 index 000000000..79e15809d --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.html @@ -0,0 +1,12 @@ +
+ {{value || 'โ€”'}} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.ts b/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.ts new file mode 100644 index 000000000..b472abc3b --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.ts @@ -0,0 +1,19 @@ +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 { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Injectable() +@Component({ + selector: 'app-display-long-text', + templateUrl: './long-text.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './long-text.component.css'], + imports: [CommonModule, ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class LongTextDisplayComponent extends BaseTableDisplayFieldComponent { + +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/money/money.component.css b/frontend/src/app/components/ui-components/table-display-fields/money/money.component.css new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/money/money.component.css @@ -0,0 +1 @@ + diff --git a/frontend/src/app/components/ui-components/table-display-fields/money/money.component.html b/frontend/src/app/components/ui-components/table-display-fields/money/money.component.html new file mode 100644 index 000000000..202929d6b --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/money/money.component.html @@ -0,0 +1,13 @@ +
+ + {{formattedValue || 'โ€”'}} + + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/money/money.component.ts b/frontend/src/app/components/ui-components/table-display-fields/money/money.component.ts new file mode 100644 index 000000000..1ac819480 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/money/money.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit } from '@angular/core'; + +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { getCurrencyByCode } from 'src/app/consts/currencies'; + +@Component({ + selector: 'app-money-display', + templateUrl: './money.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './money.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule, CommonModule] +}) +export class MoneyDisplayComponent extends BaseTableDisplayFieldComponent implements OnInit { + public displayCurrency: string = ''; + public currencySymbol: string = ''; + + ngOnInit(): void { + // Get currency from widget params + this.displayCurrency = ''; + if (this.widgetStructure && this.widgetStructure.widget_params && this.widgetStructure.widget_params.default_currency) { + this.displayCurrency = this.widgetStructure.widget_params.default_currency; + const currency = getCurrencyByCode(this.displayCurrency); + this.currencySymbol = currency ? currency.symbol : ''; + } + } + + get formattedValue(): string { + if (!this.value) { + return ''; + } + + let amount: number | string; + let currency: string = this.displayCurrency; + + if (typeof this.value === 'object' && this.value.amount !== undefined) { + amount = this.value.amount; + if (this.value.currency) { + currency = this.value.currency; + const currencyObj = getCurrencyByCode(currency); + this.currencySymbol = currencyObj ? currencyObj.symbol : ''; + } + } else { + amount = this.value; + } + + if (typeof amount === 'string') { + amount = parseFloat(amount); + } + + if (isNaN(amount as number)) { + return ''; + } + + const decimalPlaces = this.widgetStructure?.widget_params?.decimal_places ?? 2; + return `${this.currencySymbol}${(amount as number).toFixed(decimalPlaces)}`; + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/number/number.component.css b/frontend/src/app/components/ui-components/table-display-fields/number/number.component.css new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/number/number.component.css @@ -0,0 +1 @@ + diff --git a/frontend/src/app/components/ui-components/table-display-fields/number/number.component.html b/frontend/src/app/components/ui-components/table-display-fields/number/number.component.html new file mode 100644 index 000000000..acf48b2d5 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/number/number.component.html @@ -0,0 +1,11 @@ +
+ {{value || 'โ€”'}} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/number/number.component.ts b/frontend/src/app/components/ui-components/table-display-fields/number/number.component.ts new file mode 100644 index 000000000..6e30e6636 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/number/number.component.ts @@ -0,0 +1,15 @@ +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-display-number', + templateUrl: './number.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './number.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class NumberDisplayComponent extends BaseTableDisplayFieldComponent { +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/password/password.component.css b/frontend/src/app/components/ui-components/table-display-fields/password/password.component.css new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/password/password.component.css @@ -0,0 +1 @@ + diff --git a/frontend/src/app/components/ui-components/table-display-fields/password/password.component.html b/frontend/src/app/components/ui-components/table-display-fields/password/password.component.html new file mode 100644 index 000000000..bc4098081 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/password/password.component.html @@ -0,0 +1,3 @@ +
+ โ€ขโ€ขโ€ขโ€ขโ€ขโ€ขโ€ขโ€ข +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/password/password.component.ts b/frontend/src/app/components/ui-components/table-display-fields/password/password.component.ts new file mode 100644 index 000000000..e852fcf5f --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/password/password.component.ts @@ -0,0 +1,15 @@ +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-password-display', + templateUrl: './password.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './password.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class PasswordDisplayComponent extends BaseTableDisplayFieldComponent { +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.css b/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.css new file mode 100644 index 000000000..9b60ac1dd --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.css @@ -0,0 +1,8 @@ +.field-display { + padding-right: 24px; +} + +.phone-link { + text-decoration: none; + color: var(--primary-color); +} \ No newline at end of file diff --git a/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.html b/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.html new file mode 100644 index 000000000..1cddbab78 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.html @@ -0,0 +1,12 @@ +
+ {{ value }} + โ€” + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.ts b/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.ts new file mode 100644 index 000000000..0edb98236 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.ts @@ -0,0 +1,16 @@ +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-phone-display', + templateUrl: './phone.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './phone.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule, CommonModule] +}) +export class PhoneDisplayComponent extends BaseTableDisplayFieldComponent { +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/point/point.component.css b/frontend/src/app/components/ui-components/table-display-fields/point/point.component.css new file mode 100644 index 000000000..1296352f2 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/point/point.component.css @@ -0,0 +1,21 @@ +.field-wrapper { + display: flex; + align-items: center; +} + +.value-wrapper { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 300px; + font-family: monospace; +} + +.copy-button { + visibility: hidden; + margin-left: 4px; +} + +.field-wrapper:hover .copy-button { + visibility: visible; +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/point/point.component.html b/frontend/src/app/components/ui-components/table-display-fields/point/point.component.html new file mode 100644 index 000000000..2e30aeeca --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/point/point.component.html @@ -0,0 +1,11 @@ +
+ {{ formattedPoint }} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/point/point.component.ts b/frontend/src/app/components/ui-components/table-display-fields/point/point.component.ts new file mode 100644 index 000000000..ad8bd883c --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/point/point.component.ts @@ -0,0 +1,47 @@ +import { Component, OnInit } from '@angular/core'; + +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-point-display', + templateUrl: './point.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './point.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule, CommonModule] +}) +export class PointDisplayComponent extends BaseTableDisplayFieldComponent implements OnInit { + static type = 'point'; + + formattedPoint: string; + + ngOnInit() { + this.formatPoint(); + } + + private formatPoint() { + if (!this.value) { + this.formattedPoint = ''; + return; + } + + try { + if (typeof this.value === 'string') { + // Handle string format like "(x,y)" or "x,y" + const pointStr = this.value.trim().replace(/[()]/g, ''); + const [x, y] = pointStr.split(',').map(coord => parseFloat(coord.trim())); + this.formattedPoint = `(${x}, ${y})`; + } else if (typeof this.value === 'object') { + // Handle object format like {x: 1, y: 2} + const x = this.value.x || this.value[0]; + const y = this.value.y || this.value[1]; + this.formattedPoint = `(${x}, ${y})`; + } + } catch (e) { + this.formattedPoint = String(this.value); + } + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/select/select.component.css b/frontend/src/app/components/ui-components/table-display-fields/select/select.component.css new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/select/select.component.css @@ -0,0 +1 @@ + diff --git a/frontend/src/app/components/ui-components/table-display-fields/select/select.component.html b/frontend/src/app/components/ui-components/table-display-fields/select/select.component.html new file mode 100644 index 000000000..58124cc57 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/select/select.component.html @@ -0,0 +1,11 @@ +
+ {{displayValue}} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/select/select.component.ts b/frontend/src/app/components/ui-components/table-display-fields/select/select.component.ts new file mode 100644 index 000000000..ef98d4e69 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/select/select.component.ts @@ -0,0 +1,42 @@ +import { Component, OnInit } from '@angular/core'; + +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-select-display', + templateUrl: './select.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './select.component.css'], + imports: [CommonModule, ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class SelectDisplayComponent extends BaseTableDisplayFieldComponent implements OnInit { + public displayValue: string; + + ngOnInit(): void { + this.setDisplayValue(); + } + + private setDisplayValue(): void { + if (!this.value) { + this.displayValue = 'โ€”'; + return; + } + + if (this.widgetStructure?.widget_params?.options) { + // Find the matching option based on value and use its label + const option = this.widgetStructure.widget_params.options.find( + (opt: { value: any, label: string }) => opt.value === this.value + ); + this.displayValue = option ? option.label : this.value; + } else if (this.structure?.data_type_params) { + // If no widget structure but we have data_type_params, just use the value + this.displayValue = this.value; + } else { + this.displayValue = this.value; + } + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.css b/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.css new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.css @@ -0,0 +1 @@ + diff --git a/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.html b/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.html new file mode 100644 index 000000000..acf48b2d5 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.html @@ -0,0 +1,11 @@ +
+ {{value || 'โ€”'}} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.ts b/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.ts new file mode 100644 index 000000000..a3fc1e86c --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.ts @@ -0,0 +1,16 @@ +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-display-static-text', + templateUrl: './static-text.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './static-text.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class StaticTextDisplayComponent extends BaseTableDisplayFieldComponent { + static type = 'static-text'; +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/text/text.component.css b/frontend/src/app/components/ui-components/table-display-fields/text/text.component.css new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-display-fields/text/text.component.html b/frontend/src/app/components/ui-components/table-display-fields/text/text.component.html new file mode 100644 index 000000000..acf48b2d5 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/text/text.component.html @@ -0,0 +1,11 @@ +
+ {{value || 'โ€”'}} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/text/text.component.ts b/frontend/src/app/components/ui-components/table-display-fields/text/text.component.ts new file mode 100644 index 000000000..42a66f0a6 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/text/text.component.ts @@ -0,0 +1,17 @@ +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'; + +@Injectable() +@Component({ + selector: 'app-display-text', + templateUrl: './text.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './text.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class TextDisplayComponent extends BaseTableDisplayFieldComponent { +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/time-interval/time-interval.component.css b/frontend/src/app/components/ui-components/table-display-fields/time-interval/time-interval.component.css new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-display-fields/time-interval/time-interval.component.html b/frontend/src/app/components/ui-components/table-display-fields/time-interval/time-interval.component.html new file mode 100644 index 000000000..7a7b4e451 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/time-interval/time-interval.component.html @@ -0,0 +1,11 @@ +
+ {{ formattedInterval }} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/time-interval/time-interval.component.ts b/frontend/src/app/components/ui-components/table-display-fields/time-interval/time-interval.component.ts new file mode 100644 index 000000000..f6e00acd1 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/time-interval/time-interval.component.ts @@ -0,0 +1,41 @@ +import { Component, OnInit } from '@angular/core'; + +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-time-interval-display', + templateUrl: './time-interval.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './time-interval.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule, CommonModule] +}) +export class TimeIntervalDisplayComponent extends BaseTableDisplayFieldComponent implements OnInit { + + formattedInterval: string; + + ngOnInit() { + if (!this.value) { + this.formattedInterval = 'โ€”'; + return; + } + + try { + const interval = typeof this.value === 'string' ? JSON.parse(this.value) : this.value; + let parts = []; + + if (interval.days) parts.push(`${interval.days}d`); + if (interval.hours) parts.push(`${interval.hours}h`); + if (interval.minutes) parts.push(`${interval.minutes}m`); + if (interval.seconds) parts.push(`${interval.seconds}s`); + if (interval.milliseconds) parts.push(`${interval.milliseconds}ms`); + + this.formattedInterval = parts.length > 0 ? parts.join(' ') : '0'; + } catch (e) { + this.formattedInterval = String(this.value); + } + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/time/time.component.css b/frontend/src/app/components/ui-components/table-display-fields/time/time.component.css new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/time/time.component.css @@ -0,0 +1 @@ + diff --git a/frontend/src/app/components/ui-components/table-display-fields/time/time.component.html b/frontend/src/app/components/ui-components/table-display-fields/time/time.component.html new file mode 100644 index 000000000..6a8efae37 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/time/time.component.html @@ -0,0 +1,11 @@ +
+ {{formattedTime || 'โ€”'}} + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/time/time.component.ts b/frontend/src/app/components/ui-components/table-display-fields/time/time.component.ts new file mode 100644 index 000000000..b56192780 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/time/time.component.ts @@ -0,0 +1,40 @@ +import { Component, OnInit } 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 { format } from 'date-fns'; + +@Component({ + selector: 'app-time-display', + templateUrl: './time.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './time.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule] +}) +export class TimeDisplayComponent extends BaseTableDisplayFieldComponent implements OnInit { + static type = 'time'; + + public formattedTime: string; + + ngOnInit(): void { + if (this.value) { + try { + if (this.value.includes(':')) { + // Handle time string format + this.formattedTime = this.value; + } else { + const date = new Date(this.value); + if (!isNaN(date.getTime())) { + this.formattedTime = format(date, 'HH:mm:ss'); + } else { + this.formattedTime = this.value; + } + } + } catch (error) { + this.formattedTime = this.value; + } + } + } +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/url/url.component.css b/frontend/src/app/components/ui-components/table-display-fields/url/url.component.css new file mode 100644 index 000000000..78c2d730a --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/url/url.component.css @@ -0,0 +1,14 @@ +.url-link { + display: flex; + align-items: center; + gap: 4px; + color: var(--color-primaryPalette-500); +} + +.url-link__icon { + flex-shrink: 0; + margin-bottom: -2px; + width: 16px; + height: 16px; + font-size: 16px; +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/url/url.component.html b/frontend/src/app/components/ui-components/table-display-fields/url/url.component.html new file mode 100644 index 000000000..f2f92fa5d --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/url/url.component.html @@ -0,0 +1,20 @@ +
+ + + link + {{value || 'โ€”'}} + + {{value || 'โ€”'}} + + +
diff --git a/frontend/src/app/components/ui-components/table-display-fields/url/url.component.ts b/frontend/src/app/components/ui-components/table-display-fields/url/url.component.ts new file mode 100644 index 000000000..730d43e06 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/url/url.component.ts @@ -0,0 +1,27 @@ +import { BaseTableDisplayFieldComponent } from '../base-table-display-field/base-table-display-field.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-url-display', + templateUrl: './url.component.html', + styleUrls: ['../base-table-display-field/base-table-display-field.component.css', './url.component.css'], + imports: [ClipboardModule, MatIconModule, MatButtonModule, MatTooltipModule, CommonModule] +}) +export class UrlDisplayComponent extends BaseTableDisplayFieldComponent { + static type = 'url'; + + get isValidUrl(): boolean { + if (!this.value) return false; + try { + new URL(this.value); + return true; + } catch { + return false; + } + } +} diff --git a/frontend/src/app/components/ui-components/table-fields-display/base-table-field-display/base-table-field-display.component.css b/frontend/src/app/components/ui-components/table-fields-display/base-table-field-display/base-table-field-display.component.css new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/base-table-field-display/base-table-field-display.component.html b/frontend/src/app/components/ui-components/table-fields-display/base-table-field-display/base-table-field-display.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/base-table-field-display/base-table-field-display.component.ts b/frontend/src/app/components/ui-components/table-fields-display/base-table-field-display/base-table-field-display.component.ts new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/boolean/boolean.component.css b/frontend/src/app/components/ui-components/table-fields-display/boolean/boolean.component.css new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/boolean/boolean.component.html b/frontend/src/app/components/ui-components/table-fields-display/boolean/boolean.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/boolean/boolean.component.ts b/frontend/src/app/components/ui-components/table-fields-display/boolean/boolean.component.ts new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/foreign-key/foreign-key.component.css b/frontend/src/app/components/ui-components/table-fields-display/foreign-key/foreign-key.component.css new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/foreign-key/foreign-key.component.html b/frontend/src/app/components/ui-components/table-fields-display/foreign-key/foreign-key.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/foreign-key/foreign-key.component.ts b/frontend/src/app/components/ui-components/table-fields-display/foreign-key/foreign-key.component.ts new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/id/id.component.css b/frontend/src/app/components/ui-components/table-fields-display/id/id.component.css new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/id/id.component.html b/frontend/src/app/components/ui-components/table-fields-display/id/id.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/id/id.component.ts b/frontend/src/app/components/ui-components/table-fields-display/id/id.component.ts new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/index.ts b/frontend/src/app/components/ui-components/table-fields-display/index.ts new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/long-text/long-text.component.css b/frontend/src/app/components/ui-components/table-fields-display/long-text/long-text.component.css new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/long-text/long-text.component.html b/frontend/src/app/components/ui-components/table-fields-display/long-text/long-text.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/long-text/long-text.component.ts b/frontend/src/app/components/ui-components/table-fields-display/long-text/long-text.component.ts new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/text/text.component.css b/frontend/src/app/components/ui-components/table-fields-display/text/text.component.css new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/text/text.component.html b/frontend/src/app/components/ui-components/table-fields-display/text/text.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/ui-components/table-fields-display/text/text.component.ts b/frontend/src/app/components/ui-components/table-fields-display/text/text.component.ts new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/consts/currencies.ts b/frontend/src/app/consts/currencies.ts new file mode 100644 index 000000000..5b48192f2 --- /dev/null +++ b/frontend/src/app/consts/currencies.ts @@ -0,0 +1,56 @@ +export interface Money { + code: string; + name: string; + symbol: string; + flag?: string; +} + +export interface MoneyValue { + amount: number | string; + currency: string; +} + +export const CURRENCIES: Money[] = [ + { code: 'USD', name: 'US Dollar', symbol: '$', flag: '๐Ÿ‡บ๐Ÿ‡ธ' }, + { code: 'EUR', name: 'Euro', symbol: 'โ‚ฌ', flag: '๐Ÿ‡ช๐Ÿ‡บ' }, + { code: 'GBP', name: 'British Pound', symbol: 'ยฃ', flag: '๐Ÿ‡ฌ๐Ÿ‡ง' }, + { code: 'JPY', name: 'Japanese Yen', symbol: 'ยฅ', flag: '๐Ÿ‡ฏ๐Ÿ‡ต' }, + { code: 'CHF', name: 'Swiss Franc', symbol: 'CHF', flag: '๐Ÿ‡จ๐Ÿ‡ญ' }, + { code: 'CAD', name: 'Canadian Dollar', symbol: 'C$', flag: '๐Ÿ‡จ๐Ÿ‡ฆ' }, + { code: 'AUD', name: 'Australian Dollar', symbol: 'A$', flag: '๐Ÿ‡ฆ๐Ÿ‡บ' }, + { code: 'CNY', name: 'Chinese Yuan', symbol: 'ยฅ', flag: '๐Ÿ‡จ๐Ÿ‡ณ' }, + { code: 'INR', name: 'Indian Rupee', symbol: 'โ‚น', flag: '๐Ÿ‡ฎ๐Ÿ‡ณ' }, + { code: 'KRW', name: 'South Korean Won', symbol: 'โ‚ฉ', flag: '๐Ÿ‡ฐ๐Ÿ‡ท' }, + { code: 'SGD', name: 'Singapore Dollar', symbol: 'S$', flag: '๐Ÿ‡ธ๐Ÿ‡ฌ' }, + { code: 'HKD', name: 'Hong Kong Dollar', symbol: 'HK$', flag: '๐Ÿ‡ญ๐Ÿ‡ฐ' }, + { code: 'NOK', name: 'Norwegian Krone', symbol: 'kr', flag: '๐Ÿ‡ณ๐Ÿ‡ด' }, + { code: 'SEK', name: 'Swedish Krona', symbol: 'kr', flag: '๐Ÿ‡ธ๐Ÿ‡ช' }, + { code: 'DKK', name: 'Danish Krone', symbol: 'kr', flag: '๐Ÿ‡ฉ๐Ÿ‡ฐ' }, + { code: 'PLN', name: 'Polish Zloty', symbol: 'zล‚', flag: '๐Ÿ‡ต๐Ÿ‡ฑ' }, + { code: 'CZK', name: 'Czech Koruna', symbol: 'Kฤ', flag: '๐Ÿ‡จ๐Ÿ‡ฟ' }, + { code: 'HUF', name: 'Hungarian Forint', symbol: 'Ft', flag: '๐Ÿ‡ญ๐Ÿ‡บ' }, + { code: 'RUB', name: 'Russian Ruble', symbol: 'โ‚ฝ', flag: '๐Ÿ‡ท๐Ÿ‡บ' }, + { code: 'BRL', name: 'Brazilian Real', symbol: 'R$', flag: '๐Ÿ‡ง๐Ÿ‡ท' }, + { code: 'MXN', name: 'Mexican Peso', symbol: '$', flag: '๐Ÿ‡ฒ๐Ÿ‡ฝ' }, + { code: 'ZAR', name: 'South African Rand', symbol: 'R', flag: '๐Ÿ‡ฟ๐Ÿ‡ฆ' }, + { code: 'TRY', name: 'Turkish Lira', symbol: 'โ‚บ', flag: '๐Ÿ‡น๐Ÿ‡ท' }, + { code: 'AED', name: 'UAE Dirham', symbol: 'ุฏ.ุฅ', flag: '๐Ÿ‡ฆ๐Ÿ‡ช' }, + { code: 'SAR', name: 'Saudi Riyal', symbol: '๏ทผ', flag: '๐Ÿ‡ธ๐Ÿ‡ฆ' }, + { code: 'ILS', name: 'Israeli Shekel', symbol: 'โ‚ช', flag: '๐Ÿ‡ฎ๐Ÿ‡ฑ' }, + { code: 'EGP', name: 'Egyptian Pound', symbol: 'ยฃ', flag: '๐Ÿ‡ช๐Ÿ‡ฌ' }, + { code: 'THB', name: 'Thai Baht', symbol: 'เธฟ', flag: '๐Ÿ‡น๐Ÿ‡ญ' }, + { code: 'MYR', name: 'Malaysian Ringgit', symbol: 'RM', flag: '๐Ÿ‡ฒ๐Ÿ‡พ' }, + { code: 'IDR', name: 'Indonesian Rupiah', symbol: 'Rp', flag: '๐Ÿ‡ฎ๐Ÿ‡ฉ' }, + { code: 'PHP', name: 'Philippine Peso', symbol: 'โ‚ฑ', flag: '๐Ÿ‡ต๐Ÿ‡ญ' }, + { code: 'VND', name: 'Vietnamese Dong', symbol: 'โ‚ซ', flag: '๐Ÿ‡ป๐Ÿ‡ณ' }, + { code: 'UAH', name: 'Ukrainian Hryvnia', symbol: 'โ‚ด', flag: '๐Ÿ‡บ๐Ÿ‡ฆ' } +]; + +export function getCurrencyByCode(code: string): Money | undefined { + return CURRENCIES.find(currency => currency.code === code); +} + +export function getCurrencySymbol(code: string): string { + const currency = getCurrencyByCode(code); + return currency ? currency.symbol : ''; +} diff --git a/frontend/src/app/consts/field-types.ts b/frontend/src/app/consts/field-types.ts deleted file mode 100644 index 2964547fb..000000000 --- a/frontend/src/app/consts/field-types.ts +++ /dev/null @@ -1,276 +0,0 @@ -import { BinaryDataCaptionRowComponent } from '../components/ui-components/row-fields/binary-data-caption/binary-data-caption.component'; -import { BooleanRowComponent } from 'src/app/components/ui-components/row-fields/boolean/boolean.component' -import { CodeRowComponent } from '../components/ui-components/row-fields/code/code.component'; -import { CountryRowComponent } from '../components/ui-components/row-fields/country/country.component'; -import { DateRowComponent } from '../components/ui-components/row-fields/date/date.component'; -import { DateTimeRowComponent } from '../components/ui-components/row-fields/date-time/date-time.component'; -import { FileRowComponent } from '../components/ui-components/row-fields/file/file.component'; -import { ForeignKeyRowComponent } from '../components/ui-components/row-fields/foreign-key/foreign-key.component'; -import { IdRowComponent } from '../components/ui-components/row-fields/id/id.component'; -import { ImageRowComponent } from '../components/ui-components/row-fields/image/image.component'; -import { JsonEditorRowComponent } from '../components/ui-components/row-fields/json-editor/json-editor.component'; -import { LongTextRowComponent } from 'src/app/components/ui-components/row-fields/long-text/long-text.component' -import { MoneyRowComponent } from '../components/ui-components/row-fields/money/money.component'; -import { NumberRowComponent } from 'src/app/components/ui-components/row-fields/number/number.component'; -import { PasswordRowComponent } from '../components/ui-components/row-fields/password/password.component'; -import { PhoneRowComponent } from '../components/ui-components/row-fields/phone/phone.component'; -import { PointRowComponent } from 'src/app/components/ui-components/row-fields/point/point.component'; -import { SelectRowComponent } from '../components/ui-components/row-fields/select/select.component'; -import { StaticTextRowComponent } from '../components/ui-components/row-fields/static-text/static-text.component'; -import { TextRowComponent } from 'src/app/components/ui-components/row-fields/text/text.component'; -import { TimeIntervalRowComponent } from '../components/ui-components/row-fields/time-interval/time-interval.component'; -import { TimeRowComponent } from '../components/ui-components/row-fields/time/time.component'; -import { UrlRowComponent } from '../components/ui-components/row-fields/url/url.component'; - -export const timestampTypes = ['timestamp without time zone', 'timestamp with time zone', 'timestamp', 'date', 'time without time zone', 'time with time zone' , 'time', 'datetime', 'date time', 'datetime2', 'datetimeoffset', 'curdate', 'curtime', 'now', 'localtime', 'localtimestamp']; -export const defaultTimestampValues = { - postgres: ['current_date', 'current_time', 'current_timestamp', 'localtime', 'localtimestamp', 'now'], - mysql: ['curdate', 'curtime', 'now'], -} - -export const UIwidgets = { - Default: '', - Boolean: BooleanRowComponent, - Date: DateRowComponent, - Time: TimeRowComponent, - DateTime: DateTimeRowComponent, - JSON: JsonEditorRowComponent, - Textarea: LongTextRowComponent, - String: TextRowComponent, - Readonly: StaticTextRowComponent, - Number: NumberRowComponent, - Select: SelectRowComponent, - Password: PasswordRowComponent, - File: FileRowComponent, - Code: CodeRowComponent, - Image: ImageRowComponent, - URL: UrlRowComponent, - Country: CountryRowComponent, - Phone: PhoneRowComponent, - Money: MoneyRowComponent, - Foreign_key: ForeignKeyRowComponent, -} - -export const fieldTypes = { - postgres: { - // numbers (number) - real: NumberRowComponent, - "double precision": NumberRowComponent, - smallint: NumberRowComponent, - integer: NumberRowComponent, - bigint: NumberRowComponent, - numeric: NumberRowComponent, - - //boolean (checkbox) - boolean: BooleanRowComponent, - - //datetime (datepicker) - "timestamp without time zone": DateTimeRowComponent, - "timestamp with time zone": DateTimeRowComponent, - "time without time zone": TimeRowComponent, - "time with time zone": TimeRowComponent, - date: DateRowComponent, - abstime: DateTimeRowComponent, - realtime: DateTimeRowComponent, - interval: TimeIntervalRowComponent, // number + select(seconds, days, weeks, years) - - // short text (text) - "character varying": TextRowComponent, - macaddr: TextRowComponent, //to do regexp - macaddr8: TextRowComponent, //to do regexp - cidr: TextRowComponent, //to do regexp - inet: TextRowComponent, //to do regexp - uuid: TextRowComponent, //to do regexp - - //long text (textarea) - text: LongTextRowComponent, - xml: LongTextRowComponent, - - //select (select) - enum: SelectRowComponent, - - // json-editor - json: JsonEditorRowComponent, //json-editor - jsonb: JsonEditorRowComponent, //json-editor - ARRAY: JsonEditorRowComponent, - - //file - bytea: FileRowComponent, - - //etc - money: MoneyRowComponent, - - //mess (math) - point: PointRowComponent, - line: TextRowComponent, - circle: TextRowComponent, - path: TextRowComponent, - box: TextRowComponent, - lseg: TextRowComponent, - - "foreign key": ForeignKeyRowComponent - }, - - mysql: { - // numbers (number) - tinyint: NumberRowComponent, - smallint: NumberRowComponent, - mediumint: NumberRowComponent, - int: NumberRowComponent, - bigint: NumberRowComponent, - decimal: NumberRowComponent, - float: NumberRowComponent, - double: NumberRowComponent, - year: NumberRowComponent, - - //boolean (radiogroup) - boolean: BooleanRowComponent, - - //datetime (datepicker) - date: DateRowComponent, - time: TimeRowComponent, - datetime: DateTimeRowComponent, - timestamp: DateTimeRowComponent, - - // short text (text) - char: TextRowComponent, - varchar: TextRowComponent, - - //long text (textarea) - text: LongTextRowComponent, - tinytext: LongTextRowComponent, - mediumtext: LongTextRowComponent, - longtext: LongTextRowComponent, - - json: JsonEditorRowComponent, //json-editor - - //select (select) - enum: SelectRowComponent, - - //file - binary: FileRowComponent, - varbinary: FileRowComponent, - blob: FileRowComponent, - tinyblob: FileRowComponent, - mediumblob: FileRowComponent, - longblob: FileRowComponent, - - //etc - set: TextRowComponent, //(text) - - "foreign key": ForeignKeyRowComponent - }, - - oracledb: { - // numbers (number) - NUMBER: NumberRowComponent, - FLOAT: NumberRowComponent, - BINARY_FLOAT: NumberRowComponent, - BINARY_DOUBLE: NumberRowComponent, - "INTERVAL YEAR": NumberRowComponent, - "INTERVAL DAY": NumberRowComponent, - - //datetime (datepicker) - DATE: DateRowComponent, - TIMESTAMP: DateTimeRowComponent, - - // short text (text) - CHAR: TextRowComponent, - NCHAR: TextRowComponent, - CLOB: TextRowComponent, - NCLOB: TextRowComponent, - VARCHAR2: TextRowComponent, - VARCHAR: TextRowComponent, - NVARCHAR2: TextRowComponent, - - //file - BLOB: FileRowComponent, - BFILE: FileRowComponent, - RAW: FileRowComponent, - "LONG RAW" : FileRowComponent, - LONG : FileRowComponent, - - "foreign key": ForeignKeyRowComponent - }, - - mssql: { - // numbers (number) - bigint: NumberRowComponent, - int: NumberRowComponent, - smallint: NumberRowComponent, - tinyint: NumberRowComponent, - decimal: NumberRowComponent, - bitdecimal: NumberRowComponent, - numeric: NumberRowComponent, - real: NumberRowComponent, - - // short text (text) - uniqueidentifier: IdRowComponent, - char: TextRowComponent, - varchar: TextRowComponent, - - //long text (textarea) - text: LongTextRowComponent, - nchar: LongTextRowComponent, - nvarchar: LongTextRowComponent, - ntext: LongTextRowComponent, - - //datetime (datepicker) - date: DateRowComponent, - datetime: DateTimeRowComponent, - smalldatetime: DateTimeRowComponent, - timestamp: DateTimeRowComponent, - - //file - binary: FileRowComponent, - varbinary: FileRowComponent, - image: FileRowComponent, - - // etc - money: MoneyRowComponent, - smallmoney: MoneyRowComponent, - - "foreign key": ForeignKeyRowComponent - }, - mongodb: { - // numbers (number) - number: NumberRowComponent, - double: NumberRowComponent, - int32: NumberRowComponent, - long: NumberRowComponent, - decimal128: NumberRowComponent, - - //boolean (radiogroup) - boolean: BooleanRowComponent, - - //datetime (datepicker) - date: DateRowComponent, - timestamp: DateTimeRowComponent, - - // short text (text) - string: TextRowComponent, - regexp: TextRowComponent, - objectid: TextRowComponent, - - //file - binary: FileRowComponent, - - //json - object: JsonEditorRowComponent, - array: JsonEditorRowComponent, - - //etc - unknown: TextRowComponent, - - "foreign key": ForeignKeyRowComponent - }, - dynamodb: { - string: TextRowComponent, - number: NumberRowComponent, - boolean: BooleanRowComponent, - null: StaticTextRowComponent, - array: JsonEditorRowComponent, - json: JsonEditorRowComponent, - binary: FileRowComponent, - } -} \ 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 new file mode 100644 index 000000000..eb0295eed --- /dev/null +++ b/frontend/src/app/consts/record-edit-types.ts @@ -0,0 +1,276 @@ +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 { 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'; +import { FileEditComponent } from '../components/ui-components/record-edit-fields/file/file.component'; +import { ForeignKeyEditComponent } from '../components/ui-components/record-edit-fields/foreign-key/foreign-key.component'; +import { IdEditComponent } from '../components/ui-components/record-edit-fields/id/id.component'; +import { ImageEditComponent } from '../components/ui-components/record-edit-fields/image/image.component'; +import { JsonEditorEditComponent } from '../components/ui-components/record-edit-fields/json-editor/json-editor.component'; +import { LongTextEditComponent } from 'src/app/components/ui-components/record-edit-fields/long-text/long-text.component' +import { MoneyEditComponent } from '../components/ui-components/record-edit-fields/money/money.component'; +import { NumberEditComponent } from 'src/app/components/ui-components/record-edit-fields/number/number.component'; +import { PasswordEditComponent } from '../components/ui-components/record-edit-fields/password/password.component'; +import { PhoneEditComponent } from '../components/ui-components/record-edit-fields/phone/phone.component'; +import { PointEditComponent } from 'src/app/components/ui-components/record-edit-fields/point/point.component'; +import { SelectEditComponent } from '../components/ui-components/record-edit-fields/select/select.component'; +import { StaticTextEditComponent } from '../components/ui-components/record-edit-fields/static-text/static-text.component'; +import { TextEditComponent } from 'src/app/components/ui-components/record-edit-fields/text/text.component'; +import { TimeEditComponent } from '../components/ui-components/record-edit-fields/time/time.component'; +import { TimeIntervalEditComponent } from '../components/ui-components/record-edit-fields/time-interval/time-interval.component'; +import { UrlEditComponent } from '../components/ui-components/record-edit-fields/url/url.component'; + +export const timestampTypes = ['timestamp without time zone', 'timestamp with time zone', 'timestamp', 'date', 'time without time zone', 'time with time zone' , 'time', 'datetime', 'date time', 'datetime2', 'datetimeoffset', 'curdate', 'curtime', 'now', 'localtime', 'localtimestamp']; +export const defaultTimestampValues = { + postgres: ['current_date', 'current_time', 'current_timestamp', 'localtime', 'localtimestamp', 'now'], + mysql: ['curdate', 'curtime', 'now'], +} + +export const UIwidgets = { + Default: '', + Boolean: BooleanEditComponent, + Date: DateEditComponent, + Time: TimeEditComponent, + DateTime: DateTimeEditComponent, + JSON: JsonEditorEditComponent, + Textarea: LongTextEditComponent, + String: TextEditComponent, + Readonly: StaticTextEditComponent, + Number: NumberEditComponent, + Select: SelectEditComponent, + Password: PasswordEditComponent, + File: FileEditComponent, + Code: CodeEditComponent, + Image: ImageEditComponent, + URL: UrlEditComponent, + Country: CountryEditComponent, + Phone: PhoneEditComponent, + Money: MoneyEditComponent, + Foreign_key: ForeignKeyEditComponent, +} + +export const recordEditTypes = { + postgres: { + // numbers (number) + real: NumberEditComponent, + "double precision": NumberEditComponent, + smallint: NumberEditComponent, + integer: NumberEditComponent, + bigint: NumberEditComponent, + numeric: NumberEditComponent, + + //boolean (checkbox) + boolean: BooleanEditComponent, + + //datetime (datepicker) + "timestamp without time zone": DateTimeEditComponent, + "timestamp with time zone": DateTimeEditComponent, + "time without time zone": TimeEditComponent, + "time with time zone": TimeEditComponent, + date: DateEditComponent, + abstime: DateTimeEditComponent, + realtime: DateTimeEditComponent, + interval: TimeIntervalEditComponent, // number + select(seconds, days, weeks, years) + + // short text (text) + "character varying": TextEditComponent, + macaddr: TextEditComponent, //to do regexp + macaddr8: TextEditComponent, //to do regexp + cidr: TextEditComponent, //to do regexp + inet: TextEditComponent, //to do regexp + uuid: TextEditComponent, //to do regexp + + //long text (textarea) + text: LongTextEditComponent, + xml: LongTextEditComponent, + + //select (select) + enum: SelectEditComponent, + + // json-editor + json: JsonEditorEditComponent, //json-editor + jsonb: JsonEditorEditComponent, //json-editor + ARRAY: JsonEditorEditComponent, + + //file + bytea: FileEditComponent, + + //etc + money: MoneyEditComponent, + + //mess (math) + point: PointEditComponent, + line: TextEditComponent, + circle: TextEditComponent, + path: TextEditComponent, + box: TextEditComponent, + lseg: TextEditComponent, + + "foreign key": ForeignKeyEditComponent + }, + + mysql: { + // numbers (number) + tinyint: NumberEditComponent, + smallint: NumberEditComponent, + mediumint: NumberEditComponent, + int: NumberEditComponent, + bigint: NumberEditComponent, + decimal: NumberEditComponent, + float: NumberEditComponent, + double: NumberEditComponent, + year: NumberEditComponent, + + //boolean (radiogroup) + boolean: BooleanEditComponent, + + //datetime (datepicker) + date: DateEditComponent, + time: TimeEditComponent, + datetime: DateTimeEditComponent, + timestamp: DateTimeEditComponent, + + // short text (text) + char: TextEditComponent, + varchar: TextEditComponent, + + //long text (textarea) + text: LongTextEditComponent, + tinytext: LongTextEditComponent, + mediumtext: LongTextEditComponent, + longtext: LongTextEditComponent, + + json: JsonEditorEditComponent, //json-editor + + //select (select) + enum: SelectEditComponent, + + //file + binary: FileEditComponent, + varbinary: FileEditComponent, + blob: FileEditComponent, + tinyblob: FileEditComponent, + mediumblob: FileEditComponent, + longblob: FileEditComponent, + + //etc + set: TextEditComponent, //(text) + + "foreign key": ForeignKeyEditComponent + }, + + oracledb: { + // numbers (number) + NUMBER: NumberEditComponent, + FLOAT: NumberEditComponent, + BINARY_FLOAT: NumberEditComponent, + BINARY_DOUBLE: NumberEditComponent, + "INTERVAL YEAR": NumberEditComponent, + "INTERVAL DAY": NumberEditComponent, + + //datetime (datepicker) + DATE: DateEditComponent, + TIMESTAMP: DateTimeEditComponent, + + // short text (text) + CHAR: TextEditComponent, + NCHAR: TextEditComponent, + CLOB: TextEditComponent, + NCLOB: TextEditComponent, + VARCHAR2: TextEditComponent, + VARCHAR: TextEditComponent, + NVARCHAR2: TextEditComponent, + + //file + BLOB: FileEditComponent, + BFILE: FileEditComponent, + RAW: FileEditComponent, + "LONG RAW" : FileEditComponent, + LONG : FileEditComponent, + + "foreign key": ForeignKeyEditComponent + }, + + mssql: { + // numbers (number) + bigint: NumberEditComponent, + int: NumberEditComponent, + smallint: NumberEditComponent, + tinyint: NumberEditComponent, + decimal: NumberEditComponent, + bitdecimal: NumberEditComponent, + numeric: NumberEditComponent, + real: NumberEditComponent, + + // short text (text) + uniqueidentifier: IdEditComponent, + char: TextEditComponent, + varchar: TextEditComponent, + + //long text (textarea) + text: LongTextEditComponent, + nchar: LongTextEditComponent, + nvarchar: LongTextEditComponent, + ntext: LongTextEditComponent, + + //datetime (datepicker) + date: DateEditComponent, + datetime: DateTimeEditComponent, + smalldatetime: DateTimeEditComponent, + timestamp: DateTimeEditComponent, + + //file + binary: FileEditComponent, + varbinary: FileEditComponent, + image: FileEditComponent, + + // etc + money: MoneyEditComponent, + smallmoney: MoneyEditComponent, + + "foreign key": ForeignKeyEditComponent + }, + mongodb: { + // numbers (number) + number: NumberEditComponent, + double: NumberEditComponent, + int32: NumberEditComponent, + long: NumberEditComponent, + decimal128: NumberEditComponent, + + //boolean (radiogroup) + boolean: BooleanEditComponent, + + //datetime (datepicker) + date: DateEditComponent, + timestamp: DateTimeEditComponent, + + // short text (text) + string: TextEditComponent, + regexp: TextEditComponent, + objectid: TextEditComponent, + + //file + binary: FileEditComponent, + + //json + object: JsonEditorEditComponent, + array: JsonEditorEditComponent, + + //etc + unknown: TextEditComponent, + + "foreign key": ForeignKeyEditComponent + }, + dynamodb: { + string: TextEditComponent, + number: NumberEditComponent, + boolean: BooleanEditComponent, + null: StaticTextEditComponent, + array: JsonEditorEditComponent, + json: JsonEditorEditComponent, + binary: FileEditComponent, + } +} diff --git a/frontend/src/app/consts/record-view-types.ts b/frontend/src/app/consts/record-view-types.ts new file mode 100644 index 000000000..6323d1595 --- /dev/null +++ b/frontend/src/app/consts/record-view-types.ts @@ -0,0 +1,270 @@ +import { BinaryDataCaptionViewComponent } from '../components/ui-components/record-view-fields/binary-data-caption/binary-data-caption.component'; +import { BooleanViewComponent } from 'src/app/components/ui-components/record-view-fields/boolean/boolean.component' +import { CodeViewComponent } from '../components/ui-components/record-view-fields/code/code.component'; +import { CountryViewComponent } from '../components/ui-components/record-view-fields/country/country.component'; +import { DateTimeViewComponent } from '../components/ui-components/record-view-fields/date-time/date-time.component'; +import { DateViewComponent } from '../components/ui-components/record-view-fields/date/date.component'; +import { FileViewComponent } from '../components/ui-components/record-view-fields/file/file.component'; +import { ForeignKeyViewComponent } from '../components/ui-components/record-view-fields/foreign-key/foreign-key.component'; +import { IdViewComponent } from '../components/ui-components/record-view-fields/id/id.component'; +import { ImageViewComponent } from '../components/ui-components/record-view-fields/image/image.component'; +import { JsonEditorViewComponent } from '../components/ui-components/record-view-fields/json-editor/json-editor.component'; +import { LongTextViewComponent } from 'src/app/components/ui-components/record-view-fields/long-text/long-text.component' +import { MoneyViewComponent } from '../components/ui-components/record-view-fields/money/money.component'; +import { NumberViewComponent } from 'src/app/components/ui-components/record-view-fields/number/number.component'; +import { PasswordViewComponent } from '../components/ui-components/record-view-fields/password/password.component'; +import { PhoneViewComponent } from '../components/ui-components/record-view-fields/phone/phone.component'; +import { PointViewComponent } from 'src/app/components/ui-components/record-view-fields/point/point.component'; +import { SelectViewComponent } from '../components/ui-components/record-view-fields/select/select.component'; +import { StaticTextViewComponent } from '../components/ui-components/record-view-fields/static-text/static-text.component'; +import { TextViewComponent } from 'src/app/components/ui-components/record-view-fields/text/text.component'; +import { TimeIntervalViewComponent } from '../components/ui-components/record-view-fields/time-interval/time-interval.component'; +import { TimeViewComponent } from '../components/ui-components/record-view-fields/time/time.component'; +import { UrlViewComponent } from '../components/ui-components/record-view-fields/url/url.component'; + +export const UIwidgets = { + Default: '', + Boolean: BooleanViewComponent, + Date: DateViewComponent, + Time: TimeViewComponent, + DateTime: DateTimeViewComponent, + JSON: JsonEditorViewComponent, + Textarea: LongTextViewComponent, + String: TextViewComponent, + Readonly: StaticTextViewComponent, + Number: NumberViewComponent, + Select: SelectViewComponent, + Password: PasswordViewComponent, + File: FileViewComponent, + Code: CodeViewComponent, + Image: ImageViewComponent, + URL: UrlViewComponent, + Country: CountryViewComponent, + Phone: PhoneViewComponent, + Money: MoneyViewComponent, + Foreign_key: ForeignKeyViewComponent, +} + +export const recordViewTypes = { + postgres: { + // numbers (number) + real: NumberViewComponent, + "double precision": NumberViewComponent, + smallint: NumberViewComponent, + integer: NumberViewComponent, + bigint: NumberViewComponent, + numeric: NumberViewComponent, + + //boolean (checkbox) + boolean: BooleanViewComponent, + + //datetime (datepicker) + "timestamp without time zone": DateTimeViewComponent, + "timestamp with time zone": DateTimeViewComponent, + "time without time zone": TimeViewComponent, + "time with time zone": TimeViewComponent, + date: DateViewComponent, + abstime: DateTimeViewComponent, + realtime: DateTimeViewComponent, + interval: TimeIntervalViewComponent, + + // short text (text) + "character varying": TextViewComponent, + macaddr: TextViewComponent, + macaddr8: TextViewComponent, + cidr: TextViewComponent, + inet: TextViewComponent, + uuid: TextViewComponent, + + //long text (textarea) + text: LongTextViewComponent, + xml: LongTextViewComponent, + + //select (select) + enum: SelectViewComponent, + + // json-editor + json: JsonEditorViewComponent, + jsonb: JsonEditorViewComponent, + ARRAY: JsonEditorViewComponent, + + //file + bytea: FileViewComponent, + + //etc + money: MoneyViewComponent, + + //mess (math) + point: PointViewComponent, + line: TextViewComponent, + circle: TextViewComponent, + path: TextViewComponent, + box: TextViewComponent, + lseg: TextViewComponent, + + "foreign key": ForeignKeyViewComponent + }, + + mysql: { + // numbers (number) + tinyint: NumberViewComponent, + smallint: NumberViewComponent, + mediumint: NumberViewComponent, + int: NumberViewComponent, + bigint: NumberViewComponent, + decimal: NumberViewComponent, + float: NumberViewComponent, + double: NumberViewComponent, + year: NumberViewComponent, + + //boolean (radiogroup) + boolean: BooleanViewComponent, + + //datetime (datepicker) + date: DateViewComponent, + time: TimeViewComponent, + datetime: DateTimeViewComponent, + timestamp: DateTimeViewComponent, + + // short text (text) + char: TextViewComponent, + varchar: TextViewComponent, + + //long text (textarea) + text: LongTextViewComponent, + tinytext: LongTextViewComponent, + mediumtext: LongTextViewComponent, + longtext: LongTextViewComponent, + + json: JsonEditorViewComponent, //json-editor + + //select (select) + enum: SelectViewComponent, + + //file + binary: FileViewComponent, + varbinary: FileViewComponent, + blob: FileViewComponent, + tinyblob: FileViewComponent, + mediumblob: FileViewComponent, + longblob: FileViewComponent, + + //etc + set: TextViewComponent, + + "foreign key": ForeignKeyViewComponent + }, + + oracledb: { + // numbers (number) + NUMBER: NumberViewComponent, + FLOAT: NumberViewComponent, + BINARY_FLOAT: NumberViewComponent, + BINARY_DOUBLE: NumberViewComponent, + "INTERVAL YEAR": NumberViewComponent, + "INTERVAL DAY": NumberViewComponent, + + //datetime (datepicker) + DATE: DateViewComponent, + TIMESTAMP: DateTimeViewComponent, + + // short text (text) + CHAR: TextViewComponent, + NCHAR: TextViewComponent, + CLOB: TextViewComponent, + NCLOB: TextViewComponent, + VARCHAR2: TextViewComponent, + VARCHAR: TextViewComponent, + NVARCHAR2: TextViewComponent, + + //file + BLOB: FileViewComponent, + BFILE: FileViewComponent, + RAW: FileViewComponent, + "LONG RAW": FileViewComponent, + LONG: FileViewComponent, + + "foreign key": ForeignKeyViewComponent + }, + + mssql: { + // numbers (number) + bigint: NumberViewComponent, + int: NumberViewComponent, + smallint: NumberViewComponent, + tinyint: NumberViewComponent, + decimal: NumberViewComponent, + bitdecimal: NumberViewComponent, + numeric: NumberViewComponent, + real: NumberViewComponent, + + // short text (text) + uniqueidentifier: IdViewComponent, + char: TextViewComponent, + varchar: TextViewComponent, + + //long text (textarea) + text: LongTextViewComponent, + nchar: LongTextViewComponent, + nvarchar: LongTextViewComponent, + ntext: LongTextViewComponent, + + //datetime (datepicker) + date: DateViewComponent, + datetime: DateTimeViewComponent, + smalldatetime: DateTimeViewComponent, + timestamp: DateTimeViewComponent, + + //file + binary: FileViewComponent, + varbinary: FileViewComponent, + image: ImageViewComponent, + + // etc + money: MoneyViewComponent, + smallmoney: MoneyViewComponent, + + "foreign key": ForeignKeyViewComponent + }, + mongodb: { + // numbers (number) + number: NumberViewComponent, + double: NumberViewComponent, + int32: NumberViewComponent, + long: NumberViewComponent, + decimal128: NumberViewComponent, + + //boolean (radiogroup) + boolean: BooleanViewComponent, + + //datetime (datepicker) + date: DateViewComponent, + timestamp: DateTimeViewComponent, + + // short text (text) + string: TextViewComponent, + regexp: TextViewComponent, + objectid: TextViewComponent, + + //file + binary: FileViewComponent, + + //json + object: JsonEditorViewComponent, + array: JsonEditorViewComponent, + + //etc + unknown: TextViewComponent, + + "foreign key": ForeignKeyViewComponent + }, + dynamodb: { + string: TextViewComponent, + number: NumberViewComponent, + boolean: BooleanViewComponent, + null: StaticTextViewComponent, + array: JsonEditorViewComponent, + json: JsonEditorViewComponent, + binary: FileViewComponent, + } +} diff --git a/frontend/src/app/consts/table-display-types.ts b/frontend/src/app/consts/table-display-types.ts new file mode 100644 index 000000000..9513fefb3 --- /dev/null +++ b/frontend/src/app/consts/table-display-types.ts @@ -0,0 +1,269 @@ +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 { 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'; +import { FileDisplayComponent } from '../components/ui-components/table-display-fields/file/file.component'; +import { ForeignKeyDisplayComponent } from '../components/ui-components/table-display-fields/foreign-key/foreign-key.component'; +import { IdDisplayComponent } from '../components/ui-components/table-display-fields/id/id.component'; +import { ImageDisplayComponent } from '../components/ui-components/table-display-fields/image/image.component'; +import { JsonEditorDisplayComponent } from '../components/ui-components/table-display-fields/json-editor/json-editor.component'; +import { LongTextDisplayComponent } from 'src/app/components/ui-components/table-display-fields/long-text/long-text.component'; +import { MoneyDisplayComponent } from '../components/ui-components/table-display-fields/money/money.component'; +import { NumberDisplayComponent } from '../components/ui-components/table-display-fields/number/number.component'; +import { PasswordDisplayComponent } from '../components/ui-components/table-display-fields/password/password.component'; +import { PhoneDisplayComponent } from '../components/ui-components/table-display-fields/phone/phone.component'; +import { PointDisplayComponent } from '../components/ui-components/table-display-fields/point/point.component'; +import { SelectDisplayComponent } from '../components/ui-components/table-display-fields/select/select.component'; +import { StaticTextDisplayComponent } from '../components/ui-components/table-display-fields/static-text/static-text.component'; +import { TextDisplayComponent } from 'src/app/components/ui-components/table-display-fields/text/text.component'; +import { TimeDisplayComponent } from '../components/ui-components/table-display-fields/time/time.component'; +import { TimeIntervalDisplayComponent } from '../components/ui-components/table-display-fields/time-interval/time-interval.component'; +import { UrlDisplayComponent } from '../components/ui-components/table-display-fields/url/url.component'; + +export const UIwidgets = { + Default: '', + Boolean: BooleanDisplayComponent, + Date: DateDisplayComponent, + Time: TimeDisplayComponent, + DateTime: DateTimeDisplayComponent, + JSON: JsonEditorDisplayComponent, + Textarea: LongTextDisplayComponent, + String: TextDisplayComponent, + Readonly: StaticTextDisplayComponent, + Number: NumberDisplayComponent, + Select: SelectDisplayComponent, + Password: PasswordDisplayComponent, + File: FileDisplayComponent, + Code: CodeDisplayComponent, + Image: ImageDisplayComponent, + URL: UrlDisplayComponent, + Country: CountryDisplayComponent, + Phone: PhoneDisplayComponent, + Money: MoneyDisplayComponent, + Foreign_key: ForeignKeyDisplayComponent, +} + +export const tableDisplayTypes = { + postgres: { + // numbers (number) + real: NumberDisplayComponent, + "double precision": NumberDisplayComponent, + smallint: NumberDisplayComponent, + integer: NumberDisplayComponent, + bigint: NumberDisplayComponent, + numeric: NumberDisplayComponent, + + //boolean (checkbox) + boolean: BooleanDisplayComponent, + + //datetime (datepicker) + "timestamp without time zone": DateTimeDisplayComponent, + "timestamp with time zone": DateTimeDisplayComponent, + "time without time zone": TimeDisplayComponent, + "time with time zone": TimeDisplayComponent, + date: DateDisplayComponent, + abstime: DateTimeDisplayComponent, + realtime: DateTimeDisplayComponent, + interval: TimeIntervalDisplayComponent, + + // short text (text) + "character varying": TextDisplayComponent, + macaddr: TextDisplayComponent, + macaddr8: TextDisplayComponent, + cidr: TextDisplayComponent, + inet: TextDisplayComponent, + uuid: TextDisplayComponent, + + //long text (textarea) + text: LongTextDisplayComponent, + xml: LongTextDisplayComponent, + + //select (select) + enum: SelectDisplayComponent, + + // json-editor + json: JsonEditorDisplayComponent, + jsonb: JsonEditorDisplayComponent, + ARRAY: JsonEditorDisplayComponent, + + //file + bytea: FileDisplayComponent, + + //etc + money: MoneyDisplayComponent, + + //mess (math) + point: PointDisplayComponent, + line: TextDisplayComponent, + circle: TextDisplayComponent, + path: TextDisplayComponent, + box: TextDisplayComponent, + lseg: TextDisplayComponent, + + "foreign key": ForeignKeyDisplayComponent + }, + + mysql: { + // numbers (number) + tinyint: NumberDisplayComponent, + smallint: NumberDisplayComponent, + mediumint: NumberDisplayComponent, + int: NumberDisplayComponent, + bigint: NumberDisplayComponent, + decimal: NumberDisplayComponent, + float: NumberDisplayComponent, + double: NumberDisplayComponent, + year: NumberDisplayComponent, + + //boolean (radiogroup) + boolean: BooleanDisplayComponent, + + //datetime (datepicker) + date: DateDisplayComponent, + time: TimeDisplayComponent, + datetime: DateTimeDisplayComponent, + timestamp: DateTimeDisplayComponent, + + // short text (text) + char: TextDisplayComponent, + varchar: TextDisplayComponent, + + //long text (textarea) + text: LongTextDisplayComponent, + tinytext: LongTextDisplayComponent, + mediumtext: LongTextDisplayComponent, + longtext: LongTextDisplayComponent, + + json: JsonEditorDisplayComponent, //json-editor + + //select (select) + enum: SelectDisplayComponent, + + //file + binary: FileDisplayComponent, + varbinary: FileDisplayComponent, + blob: FileDisplayComponent, + tinyblob: FileDisplayComponent, + mediumblob: FileDisplayComponent, + longblob: FileDisplayComponent, + + //etc + set: TextDisplayComponent, + + "foreign key": ForeignKeyDisplayComponent + }, + + oracledb: { + // numbers (number) + NUMBER: NumberDisplayComponent, + FLOAT: NumberDisplayComponent, + BINARY_FLOAT: NumberDisplayComponent, + BINARY_DOUBLE: NumberDisplayComponent, + "INTERVAL YEAR": NumberDisplayComponent, + "INTERVAL DAY": NumberDisplayComponent, + + //datetime (datepicker) + DATE: DateDisplayComponent, + TIMESTAMP: DateTimeDisplayComponent, + + // short text (text) + CHAR: TextDisplayComponent, + NCHAR: TextDisplayComponent, + CLOB: TextDisplayComponent, + NCLOB: TextDisplayComponent, + VARCHAR2: TextDisplayComponent, + VARCHAR: TextDisplayComponent, + NVARCHAR2: TextDisplayComponent, + + //file + BLOB: FileDisplayComponent, + BFILE: FileDisplayComponent, + RAW: FileDisplayComponent, + "LONG RAW": FileDisplayComponent, + LONG: FileDisplayComponent, + + "foreign key": ForeignKeyDisplayComponent + }, + + mssql: { + // numbers (number) + bigint: NumberDisplayComponent, + int: NumberDisplayComponent, + smallint: NumberDisplayComponent, + tinyint: NumberDisplayComponent, + decimal: NumberDisplayComponent, + bitdecimal: NumberDisplayComponent, + numeric: NumberDisplayComponent, + real: NumberDisplayComponent, + + // short text (text) + uniqueidentifier: IdDisplayComponent, + char: TextDisplayComponent, + varchar: TextDisplayComponent, + + //long text (textarea) + text: LongTextDisplayComponent, + nchar: LongTextDisplayComponent, + nvarchar: LongTextDisplayComponent, + ntext: LongTextDisplayComponent, + + //datetime (datepicker) + date: DateDisplayComponent, + datetime: DateTimeDisplayComponent, + smalldatetime: DateTimeDisplayComponent, + timestamp: DateTimeDisplayComponent, + + //file + binary: FileDisplayComponent, + varbinary: FileDisplayComponent, + image: ImageDisplayComponent, + + // etc + money: MoneyDisplayComponent, + smallmoney: MoneyDisplayComponent, + + "foreign key": ForeignKeyDisplayComponent + }, + mongodb: { + // numbers (number) + number: NumberDisplayComponent, + double: NumberDisplayComponent, + int32: NumberDisplayComponent, + long: NumberDisplayComponent, + decimal128: NumberDisplayComponent, + + //boolean (radiogroup) + boolean: BooleanDisplayComponent, + + //datetime (datepicker) + date: DateDisplayComponent, + timestamp: DateTimeDisplayComponent, + + // short text (text) + string: TextDisplayComponent, + regexp: TextDisplayComponent, + objectid: TextDisplayComponent, + + //file + binary: FileDisplayComponent, + + //json + object: JsonEditorDisplayComponent, + array: JsonEditorDisplayComponent, + + //etc + unknown: TextDisplayComponent, + + "foreign key": ForeignKeyDisplayComponent + }, + dynamodb: { + string: TextDisplayComponent, + number: NumberDisplayComponent, + boolean: BooleanDisplayComponent, + null: StaticTextDisplayComponent, + array: JsonEditorDisplayComponent, + json: JsonEditorDisplayComponent, + binary: FileDisplayComponent, + } +} diff --git a/frontend/src/app/lib/format-field-value.ts b/frontend/src/app/lib/format-field-value.ts index 068ef15d5..0d652b513 100644 --- a/frontend/src/app/lib/format-field-value.ts +++ b/frontend/src/app/lib/format-field-value.ts @@ -19,8 +19,8 @@ export function formatFieldValue(value, type) { const datetimeValue = new Date(value); return format(datetimeValue, "P p") } else if (type === 'boolean') { - if (value || value === 1) return 'โœ“' - else if (value === false || value === 0) return 'โœ•' + if (value || value === 1) return true + else if (value === false || value === 0) return false else return 'โ€”' } else if (type === 'json' || type === 'jsonb' || type === 'object' || type === 'array' || type === 'interval') { return JSON.stringify(value) diff --git a/frontend/src/app/lib/setup-table-row-structure.ts b/frontend/src/app/lib/setup-table-row-structure.ts index f9fd5c291..860817ffb 100644 --- a/frontend/src/app/lib/setup-table-row-structure.ts +++ b/frontend/src/app/lib/setup-table-row-structure.ts @@ -1,7 +1,10 @@ import { TableField } from '../models/table'; export function getTableTypes(structure: TableField[], foreignKeysList: string[]) { - console.log(foreignKeysList); + if (!structure || !Array.isArray(structure) || structure.length === 0) { + return {}; + } + const tableTypes = Object.assign({}, ...structure.map((field: TableField) => { if (field.data_type === 'tinyint' && field.character_maximum_length === 1 ) return {[field.column_name]: 'boolean'}