diff --git a/frontend/.gitignore b/frontend/.gitignore index de1b3d215..0856c9413 100755 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -94,6 +94,7 @@ dist/ # Storybook build outputs .out .storybook-out +storybook-static/ # vuepress build output .vuepress/dist diff --git a/frontend/.storybook/main.ts b/frontend/.storybook/main.ts new file mode 100644 index 000000000..0b454941e --- /dev/null +++ b/frontend/.storybook/main.ts @@ -0,0 +1,9 @@ +import type { StorybookConfig } from '@storybook/angular'; + +const config: StorybookConfig = { + stories: ['../src/**/*.stories.@(ts)'], + addons: [], + framework: '@storybook/angular', +}; + +export default config; diff --git a/frontend/.storybook/preview.ts b/frontend/.storybook/preview.ts new file mode 100644 index 000000000..d57055f8b --- /dev/null +++ b/frontend/.storybook/preview.ts @@ -0,0 +1,15 @@ +import { provideHttpClient } from '@angular/common/http'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { provideRouter } from '@angular/router'; +import type { Preview } from '@storybook/angular'; +import { applicationConfig } from '@storybook/angular'; + +const preview: Preview = { + decorators: [ + applicationConfig({ + providers: [provideAnimations(), provideHttpClient(), provideRouter([])], + }), + ], +}; + +export default preview; diff --git a/frontend/.storybook/tsconfig.json b/frontend/.storybook/tsconfig.json new file mode 100644 index 000000000..7edddc8ac --- /dev/null +++ b/frontend/.storybook/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": ["node"] + }, + "include": ["../src/**/*.stories.ts", "../src/**/*.d.ts", "../src/polyfills.ts", "./preview.ts", "./main.ts"] +} diff --git a/frontend/angular.json b/frontend/angular.json index 9799792b3..bf4ae783b 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -173,6 +173,50 @@ "tsConfig": ["tsconfig.app.json", "tsconfig.spec.json", "e2e/tsconfig.json"], "exclude": ["**/node_modules/**"] } + }, + "storybook": { + "builder": "@storybook/angular:start-storybook", + "options": { + "compodoc": false, + "configDir": ".storybook", + "browserTarget": "rocketadmin:build", + "port": 6006, + "styles": [ + "node_modules/@fontsource/noto-sans/300.css", + "node_modules/@fontsource/noto-sans/400.css", + "node_modules/@fontsource/noto-sans/500.css", + "node_modules/@fontsource/ibm-plex-mono/400.css", + "node_modules/@fontsource/ibm-plex-mono/500.css", + "node_modules/@material-symbols/font-400/outlined.css", + "src/custom-theme.scss", + "src/styles.scss" + ], + "stylePreprocessorOptions": { + "includePaths": ["node_modules/@brumeilde/ngx-theme/presets/material"] + } + } + }, + "build-storybook": { + "builder": "@storybook/angular:build-storybook", + "options": { + "compodoc": false, + "configDir": ".storybook", + "browserTarget": "rocketadmin:build", + "outputDir": "storybook-static", + "styles": [ + "node_modules/@fontsource/noto-sans/300.css", + "node_modules/@fontsource/noto-sans/400.css", + "node_modules/@fontsource/noto-sans/500.css", + "node_modules/@fontsource/ibm-plex-mono/400.css", + "node_modules/@fontsource/ibm-plex-mono/500.css", + "node_modules/@material-symbols/font-400/outlined.css", + "src/custom-theme.scss", + "src/styles.scss" + ], + "stylePreprocessorOptions": { + "includePaths": ["node_modules/@brumeilde/ngx-theme/presets/material"] + } + } } } } diff --git a/frontend/package.json b/frontend/package.json index 25aa239c3..10c6212b8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,7 +11,9 @@ "e2e": "ng e2e", "analyze": "webpack-bundle-analyzer dist/rocketadmin/stats.json", "build:stats": "node scripts/update-version.js && ng build --stats-json", - "update-version": "node scripts/update-version.js" + "update-version": "node scripts/update-version.js", + "storybook": "ng run rocketadmin:storybook", + "storybook:build": "ng run rocketadmin:build-storybook" }, "private": true, "dependencies": { @@ -78,16 +80,19 @@ "@angular/compiler-cli": "~20.3.16", "@angular/language-service": "~20.3.16", "@sentry-internal/rrweb": "^2.16.0", + "@storybook/angular": "^10.2.14", "@types/node": "^22.10.2", "@vitest/browser": "^3.1.1", "jsdom": "^27.4.0", "playwright": "^1.57.0", + "storybook": "^10.2.14", "ts-node": "~10.9.2", "typescript": "~5.9.3", "vitest": "^3.1.1" }, "resolutions": { - "mermaid": "^11.10.0" + "mermaid": "^11.10.0", + "webpack": "5.104.1" }, "packageManager": "yarn@1.22.22" } diff --git a/frontend/src/app/components/company/invite-member-dialog/invite-member-dialog.component.stories.ts b/frontend/src/app/components/company/invite-member-dialog/invite-member-dialog.component.stories.ts new file mode 100644 index 000000000..e332b9c11 --- /dev/null +++ b/frontend/src/app/components/company/invite-member-dialog/invite-member-dialog.component.stories.ts @@ -0,0 +1,54 @@ +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { Angulartics2 } from 'angulartics2'; +import { of } from 'rxjs'; +import { CompanyService } from 'src/app/services/company.service'; +import { InviteMemberDialogComponent } from './invite-member-dialog.component'; + +const mockCompanyService: Partial = { + inviteCompanyMember: () => of(null as any), +}; + +const mockAngulartics: Partial = { + eventTrack: { next: () => {} } as any, +}; + +const meta: Meta = { + title: 'Dialogs/InviteMember', + component: InviteMemberDialogComponent, + decorators: [ + applicationConfig({ + providers: [ + { provide: MatDialogRef, useValue: { close: () => {} } }, + { + provide: MAT_DIALOG_DATA, + useValue: { + id: 'company-1', + connections: [ + { + title: 'Production DB', + isTestConnection: false, + groups: [ + { id: 'group-1', title: 'Admins' }, + { id: 'group-2', title: 'Readers' }, + ], + }, + { + title: 'Test DB', + isTestConnection: true, + groups: [{ id: 'group-3', title: 'Testers' }], + }, + ], + }, + }, + { provide: CompanyService, useValue: mockCompanyService }, + { provide: Angulartics2, useValue: mockAngulartics }, + ], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/connect-db/db-connection-delete-dialog/db-connection-delete-dialog.component.stories.ts b/frontend/src/app/components/connect-db/db-connection-delete-dialog/db-connection-delete-dialog.component.stories.ts new file mode 100644 index 000000000..5f2670692 --- /dev/null +++ b/frontend/src/app/components/connect-db/db-connection-delete-dialog/db-connection-delete-dialog.component.stories.ts @@ -0,0 +1,47 @@ +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { Router } from '@angular/router'; +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { Angulartics2 } from 'angulartics2'; +import { of } from 'rxjs'; +import { ConnectionsService } from 'src/app/services/connections.service'; +import { DbConnectionDeleteDialogComponent } from './db-connection-delete-dialog.component'; + +const mockConnectionsService: Partial = { + deleteConnection: () => of(null as any), +}; + +const mockRouter: Partial = { + navigate: () => Promise.resolve(true), +}; + +const mockAngulartics: Partial = { + eventTrack: { next: () => {} } as any, +}; + +const meta: Meta = { + title: 'Dialogs/DbConnectionDelete', + component: DbConnectionDeleteDialogComponent, + decorators: [ + applicationConfig({ + providers: [ + { provide: MatDialogRef, useValue: { close: () => {} } }, + { + provide: MAT_DIALOG_DATA, + useValue: { + id: 'conn-1', + title: 'My PostgreSQL Database', + database: 'test_db', + }, + }, + { provide: ConnectionsService, useValue: mockConnectionsService }, + { provide: Router, useValue: mockRouter }, + { provide: Angulartics2, useValue: mockAngulartics }, + ], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/connect-db/db-credentials-forms/cassandra-credentials-form/cassandra-credentials-form.component.stories.ts b/frontend/src/app/components/connect-db/db-credentials-forms/cassandra-credentials-form/cassandra-credentials-form.component.stories.ts new file mode 100644 index 000000000..1786dc5d1 --- /dev/null +++ b/frontend/src/app/components/connect-db/db-credentials-forms/cassandra-credentials-form/cassandra-credentials-form.component.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { CassandraCredentialsFormComponent } from './cassandra-credentials-form.component'; + +const mockConnection = { + id: null, + database: 'test_keyspace', + title: 'Test Cassandra Connection', + host: 'localhost', + port: '9042', + sid: null, + type: 'cassandra', + username: 'admin', + password: '', + ssh: false, + ssl: false, + cert: '', + masterEncryption: false, + azure_encryption: false, + connectionType: 'direct', + schema: '', +}; + +const meta: Meta = { + title: 'DB Credentials/Cassandra', + component: CassandraCredentialsFormComponent, + args: { + connection: mockConnection as any, + readonly: false, + submitting: false, + masterKey: '', + accessLevel: 'edit', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Readonly: Story = { + args: { + readonly: true, + }, +}; + +export const Submitting: Story = { + args: { + submitting: true, + }, +}; diff --git a/frontend/src/app/components/connect-db/db-credentials-forms/clickhouse-credentials-form/clickhouse-credentials-form.component.stories.ts b/frontend/src/app/components/connect-db/db-credentials-forms/clickhouse-credentials-form/clickhouse-credentials-form.component.stories.ts new file mode 100644 index 000000000..7bfea8e7b --- /dev/null +++ b/frontend/src/app/components/connect-db/db-credentials-forms/clickhouse-credentials-form/clickhouse-credentials-form.component.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ClickhouseCredentialsFormComponent } from './clickhouse-credentials-form.component'; + +const mockConnection = { + id: null, + database: 'default', + title: 'Test ClickHouse Connection', + host: 'localhost', + port: '8123', + sid: null, + type: 'clickhouse', + username: 'default', + password: '', + ssh: false, + ssl: false, + cert: '', + masterEncryption: false, + azure_encryption: false, + connectionType: 'direct', + schema: '', +}; + +const meta: Meta = { + title: 'DB Credentials/ClickHouse', + component: ClickhouseCredentialsFormComponent, + args: { + connection: mockConnection as any, + readonly: false, + submitting: false, + masterKey: '', + accessLevel: 'edit', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Readonly: Story = { + args: { + readonly: true, + }, +}; + +export const Submitting: Story = { + args: { + submitting: true, + }, +}; diff --git a/frontend/src/app/components/connect-db/db-credentials-forms/db2-credentials-form/db2-credentials-form.component.stories.ts b/frontend/src/app/components/connect-db/db-credentials-forms/db2-credentials-form/db2-credentials-form.component.stories.ts new file mode 100644 index 000000000..5d8c54d85 --- /dev/null +++ b/frontend/src/app/components/connect-db/db-credentials-forms/db2-credentials-form/db2-credentials-form.component.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { Db2CredentialsFormComponent } from './db2-credentials-form.component'; + +const mockConnection = { + id: null, + database: 'test_db', + title: 'Test IBM DB2 Connection', + host: 'localhost', + port: '50000', + sid: null, + type: 'ibmdb2', + username: 'admin', + password: '', + ssh: false, + ssl: false, + cert: '', + masterEncryption: false, + azure_encryption: false, + connectionType: 'direct', + schema: '', +}; + +const meta: Meta = { + title: 'DB Credentials/IBM DB2', + component: Db2CredentialsFormComponent, + args: { + connection: mockConnection as any, + readonly: false, + submitting: false, + masterKey: '', + accessLevel: 'edit', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Readonly: Story = { + args: { + readonly: true, + }, +}; + +export const Submitting: Story = { + args: { + submitting: true, + }, +}; diff --git a/frontend/src/app/components/connect-db/db-credentials-forms/dynamodb-credentials-form/dynamodb-credentials-form.component.stories.ts b/frontend/src/app/components/connect-db/db-credentials-forms/dynamodb-credentials-form/dynamodb-credentials-form.component.stories.ts new file mode 100644 index 000000000..7384fa435 --- /dev/null +++ b/frontend/src/app/components/connect-db/db-credentials-forms/dynamodb-credentials-form/dynamodb-credentials-form.component.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { DynamodbCredentialsFormComponent } from './dynamodb-credentials-form.component'; + +const mockConnection = { + id: null, + database: '', + title: 'Test DynamoDB Connection', + host: 'dynamodb.us-east-1.amazonaws.com', + port: '443', + sid: null, + type: 'dynamodb', + username: '', + password: '', + ssh: false, + ssl: false, + cert: '', + masterEncryption: false, + azure_encryption: false, + connectionType: 'direct', + schema: '', +}; + +const meta: Meta = { + title: 'DB Credentials/DynamoDB', + component: DynamodbCredentialsFormComponent, + args: { + connection: mockConnection as any, + readonly: false, + submitting: false, + masterKey: '', + accessLevel: 'edit', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Readonly: Story = { + args: { + readonly: true, + }, +}; + +export const Submitting: Story = { + args: { + submitting: true, + }, +}; diff --git a/frontend/src/app/components/connect-db/db-credentials-forms/elastic-credentials-form/elastic-credentials-form.component.stories.ts b/frontend/src/app/components/connect-db/db-credentials-forms/elastic-credentials-form/elastic-credentials-form.component.stories.ts new file mode 100644 index 000000000..1dd5444d8 --- /dev/null +++ b/frontend/src/app/components/connect-db/db-credentials-forms/elastic-credentials-form/elastic-credentials-form.component.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ElasticCredentialsFormComponent } from './elastic-credentials-form.component'; + +const mockConnection = { + id: null, + database: '', + title: 'Test Elasticsearch Connection', + host: 'localhost', + port: '9200', + sid: null, + type: 'elasticsearch', + username: 'elastic', + password: '', + ssh: false, + ssl: false, + cert: '', + masterEncryption: false, + azure_encryption: false, + connectionType: 'direct', + schema: '', +}; + +const meta: Meta = { + title: 'DB Credentials/Elasticsearch', + component: ElasticCredentialsFormComponent, + args: { + connection: mockConnection as any, + readonly: false, + submitting: false, + masterKey: '', + accessLevel: 'edit', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Readonly: Story = { + args: { + readonly: true, + }, +}; + +export const Submitting: Story = { + args: { + submitting: true, + }, +}; diff --git a/frontend/src/app/components/connect-db/db-credentials-forms/mongodb-credentials-form/mongodb-credentials-form.component.stories.ts b/frontend/src/app/components/connect-db/db-credentials-forms/mongodb-credentials-form/mongodb-credentials-form.component.stories.ts new file mode 100644 index 000000000..47aa23fd6 --- /dev/null +++ b/frontend/src/app/components/connect-db/db-credentials-forms/mongodb-credentials-form/mongodb-credentials-form.component.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { MongodbCredentialsFormComponent } from './mongodb-credentials-form.component'; + +const mockConnection = { + id: null, + database: 'test_db', + title: 'Test MongoDB Connection', + host: 'localhost', + port: '27017', + sid: null, + type: 'mongodb', + username: 'admin', + password: '', + ssh: false, + ssl: false, + cert: '', + masterEncryption: false, + azure_encryption: false, + connectionType: 'direct', + schema: '', +}; + +const meta: Meta = { + title: 'DB Credentials/MongoDB', + component: MongodbCredentialsFormComponent, + args: { + connection: mockConnection as any, + readonly: false, + submitting: false, + masterKey: '', + accessLevel: 'edit', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Readonly: Story = { + args: { + readonly: true, + }, +}; + +export const Submitting: Story = { + args: { + submitting: true, + }, +}; diff --git a/frontend/src/app/components/connect-db/db-credentials-forms/mssql-credentials-form/mssql-credentials-form.component.stories.ts b/frontend/src/app/components/connect-db/db-credentials-forms/mssql-credentials-form/mssql-credentials-form.component.stories.ts new file mode 100644 index 000000000..2bc8dc1de --- /dev/null +++ b/frontend/src/app/components/connect-db/db-credentials-forms/mssql-credentials-form/mssql-credentials-form.component.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { MssqlCredentialsFormComponent } from './mssql-credentials-form.component'; + +const mockConnection = { + id: null, + database: 'test_db', + title: 'Test MSSQL Connection', + host: 'localhost', + port: '1433', + sid: null, + type: 'mssql', + username: 'sa', + password: '', + ssh: false, + ssl: false, + cert: '', + masterEncryption: false, + azure_encryption: false, + connectionType: 'direct', + schema: 'dbo', +}; + +const meta: Meta = { + title: 'DB Credentials/MSSQL', + component: MssqlCredentialsFormComponent, + args: { + connection: mockConnection as any, + readonly: false, + submitting: false, + masterKey: '', + accessLevel: 'edit', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Readonly: Story = { + args: { + readonly: true, + }, +}; + +export const Submitting: Story = { + args: { + submitting: true, + }, +}; diff --git a/frontend/src/app/components/connect-db/db-credentials-forms/mysql-credentials-form/mysql-credentials-form.component.stories.ts b/frontend/src/app/components/connect-db/db-credentials-forms/mysql-credentials-form/mysql-credentials-form.component.stories.ts new file mode 100644 index 000000000..12bd833b3 --- /dev/null +++ b/frontend/src/app/components/connect-db/db-credentials-forms/mysql-credentials-form/mysql-credentials-form.component.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { MysqlCredentialsFormComponent } from './mysql-credentials-form.component'; + +const mockConnection = { + id: null, + database: 'test_db', + title: 'Test MySQL Connection', + host: 'localhost', + port: '3306', + sid: null, + type: 'mysql', + username: 'admin', + password: '', + ssh: false, + ssl: false, + cert: '', + masterEncryption: false, + azure_encryption: false, + connectionType: 'direct', + schema: '', +}; + +const meta: Meta = { + title: 'DB Credentials/MySQL', + component: MysqlCredentialsFormComponent, + args: { + connection: mockConnection as any, + readonly: false, + submitting: false, + masterKey: '', + accessLevel: 'edit', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Readonly: Story = { + args: { + readonly: true, + }, +}; + +export const Submitting: Story = { + args: { + submitting: true, + }, +}; diff --git a/frontend/src/app/components/connect-db/db-credentials-forms/oracledb-credentials-form/oracledb-credentials-form.component.stories.ts b/frontend/src/app/components/connect-db/db-credentials-forms/oracledb-credentials-form/oracledb-credentials-form.component.stories.ts new file mode 100644 index 000000000..13022de44 --- /dev/null +++ b/frontend/src/app/components/connect-db/db-credentials-forms/oracledb-credentials-form/oracledb-credentials-form.component.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { OracledbCredentialsFormComponent } from './oracledb-credentials-form.component'; + +const mockConnection = { + id: null, + database: 'test_db', + title: 'Test OracleDB Connection', + host: 'localhost', + port: '1521', + sid: 'ORCL', + type: 'oracledb', + username: 'admin', + password: '', + ssh: false, + ssl: false, + cert: '', + masterEncryption: false, + azure_encryption: false, + connectionType: 'direct', + schema: '', +}; + +const meta: Meta = { + title: 'DB Credentials/OracleDB', + component: OracledbCredentialsFormComponent, + args: { + connection: mockConnection as any, + readonly: false, + submitting: false, + masterKey: '', + accessLevel: 'edit', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Readonly: Story = { + args: { + readonly: true, + }, +}; + +export const Submitting: Story = { + args: { + submitting: true, + }, +}; diff --git a/frontend/src/app/components/connect-db/db-credentials-forms/postgres-credentials-form/postgres-credentials-form.component.stories.ts b/frontend/src/app/components/connect-db/db-credentials-forms/postgres-credentials-form/postgres-credentials-form.component.stories.ts new file mode 100644 index 000000000..d880207e4 --- /dev/null +++ b/frontend/src/app/components/connect-db/db-credentials-forms/postgres-credentials-form/postgres-credentials-form.component.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PostgresCredentialsFormComponent } from './postgres-credentials-form.component'; + +const mockConnection = { + id: null, + database: 'test_db', + title: 'Test PostgreSQL Connection', + host: 'localhost', + port: '5432', + sid: null, + type: 'postgres', + username: 'admin', + password: '', + ssh: false, + ssl: false, + cert: '', + masterEncryption: false, + azure_encryption: false, + connectionType: 'direct', + schema: 'public', +}; + +const meta: Meta = { + title: 'DB Credentials/PostgreSQL', + component: PostgresCredentialsFormComponent, + args: { + connection: mockConnection as any, + readonly: false, + submitting: false, + masterKey: '', + accessLevel: 'edit', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Readonly: Story = { + args: { + readonly: true, + }, +}; + +export const Submitting: Story = { + args: { + submitting: true, + }, +}; diff --git a/frontend/src/app/components/connect-db/db-credentials-forms/redis-credentials-form/redis-credentials-form.component.stories.ts b/frontend/src/app/components/connect-db/db-credentials-forms/redis-credentials-form/redis-credentials-form.component.stories.ts new file mode 100644 index 000000000..7c8030024 --- /dev/null +++ b/frontend/src/app/components/connect-db/db-credentials-forms/redis-credentials-form/redis-credentials-form.component.stories.ts @@ -0,0 +1,50 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { RedisCredentialsFormComponent } from './redis-credentials-form.component'; + +const mockConnection = { + id: null, + database: '0', + title: 'Test Redis Connection', + host: 'localhost', + port: '6379', + sid: null, + type: 'redis', + username: '', + password: '', + ssh: false, + ssl: false, + cert: '', + masterEncryption: false, + azure_encryption: false, + connectionType: 'direct', + schema: '', +}; + +const meta: Meta = { + title: 'DB Credentials/Redis', + component: RedisCredentialsFormComponent, + args: { + connection: mockConnection as any, + readonly: false, + submitting: false, + masterKey: '', + accessLevel: 'edit', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Readonly: Story = { + args: { + readonly: true, + }, +}; + +export const Submitting: Story = { + args: { + submitting: true, + }, +}; diff --git a/frontend/src/app/components/dashboards/dashboard-delete-dialog/dashboard-delete-dialog.component.stories.ts b/frontend/src/app/components/dashboards/dashboard-delete-dialog/dashboard-delete-dialog.component.stories.ts new file mode 100644 index 000000000..c15e1f2c1 --- /dev/null +++ b/frontend/src/app/components/dashboards/dashboard-delete-dialog/dashboard-delete-dialog.component.stories.ts @@ -0,0 +1,46 @@ +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { Angulartics2 } from 'angulartics2'; +import { DashboardsService } from 'src/app/services/dashboards.service'; +import { DashboardDeleteDialogComponent } from './dashboard-delete-dialog.component'; + +const mockDashboardsService: Partial = { + deleteDashboard: () => Promise.resolve(null), +}; + +const mockAngulartics: Partial = { + eventTrack: { next: () => {} } as any, +}; + +const meta: Meta = { + title: 'Dialogs/DashboardDelete', + component: DashboardDeleteDialogComponent, + decorators: [ + applicationConfig({ + providers: [ + { provide: MatDialogRef, useValue: { close: () => {} } }, + { + provide: MAT_DIALOG_DATA, + useValue: { + dashboard: { + id: 'dash-1', + name: 'Sales Dashboard', + description: 'Monthly sales metrics', + connection_id: 'conn-1', + created_at: '2024-01-01', + updated_at: '2024-01-01', + }, + connectionId: 'conn-1', + }, + }, + { provide: DashboardsService, useValue: mockDashboardsService }, + { provide: Angulartics2, useValue: mockAngulartics }, + ], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/dashboards/dashboard-edit-dialog/dashboard-edit-dialog.component.stories.ts b/frontend/src/app/components/dashboards/dashboard-edit-dialog/dashboard-edit-dialog.component.stories.ts new file mode 100644 index 000000000..16accb230 --- /dev/null +++ b/frontend/src/app/components/dashboards/dashboard-edit-dialog/dashboard-edit-dialog.component.stories.ts @@ -0,0 +1,66 @@ +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { Angulartics2 } from 'angulartics2'; +import { DashboardsService } from 'src/app/services/dashboards.service'; +import { DashboardEditDialogComponent } from './dashboard-edit-dialog.component'; + +const mockDashboardsService: Partial = { + createDashboard: () => Promise.resolve(null), + updateDashboard: () => Promise.resolve(null), +}; + +const mockAngulartics: Partial = { + eventTrack: { next: () => {} } as any, +}; + +const meta: Meta = { + title: 'Dialogs/DashboardEdit', + component: DashboardEditDialogComponent, + decorators: [ + applicationConfig({ + providers: [ + { provide: MatDialogRef, useValue: { close: () => {} } }, + { + provide: MAT_DIALOG_DATA, + useValue: { + connectionId: 'conn-1', + dashboard: null, + }, + }, + { provide: DashboardsService, useValue: mockDashboardsService }, + { provide: Angulartics2, useValue: mockAngulartics }, + ], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const CreateNew: Story = {}; + +export const EditExisting: Story = { + decorators: [ + applicationConfig({ + providers: [ + { provide: MatDialogRef, useValue: { close: () => {} } }, + { + provide: MAT_DIALOG_DATA, + useValue: { + connectionId: 'conn-1', + dashboard: { + id: 'dash-1', + name: 'Sales Dashboard', + description: 'Monthly sales metrics and KPIs', + connection_id: 'conn-1', + created_at: '2024-01-01', + updated_at: '2024-01-01', + }, + }, + }, + { provide: DashboardsService, useValue: mockDashboardsService }, + { provide: Angulartics2, useValue: mockAngulartics }, + ], + }), + ], +}; diff --git a/frontend/src/app/components/dashboards/panel-delete-dialog/panel-delete-dialog.component.stories.ts b/frontend/src/app/components/dashboards/panel-delete-dialog/panel-delete-dialog.component.stories.ts new file mode 100644 index 000000000..89def7fe3 --- /dev/null +++ b/frontend/src/app/components/dashboards/panel-delete-dialog/panel-delete-dialog.component.stories.ts @@ -0,0 +1,48 @@ +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { Angulartics2 } from 'angulartics2'; +import { DashboardsService } from 'src/app/services/dashboards.service'; +import { PanelDeleteDialogComponent } from './panel-delete-dialog.component'; + +const mockDashboardsService: Partial = { + deleteWidget: () => Promise.resolve(null), +}; + +const mockAngulartics: Partial = { + eventTrack: { next: () => {} } as any, +}; + +const meta: Meta = { + title: 'Dialogs/PanelDelete', + component: PanelDeleteDialogComponent, + decorators: [ + applicationConfig({ + providers: [ + { provide: MatDialogRef, useValue: { close: () => {} } }, + { + provide: MAT_DIALOG_DATA, + useValue: { + connectionId: 'conn-1', + dashboardId: 'dash-1', + widget: { + id: 'widget-1', + position_x: 0, + position_y: 0, + width: 4, + height: 2, + query_id: 'query-1', + dashboard_id: 'dash-1', + }, + }, + }, + { provide: DashboardsService, useValue: mockDashboardsService }, + { provide: Angulartics2, useValue: mockAngulartics }, + ], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/dashboards/panel-renderers/chart-panel/chart-panel.component.stories.ts b/frontend/src/app/components/dashboards/panel-renderers/chart-panel/chart-panel.component.stories.ts new file mode 100644 index 000000000..2a5cbaa95 --- /dev/null +++ b/frontend/src/app/components/dashboards/panel-renderers/chart-panel/chart-panel.component.stories.ts @@ -0,0 +1,78 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ChartPanelComponent } from './chart-panel.component'; + +const mockWidget = { + id: 'widget-2', + position_x: 0, + position_y: 0, + width: 6, + height: 4, + query_id: 'query-2', + dashboard_id: 'dashboard-1', +}; + +const mockQuery = { + id: 'query-2', + name: 'Monthly Revenue', + description: null, + widget_type: 'chart' as const, + chart_type: 'bar' as const, + widget_options: { + label_column: 'month', + value_column: 'revenue', + }, + query_text: 'SELECT month, revenue FROM monthly_stats', + connection_id: 'conn-1', + created_at: '2024-01-01', + updated_at: '2024-01-01', +}; + +const mockData = [ + { month: 'Jan', revenue: 12000 }, + { month: 'Feb', revenue: 15000 }, + { month: 'Mar', revenue: 18000 }, + { month: 'Apr', revenue: 14000 }, + { month: 'May', revenue: 21000 }, + { month: 'Jun', revenue: 19000 }, +]; + +const meta: Meta = { + title: 'Dashboard Panels/Chart', + component: ChartPanelComponent, + args: { + widget: mockWidget as any, + connectionId: 'conn-1', + preloadedQuery: mockQuery as any, + preloadedData: mockData, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const LineChart: Story = { + args: { + preloadedQuery: { + ...mockQuery, + chart_type: 'line', + } as any, + }, +}; + +export const PieChart: Story = { + args: { + preloadedQuery: { + ...mockQuery, + chart_type: 'pie', + } as any, + }, +}; + +export const NoData: Story = { + args: { + preloadedQuery: null, + preloadedData: [], + }, +}; diff --git a/frontend/src/app/components/dashboards/panel-renderers/counter-panel/counter-panel.component.stories.ts b/frontend/src/app/components/dashboards/panel-renderers/counter-panel/counter-panel.component.stories.ts new file mode 100644 index 000000000..b6281bd41 --- /dev/null +++ b/frontend/src/app/components/dashboards/panel-renderers/counter-panel/counter-panel.component.stories.ts @@ -0,0 +1,54 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { CounterPanelComponent } from './counter-panel.component'; + +const mockWidget = { + id: 'widget-1', + position_x: 0, + position_y: 0, + width: 4, + height: 2, + query_id: 'query-1', + dashboard_id: 'dashboard-1', +}; + +const mockQuery = { + id: 'query-1', + name: 'Total Users', + description: null, + widget_type: 'counter' as const, + chart_type: null, + widget_options: null, + query_text: 'SELECT COUNT(*) as total FROM users', + connection_id: 'conn-1', + created_at: '2024-01-01', + updated_at: '2024-01-01', +}; + +const meta: Meta = { + title: 'Dashboard Panels/Counter', + component: CounterPanelComponent, + args: { + widget: mockWidget as any, + connectionId: 'conn-1', + preloadedQuery: mockQuery as any, + preloadedData: [{ total: 1234 }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const LargeNumber: Story = { + args: { + preloadedData: [{ total: 1500000 }], + }, +}; + +export const NoData: Story = { + args: { + preloadedQuery: null, + preloadedData: [], + }, +}; diff --git a/frontend/src/app/components/dashboards/panel-renderers/dashboard-panel/dashboard-panel.component.stories.ts b/frontend/src/app/components/dashboards/panel-renderers/dashboard-panel/dashboard-panel.component.stories.ts new file mode 100644 index 000000000..1e099e6b8 --- /dev/null +++ b/frontend/src/app/components/dashboards/panel-renderers/dashboard-panel/dashboard-panel.component.stories.ts @@ -0,0 +1,64 @@ +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { SavedQueriesService } from 'src/app/services/saved-queries.service'; +import { DashboardPanelComponent } from './dashboard-panel.component'; + +const mockWidget = { + id: 'widget-5', + position_x: 0, + position_y: 0, + width: 6, + height: 4, + query_id: 'query-5', + dashboard_id: 'dashboard-1', +}; + +const mockSavedQueriesService: Partial = { + fetchSavedQuery: () => + Promise.resolve({ + id: 'query-5', + name: 'Total Users', + description: null, + widget_type: 'counter' as const, + chart_type: null, + widget_options: null, + query_text: 'SELECT COUNT(*) as total FROM users', + connection_id: 'conn-1', + created_at: '2024-01-01', + updated_at: '2024-01-01', + }), + executeSavedQuery: () => + Promise.resolve({ + query_id: 'query-5', + query_name: 'Total Users', + data: [{ total: 1234 }], + execution_time_ms: 42, + }), +}; + +const meta: Meta = { + title: 'Dashboard Panels/DashboardPanel', + component: DashboardPanelComponent, + args: { + widget: mockWidget as any, + connectionId: 'conn-1', + }, + decorators: [ + applicationConfig({ + providers: [{ provide: SavedQueriesService, useValue: mockSavedQueriesService }], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const NoQuery: Story = { + args: { + widget: { + ...mockWidget, + query_id: null, + } as any, + }, +}; diff --git a/frontend/src/app/components/dashboards/panel-renderers/table-panel/table-panel.component.stories.ts b/frontend/src/app/components/dashboards/panel-renderers/table-panel/table-panel.component.stories.ts new file mode 100644 index 000000000..252e1f23e --- /dev/null +++ b/frontend/src/app/components/dashboards/panel-renderers/table-panel/table-panel.component.stories.ts @@ -0,0 +1,56 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TablePanelComponent } from './table-panel.component'; + +const mockWidget = { + id: 'widget-3', + position_x: 0, + position_y: 0, + width: 8, + height: 4, + query_id: 'query-3', + dashboard_id: 'dashboard-1', +}; + +const mockQuery = { + id: 'query-3', + name: 'Recent Orders', + description: null, + widget_type: 'table' as const, + chart_type: null, + widget_options: null, + query_text: 'SELECT id, customer, amount, status FROM orders LIMIT 10', + connection_id: 'conn-1', + created_at: '2024-01-01', + updated_at: '2024-01-01', +}; + +const mockData = [ + { id: 1, customer: 'Alice', amount: 250.0, status: 'completed' }, + { id: 2, customer: 'Bob', amount: 120.5, status: 'pending' }, + { id: 3, customer: 'Charlie', amount: 340.0, status: 'completed' }, + { id: 4, customer: 'Diana', amount: 89.99, status: 'cancelled' }, + { id: 5, customer: 'Eve', amount: 560.0, status: 'completed' }, +]; + +const meta: Meta = { + title: 'Dashboard Panels/Table', + component: TablePanelComponent, + args: { + widget: mockWidget as any, + connectionId: 'conn-1', + preloadedQuery: mockQuery as any, + preloadedData: mockData, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const NoData: Story = { + args: { + preloadedQuery: null, + preloadedData: [], + }, +}; diff --git a/frontend/src/app/components/dashboards/panel-renderers/text-panel/text-panel.component.stories.ts b/frontend/src/app/components/dashboards/panel-renderers/text-panel/text-panel.component.stories.ts new file mode 100644 index 000000000..803d505ab --- /dev/null +++ b/frontend/src/app/components/dashboards/panel-renderers/text-panel/text-panel.component.stories.ts @@ -0,0 +1,48 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TextPanelComponent } from './text-panel.component'; + +const mockWidget = { + id: 'widget-4', + position_x: 0, + position_y: 0, + width: 4, + height: 2, + query_id: 'query-4', + dashboard_id: 'dashboard-1', +}; + +const mockQuery = { + id: 'query-4', + name: 'Dashboard Info', + description: null, + widget_type: 'text' as const, + chart_type: null, + widget_options: { + text_content: + '## Welcome\n\nThis dashboard shows key metrics for the **Q1 2024** report.\n\n- Total revenue\n- Active users\n- Order status', + }, + query_text: '', + connection_id: 'conn-1', + created_at: '2024-01-01', + updated_at: '2024-01-01', +}; + +const meta: Meta = { + title: 'Dashboard Panels/Text', + component: TextPanelComponent, + args: { + widget: mockWidget as any, + preloadedQuery: mockQuery as any, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const NoContent: Story = { + args: { + preloadedQuery: null, + }, +}; diff --git a/frontend/src/app/components/master-password-dialog/master-password-dialog.component.stories.ts b/frontend/src/app/components/master-password-dialog/master-password-dialog.component.stories.ts new file mode 100644 index 000000000..591e9d136 --- /dev/null +++ b/frontend/src/app/components/master-password-dialog/master-password-dialog.component.stories.ts @@ -0,0 +1,35 @@ +import { MatDialogRef } from '@angular/material/dialog'; +import { Router } from '@angular/router'; +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { ConnectionsService } from 'src/app/services/connections.service'; +import { MasterPasswordDialogComponent } from './master-password-dialog.component'; + +const mockConnectionsService: Partial = { + currentConnectionID: 'conn-1', +}; + +const mockRouter: Partial = { + url: '/dashboard/conn-1/tables', + navigate: () => Promise.resolve(true), + routeReuseStrategy: { shouldReuseRoute: () => true } as any, + onSameUrlNavigation: 'ignore' as const, +}; + +const meta: Meta = { + title: 'Dialogs/MasterPassword', + component: MasterPasswordDialogComponent, + decorators: [ + applicationConfig({ + providers: [ + { provide: MatDialogRef, useValue: { close: () => {} } }, + { provide: ConnectionsService, useValue: mockConnectionsService }, + { provide: Router, useValue: mockRouter }, + ], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/secrets/create-secret-dialog/create-secret-dialog.component.stories.ts b/frontend/src/app/components/secrets/create-secret-dialog/create-secret-dialog.component.stories.ts new file mode 100644 index 000000000..a2abbbdf5 --- /dev/null +++ b/frontend/src/app/components/secrets/create-secret-dialog/create-secret-dialog.component.stories.ts @@ -0,0 +1,33 @@ +import { MatDialogRef } from '@angular/material/dialog'; +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { Angulartics2 } from 'angulartics2'; +import { of } from 'rxjs'; +import { SecretsService } from 'src/app/services/secrets.service'; +import { CreateSecretDialogComponent } from './create-secret-dialog.component'; + +const mockSecretsService: Partial = { + createSecret: () => of(null as any), +}; + +const mockAngulartics: Partial = { + eventTrack: { next: () => {} } as any, +}; + +const meta: Meta = { + title: 'Dialogs/CreateSecret', + component: CreateSecretDialogComponent, + decorators: [ + applicationConfig({ + providers: [ + { provide: MatDialogRef, useValue: { close: () => {} } }, + { provide: SecretsService, useValue: mockSecretsService }, + { provide: Angulartics2, useValue: mockAngulartics }, + ], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-add-user-dialog/placeholder-add-user-dialog.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-add-user-dialog/placeholder-add-user-dialog.component.stories.ts new file mode 100644 index 000000000..976c4e01a --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-add-user-dialog/placeholder-add-user-dialog.component.stories.ts @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { PlaceholderAddUserDialogComponent } from './placeholder-add-user-dialog.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderAddUserDialog', + component: PlaceholderAddUserDialogComponent, + decorators: [ + moduleMetadata({ + declarations: [PlaceholderAddUserDialogComponent], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-api-keys-list/placeholder-api-keys-list.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-api-keys-list/placeholder-api-keys-list.component.stories.ts new file mode 100644 index 000000000..6a07aa44e --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-api-keys-list/placeholder-api-keys-list.component.stories.ts @@ -0,0 +1,12 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PlaceholderApiKeysListComponent } from './placeholder-api-keys-list.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderApiKeysList', + component: PlaceholderApiKeysListComponent, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-audit-log/placeholder-audit-log.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-audit-log/placeholder-audit-log.component.stories.ts new file mode 100644 index 000000000..61c772955 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-audit-log/placeholder-audit-log.component.stories.ts @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { PlaceholderAuditLogComponent } from './placeholder-audit-log.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderAuditLog', + component: PlaceholderAuditLogComponent, + decorators: [ + moduleMetadata({ + declarations: [PlaceholderAuditLogComponent], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-branding/placeholder-branding.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-branding/placeholder-branding.component.stories.ts new file mode 100644 index 000000000..847d57369 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-branding/placeholder-branding.component.stories.ts @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { PlaceholderBrandingComponent } from './placeholder-branding.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderBranding', + component: PlaceholderBrandingComponent, + decorators: [ + moduleMetadata({ + declarations: [PlaceholderBrandingComponent], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-company-invitation/placeholder-company-invitation.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-company-invitation/placeholder-company-invitation.component.stories.ts new file mode 100644 index 000000000..9d59b2ae5 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-company-invitation/placeholder-company-invitation.component.stories.ts @@ -0,0 +1,12 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PlaceholderCompanyInvitationComponent } from './placeholder-company-invitation.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderCompanyInvitation', + component: PlaceholderCompanyInvitationComponent, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-company/placeholder-company.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-company/placeholder-company.component.stories.ts new file mode 100644 index 000000000..413aee59d --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-company/placeholder-company.component.stories.ts @@ -0,0 +1,12 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PlaceholderCompanyComponent } from './placeholder-company.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderCompany', + component: PlaceholderCompanyComponent, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-connection-settings/placeholder-connection-settings.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-connection-settings/placeholder-connection-settings.component.stories.ts new file mode 100644 index 000000000..d0be16f07 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-connection-settings/placeholder-connection-settings.component.stories.ts @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { PlaceholderConnectionSettingsComponent } from './placeholder-connection-settings.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderConnectionSettings', + component: PlaceholderConnectionSettingsComponent, + decorators: [ + moduleMetadata({ + declarations: [PlaceholderConnectionSettingsComponent], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-connections/placeholder-connections.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-connections/placeholder-connections.component.stories.ts new file mode 100644 index 000000000..99e09da62 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-connections/placeholder-connections.component.stories.ts @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { PlaceholderConnectionsComponent } from './placeholder-connections.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderConnections', + component: PlaceholderConnectionsComponent, + decorators: [ + moduleMetadata({ + declarations: [PlaceholderConnectionsComponent], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-dashboards/placeholder-dashboards.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-dashboards/placeholder-dashboards.component.stories.ts new file mode 100644 index 000000000..5247cfd83 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-dashboards/placeholder-dashboards.component.stories.ts @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { PlaceholderDashboardsComponent } from './placeholder-dashboards.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderDashboards', + component: PlaceholderDashboardsComponent, + decorators: [ + moduleMetadata({ + declarations: [PlaceholderDashboardsComponent], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-record-view/placeholder-record-view.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-record-view/placeholder-record-view.component.stories.ts new file mode 100644 index 000000000..499f41d6c --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-record-view/placeholder-record-view.component.stories.ts @@ -0,0 +1,12 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PlaceholderRecordViewComponent } from './placeholder-record-view.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderRecordView', + component: PlaceholderRecordViewComponent, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-row-edit/placeholder-row-edit.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-row-edit/placeholder-row-edit.component.stories.ts new file mode 100644 index 000000000..c453f9f36 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-row-edit/placeholder-row-edit.component.stories.ts @@ -0,0 +1,12 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PlaceholderRowEditComponent } from './placeholder-row-edit.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderRowEdit', + component: PlaceholderRowEditComponent, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-saved-filters/placeholder-saved-filters.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-saved-filters/placeholder-saved-filters.component.stories.ts new file mode 100644 index 000000000..9b589bd42 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-saved-filters/placeholder-saved-filters.component.stories.ts @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { PlaceholderSavedFiltersComponent } from './placeholder-saved-filters.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderSavedFilters', + component: PlaceholderSavedFiltersComponent, + decorators: [ + moduleMetadata({ + declarations: [PlaceholderSavedFiltersComponent], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-sso/placeholder-sso.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-sso/placeholder-sso.component.stories.ts new file mode 100644 index 000000000..e36f9767e --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-sso/placeholder-sso.component.stories.ts @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { PlaceholderSsoComponent } from './placeholder-sso.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderSSO', + component: PlaceholderSsoComponent, + decorators: [ + moduleMetadata({ + declarations: [PlaceholderSsoComponent], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-table-data/placeholder-table-data.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-table-data/placeholder-table-data.component.stories.ts new file mode 100644 index 000000000..8a3674bf3 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-table-data/placeholder-table-data.component.stories.ts @@ -0,0 +1,12 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PlaceholderTableDataComponent } from './placeholder-table-data.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderTableData', + component: PlaceholderTableDataComponent, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-table-settings/placeholder-table-settings.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-table-settings/placeholder-table-settings.component.stories.ts new file mode 100644 index 000000000..7c101aec4 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-table-settings/placeholder-table-settings.component.stories.ts @@ -0,0 +1,12 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PlaceholderTableSettingsComponent } from './placeholder-table-settings.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderTableSettings', + component: PlaceholderTableSettingsComponent, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-table-view/placeholder-table-view.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-table-view/placeholder-table-view.component.stories.ts new file mode 100644 index 000000000..1d1c639e0 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-table-view/placeholder-table-view.component.stories.ts @@ -0,0 +1,12 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PlaceholderTableViewComponent } from './placeholder-table-view.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderTableView', + component: PlaceholderTableViewComponent, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-table-widgets/placeholder-table-widgets.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-table-widgets/placeholder-table-widgets.component.stories.ts new file mode 100644 index 000000000..f60855c30 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-table-widgets/placeholder-table-widgets.component.stories.ts @@ -0,0 +1,12 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PlaceholderTableWidgetsComponent } from './placeholder-table-widgets.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderTableWidgets', + component: PlaceholderTableWidgetsComponent, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-user-group/placeholder-user-group.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-user-group/placeholder-user-group.component.stories.ts new file mode 100644 index 000000000..3b28165c0 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-user-group/placeholder-user-group.component.stories.ts @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { PlaceholderUserGroupComponent } from './placeholder-user-group.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderUserGroup', + component: PlaceholderUserGroupComponent, + decorators: [ + moduleMetadata({ + declarations: [PlaceholderUserGroupComponent], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/skeletons/placeholder-user-groups/placeholder-user-groups.component.stories.ts b/frontend/src/app/components/skeletons/placeholder-user-groups/placeholder-user-groups.component.stories.ts new file mode 100644 index 000000000..e12910087 --- /dev/null +++ b/frontend/src/app/components/skeletons/placeholder-user-groups/placeholder-user-groups.component.stories.ts @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { PlaceholderUserGroupsComponent } from './placeholder-user-groups.component'; + +const meta: Meta = { + title: 'Skeletons/PlaceholderUserGroups', + component: PlaceholderUserGroupsComponent, + decorators: [ + moduleMetadata({ + declarations: [PlaceholderUserGroupsComponent], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/ui-components/alert/alert.stories.ts b/frontend/src/app/components/ui-components/alert/alert.stories.ts new file mode 100644 index 000000000..194d2d241 --- /dev/null +++ b/frontend/src/app/components/ui-components/alert/alert.stories.ts @@ -0,0 +1,56 @@ +import { MAT_ICON_DEFAULT_OPTIONS, MatIconDefaultOptions } from '@angular/material/icon'; +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { AlertType } from 'src/app/models/alert'; +import { NotificationsService } from 'src/app/services/notifications.service'; +import { AlertComponent } from './alert.component'; + +const meta: Meta = { + title: 'UI/Alert', + component: AlertComponent, + decorators: [ + applicationConfig({ + providers: [ + { provide: NotificationsService, useValue: { currentAlert: null } }, + { + provide: MAT_ICON_DEFAULT_OPTIONS, + useValue: { fontSet: 'material-symbols-outlined' } as MatIconDefaultOptions, + }, + ], + }), + ], + args: { + alert: { id: 1, type: AlertType.Info, message: 'This is an informational alert.' }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Info: Story = { + args: { alert: { id: 1, type: AlertType.Info, message: 'This is an informational message.' } }, +}; + +export const Warning: Story = { + args: { alert: { id: 2, type: AlertType.Warning, message: 'This is a warning message.' } }, +}; + +export const ErrorAlert: Story = { + args: { alert: { id: 3, type: AlertType.Error, message: 'An error has occurred.' } }, +}; + +export const Success: Story = { + args: { alert: { id: 4, type: AlertType.Success, message: 'Operation completed successfully.' } }, +}; + +export const ComplexMessage: Story = { + args: { + alert: { + id: 5, + type: AlertType.Error, + message: { + abstract: 'Connection failed', + details: 'Could not connect to the database. Please check your credentials and try again.', + }, + }, + }, +}; diff --git a/frontend/src/app/components/ui-components/banner/banner.stories.ts b/frontend/src/app/components/ui-components/banner/banner.stories.ts new file mode 100644 index 000000000..fd34ed570 --- /dev/null +++ b/frontend/src/app/components/ui-components/banner/banner.stories.ts @@ -0,0 +1,31 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { AlertType } from 'src/app/models/alert'; +import { BannerComponent } from './banner.component'; + +const meta: Meta = { + title: 'UI/Banner', + component: BannerComponent, + decorators: [ + moduleMetadata({ + declarations: [BannerComponent], + }), + ], + args: { + type: AlertType.Info, + }, + argTypes: { + type: { + control: 'select', + options: [AlertType.Info, AlertType.Warning, AlertType.Error, AlertType.Success], + }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Info: Story = { args: { type: AlertType.Info } }; +export const Warning: Story = { args: { type: AlertType.Warning } }; +export const ErrorBanner: Story = { args: { type: AlertType.Error } }; +export const Success: Story = { args: { type: AlertType.Success } }; diff --git a/frontend/src/app/components/ui-components/breadcrumbs/breadcrumbs.stories.ts b/frontend/src/app/components/ui-components/breadcrumbs/breadcrumbs.stories.ts new file mode 100644 index 000000000..4d3b89f75 --- /dev/null +++ b/frontend/src/app/components/ui-components/breadcrumbs/breadcrumbs.stories.ts @@ -0,0 +1,35 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { BreadcrumbsComponent } from './breadcrumbs.component'; + +const meta: Meta = { + title: 'UI/Breadcrumbs', + component: BreadcrumbsComponent, + args: { + crumbs: [ + { label: 'Home', link: '/' }, + { label: 'Connections', link: '/connections' }, + { label: 'PostgreSQL', link: '' }, + ], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const SingleCrumb: Story = { + args: { crumbs: [{ label: 'Home', link: '/' }] }, +}; + +export const LongPath: Story = { + args: { + crumbs: [ + { label: 'Home', link: '/' }, + { label: 'Connections', link: '/connections' }, + { label: 'PostgreSQL', link: '/connections/pg' }, + { label: 'users', link: '/connections/pg/users' }, + { label: 'Record #42', link: '' }, + ], + }, +}; diff --git a/frontend/src/app/components/ui-components/content-loader/content-loader.stories.ts b/frontend/src/app/components/ui-components/content-loader/content-loader.stories.ts new file mode 100644 index 000000000..72e4f94ad --- /dev/null +++ b/frontend/src/app/components/ui-components/content-loader/content-loader.stories.ts @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { ContentLoaderComponent } from './content-loader.component'; + +const meta: Meta = { + title: 'UI/ContentLoader', + component: ContentLoaderComponent, + decorators: [ + moduleMetadata({ + declarations: [ContentLoaderComponent], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/ui-components/filter-fields/binary-data-caption/binary-data-caption.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/binary-data-caption/binary-data-caption.component.stories.ts new file mode 100644 index 000000000..9a30db879 --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/binary-data-caption/binary-data-caption.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { BinaryDataCaptionFilterComponent } from './binary-data-caption.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'bytea', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/BinaryDataCaption', + component: BinaryDataCaptionFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/boolean/boolean.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/boolean/boolean.component.stories.ts new file mode 100644 index 000000000..72818eb8a --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/boolean/boolean.component.stories.ts @@ -0,0 +1,47 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { BooleanFilterComponent } from './boolean.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'boolean', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/Boolean', + component: BooleanFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: true, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const True: Story = { args: { value: true } }; +export const False: Story = { args: { value: false } }; +export const Null: Story = { args: { value: null } }; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/country/country.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/country/country.component.stories.ts new file mode 100644 index 000000000..f772dd00e --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/country/country.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { CountryFilterComponent } from './country.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/Country', + component: CountryFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'US', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/date-time/date-time.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/date-time/date-time.component.stories.ts new file mode 100644 index 000000000..cb843179e --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/date-time/date-time.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { DateTimeFilterComponent } from './date-time.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'datetime', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/DateTime', + component: DateTimeFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '2024-01-15T10:30:00', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/date/date.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/date/date.component.stories.ts new file mode 100644 index 000000000..91e8266bd --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/date/date.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { DateFilterComponent } from './date.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'date', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/Date', + component: DateFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '2024-01-15', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/file/file.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/file/file.component.stories.ts new file mode 100644 index 000000000..4a3241f70 --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/file/file.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { FileFilterComponent } from './file.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'blob', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/File', + component: FileFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/foreign-key/foreign-key.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/foreign-key/foreign-key.component.stories.ts new file mode 100644 index 000000000..ea95f0e2a --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/foreign-key/foreign-key.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ForeignKeyFilterComponent } from './foreign-key.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'int', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/ForeignKey', + component: ForeignKeyFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '1', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/id/id.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/id/id.component.stories.ts new file mode 100644 index 000000000..baacf102a --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/id/id.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { IdFilterComponent } from './id.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'int', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/Id', + component: IdFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'Sample text', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/json-editor/json-editor.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/json-editor/json-editor.component.stories.ts new file mode 100644 index 000000000..f5ac82a02 --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/json-editor/json-editor.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { JsonEditorFilterComponent } from './json-editor.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'json', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/JsonEditor', + component: JsonEditorFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: { key: 'value' }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/long-text/long-text.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/long-text/long-text.component.stories.ts new file mode 100644 index 000000000..cd1b42d2a --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/long-text/long-text.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { LongTextFilterComponent } from './long-text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'text', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/LongText', + component: LongTextFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'Sample text', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/number/number.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/number/number.component.stories.ts new file mode 100644 index 000000000..8623fbd61 --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/number/number.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { NumberFilterComponent } from './number.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'int', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/Number', + component: NumberFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 42, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/password/password.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/password/password.component.stories.ts new file mode 100644 index 000000000..dcfef2e4d --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/password/password.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PasswordFilterComponent } from './password.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/Password', + component: PasswordFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'Sample text', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/point/point.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/point/point.component.stories.ts new file mode 100644 index 000000000..d3a2ce925 --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/point/point.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PointFilterComponent } from './point.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'point', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/Point', + component: PointFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '(40.7128, -74.0060)', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/select/select.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/select/select.component.stories.ts new file mode 100644 index 000000000..642694e47 --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/select/select.component.stories.ts @@ -0,0 +1,45 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { SelectFilterComponent } from './select.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'enum', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, + data_type_params: ['option1', 'option2', 'option3'], +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/Select', + component: SelectFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'option1', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/static-text/static-text.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/static-text/static-text.component.stories.ts new file mode 100644 index 000000000..29edbffc6 --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/static-text/static-text.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { StaticTextFilterComponent } from './static-text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/StaticText', + component: StaticTextFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'Sample text', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/text/text.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/text/text.component.stories.ts new file mode 100644 index 000000000..c3a978087 --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/text/text.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TextFilterComponent } from './text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/Text', + component: TextFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'Sample text', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/time-interval/time-interval.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/time-interval/time-interval.component.stories.ts new file mode 100644 index 000000000..4d1c27bd0 --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/time-interval/time-interval.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimeIntervalFilterComponent } from './time-interval.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'interval', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/TimeInterval', + component: TimeIntervalFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '01:30:00', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/time/time.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/time/time.component.stories.ts new file mode 100644 index 000000000..ec7f582c5 --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/time/time.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimeFilterComponent } from './time.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'time', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/Time', + component: TimeFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '10:30:00', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/filter-fields/timezone/timezone.component.stories.ts b/frontend/src/app/components/ui-components/filter-fields/timezone/timezone.component.stories.ts new file mode 100644 index 000000000..ad189b6d0 --- /dev/null +++ b/frontend/src/app/components/ui-components/filter-fields/timezone/timezone.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimezoneFilterComponent } from './timezone.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Filter Fields/Timezone', + component: TimezoneFilterComponent, + args: { + key: 'field_name', + label: 'Field Label', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'UTC', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/icon-picker/icon-picker.stories.ts b/frontend/src/app/components/ui-components/icon-picker/icon-picker.stories.ts new file mode 100644 index 000000000..e9ea73d97 --- /dev/null +++ b/frontend/src/app/components/ui-components/icon-picker/icon-picker.stories.ts @@ -0,0 +1,26 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { IconPickerComponent } from './icon-picker.component'; + +const meta: Meta = { + title: 'UI/IconPicker', + component: IconPickerComponent, + args: { + icon: 'database', + defaultIcons: ['database', 'table_chart', 'settings', 'person', 'lock', 'vpn_key'], + tooltip: 'Choose an icon', + resetButtonShown: true, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const WithoutReset: Story = { + args: { resetButtonShown: false }, +}; + +export const NoIcon: Story = { + args: { icon: '', tooltip: 'Select icon' }, +}; diff --git a/frontend/src/app/components/ui-components/ip-address-button/ip-address-button.stories.ts b/frontend/src/app/components/ui-components/ip-address-button/ip-address-button.stories.ts new file mode 100644 index 000000000..79dd17255 --- /dev/null +++ b/frontend/src/app/components/ui-components/ip-address-button/ip-address-button.stories.ts @@ -0,0 +1,25 @@ +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { NotificationsService } from 'src/app/services/notifications.service'; +import { IpAddressButtonComponent } from './ip-address-button.component'; + +const meta: Meta = { + title: 'UI/IPAddressButton', + component: IpAddressButtonComponent, + decorators: [ + applicationConfig({ + providers: [{ provide: NotificationsService, useValue: { showSuccessSnackbar: () => {} } }], + }), + ], + args: { + ip: '192.168.1.100', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const IPv6: Story = { + args: { ip: '2001:0db8:85a3:0000:0000:8a2e:0370:7334' }, +}; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.stories.ts new file mode 100644 index 000000000..4a08a4633 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/binary-data-caption/binary-data-caption.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { BinaryDataCaptionEditComponent } from './binary-data-caption.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'bytea', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/BinaryDataCaption', + component: BinaryDataCaptionEditComponent, + args: { + key: 'field_name', + label: 'Binary Data Caption Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.stories.ts new file mode 100644 index 000000000..7e7525336 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/boolean/boolean.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { BooleanEditComponent } from './boolean.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'boolean', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Boolean', + component: BooleanEditComponent, + args: { + key: 'field_name', + label: 'Boolean Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: true, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/code/code.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/code/code.component.stories.ts new file mode 100644 index 000000000..94cbbdf3a --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/code/code.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { CodeEditComponent } from './code.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'text', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: { language: 'javascript' }, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Code', + component: CodeEditComponent, + args: { + key: 'field_name', + label: 'Code Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'console.log("hello")', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.stories.ts new file mode 100644 index 000000000..35fddf649 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/color/color.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ColorEditComponent } from './color.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Color', + component: ColorEditComponent, + args: { + key: 'field_name', + label: 'Color Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '#FF5733', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/country/country.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/country/country.component.stories.ts new file mode 100644 index 000000000..dd553a303 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/country/country.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { CountryEditComponent } from './country.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Country', + component: CountryEditComponent, + args: { + key: 'field_name', + label: 'Country Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'US', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.stories.ts new file mode 100644 index 000000000..8c1bb65d3 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/date-time/date-time.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { DateTimeEditComponent } from './date-time.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'datetime', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/DateTime', + component: DateTimeEditComponent, + args: { + key: 'field_name', + label: 'DateTime Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '2024-01-15T10:30:00', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/date/date.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/date/date.component.stories.ts new file mode 100644 index 000000000..5256fc595 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/date/date.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { DateEditComponent } from './date.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'date', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Date', + component: DateEditComponent, + args: { + key: 'field_name', + label: 'Date Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '2024-01-15', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/file/file.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/file/file.component.stories.ts new file mode 100644 index 000000000..69e86bee5 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/file/file.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { FileEditComponent } from './file.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'bytea', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/File', + component: FileEditComponent, + args: { + key: 'field_name', + label: 'File Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '' as any, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.stories.ts new file mode 100644 index 000000000..758e83a1b --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/foreign-key/foreign-key.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ForeignKeyEditComponent } from './foreign-key.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'int', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/ForeignKey', + component: ForeignKeyEditComponent, + args: { + key: 'field_name', + label: 'Foreign Key Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '1', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/id/id.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/id/id.component.stories.ts new file mode 100644 index 000000000..7f5b5df93 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/id/id.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { IdEditComponent } from './id.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'int', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Id', + component: IdEditComponent, + args: { + key: 'field_name', + label: 'ID Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '12345', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/image/image.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/image/image.component.stories.ts new file mode 100644 index 000000000..99e02ead5 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/image/image.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ImageEditComponent } from './image.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Image', + component: ImageEditComponent, + args: { + key: 'field_name', + label: 'Image Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'https://via.placeholder.com/150', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.stories.ts new file mode 100644 index 000000000..b3e42ac92 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/json-editor/json-editor.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { JsonEditorEditComponent } from './json-editor.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'json', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/JsonEditor', + component: JsonEditorEditComponent, + args: { + key: 'field_name', + label: 'JSON Editor Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: { key: 'value', nested: { a: 1 } }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/language/language.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/language/language.component.stories.ts new file mode 100644 index 000000000..08bc3a2a7 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/language/language.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { LanguageEditComponent } from './language.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Language', + component: LanguageEditComponent, + args: { + key: 'field_name', + label: 'Language Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'en', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.stories.ts new file mode 100644 index 000000000..4c924979a --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/long-text/long-text.component.stories.ts @@ -0,0 +1,45 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { LongTextEditComponent } from './long-text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'text', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/LongText', + component: LongTextEditComponent, + args: { + key: 'field_name', + label: 'Long Text Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/markdown/markdown.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/markdown/markdown.component.stories.ts new file mode 100644 index 000000000..492241aa5 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/markdown/markdown.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { MarkdownEditComponent } from './markdown.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'text', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Markdown', + component: MarkdownEditComponent, + args: { + key: 'field_name', + label: 'Markdown Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '# Hello\nThis is **markdown** content with a [link](https://example.com).', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/money/money.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/money/money.component.stories.ts new file mode 100644 index 000000000..161f49b2a --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/money/money.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { MoneyEditComponent } from './money.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'money', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Money', + component: MoneyEditComponent, + args: { + key: 'field_name', + label: 'Money Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '99.99', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/number/number.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/number/number.component.stories.ts new file mode 100644 index 000000000..c34e6ff5e --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/number/number.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { NumberEditComponent } from './number.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'int', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Number', + component: NumberEditComponent, + args: { + key: 'field_name', + label: 'Number Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 42, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/password/password.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/password/password.component.stories.ts new file mode 100644 index 000000000..04b90ed45 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/password/password.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PasswordEditComponent } from './password.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Password', + component: PasswordEditComponent, + args: { + key: 'field_name', + label: 'Password Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'secretpassword', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.stories.ts new file mode 100644 index 000000000..cd858dffb --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/phone/phone.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PhoneEditComponent } from './phone.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Phone', + component: PhoneEditComponent, + args: { + key: 'field_name', + label: 'Phone Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '+1234567890', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/point/point.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/point/point.component.stories.ts new file mode 100644 index 000000000..8c66cda56 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/point/point.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PointEditComponent } from './point.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'point', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Point', + component: PointEditComponent, + args: { + key: 'field_name', + label: 'Point Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '(40.7128, -74.0060)', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/range/range.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/range/range.component.stories.ts new file mode 100644 index 000000000..67cc9d334 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/range/range.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { RangeEditComponent } from './range.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'int', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Range', + component: RangeEditComponent, + args: { + key: 'field_name', + label: 'Range Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 50 as any, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.stories.ts new file mode 100644 index 000000000..0efe02b82 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { S3EditComponent } from './s3.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/S3', + component: S3EditComponent, + args: { + key: 'field_name', + label: 'S3 Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/select/select.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/select/select.component.stories.ts new file mode 100644 index 000000000..ed5d2a871 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/select/select.component.stories.ts @@ -0,0 +1,45 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { SelectEditComponent } from './select.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'enum', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, + data_type_params: ['option1', 'option2', 'option3'], +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Select', + component: SelectEditComponent, + args: { + key: 'field_name', + label: 'Select Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'option1', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.stories.ts new file mode 100644 index 000000000..cc31ab68e --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/static-text/static-text.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { StaticTextEditComponent } from './static-text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/StaticText', + component: StaticTextEditComponent, + args: { + key: 'field_name', + label: 'Static Text Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'This is static text content', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/text/text.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/text/text.component.stories.ts new file mode 100644 index 000000000..566d22a1d --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/text/text.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TextEditComponent } from './text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Text', + component: TextEditComponent, + args: { + key: 'field_name', + label: 'Text Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'Sample text value', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.stories.ts new file mode 100644 index 000000000..8a44390a5 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/time-interval/time-interval.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimeIntervalEditComponent } from './time-interval.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'interval', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/TimeInterval', + component: TimeIntervalEditComponent, + args: { + key: 'field_name', + label: 'Time Interval Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '01:30:00', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/time/time.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/time/time.component.stories.ts new file mode 100644 index 000000000..dd9598aa0 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/time/time.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimeEditComponent } from './time.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'time', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Time', + component: TimeEditComponent, + args: { + key: 'field_name', + label: 'Time Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '10:30:00', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/timezone/timezone.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/timezone/timezone.component.stories.ts new file mode 100644 index 000000000..de82e8bfb --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/timezone/timezone.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimezoneEditComponent } from './timezone.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/Timezone', + component: TimezoneEditComponent, + args: { + key: 'field_name', + label: 'Timezone Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'UTC', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/url/url.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/url/url.component.stories.ts new file mode 100644 index 000000000..8ed9d39e7 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/url/url.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { UrlEditComponent } from './url.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/URL', + component: UrlEditComponent, + args: { + key: 'field_name', + label: 'URL Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: 'https://example.com', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/uuid/uuid.component.stories.ts b/frontend/src/app/components/ui-components/record-edit-fields/uuid/uuid.component.stories.ts new file mode 100644 index 000000000..8d3910e2c --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/uuid/uuid.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { UuidEditComponent } from './uuid.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'uuid', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record Edit Fields/UUID', + component: UuidEditComponent, + args: { + key: 'field_name', + label: 'UUID Field', + required: false, + readonly: false, + disabled: false, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + value: '550e8400-e29b-41d4-a716-446655440000', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Required: Story = { args: { required: true } }; +export const Readonly: Story = { args: { readonly: true } }; +export const Disabled: Story = { args: { disabled: true } }; diff --git a/frontend/src/app/components/ui-components/record-view-fields/binary-data-caption/binary-data-caption.component.css b/frontend/src/app/components/ui-components/record-view-fields/binary-data-caption/binary-data-caption.component.css new file mode 100644 index 000000000..85157a202 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/binary-data-caption/binary-data-caption.component.css @@ -0,0 +1,10 @@ +.static-text { + margin-bottom: 20px; +} + +.static-text__value { + color: #0a0a0a; + font-style: italic; + opacity: 0.32; + padding-left: 8px; +} diff --git a/frontend/src/app/components/ui-components/record-view-fields/binary-data-caption/binary-data-caption.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/binary-data-caption/binary-data-caption.component.stories.ts new file mode 100644 index 000000000..7d286d36b --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/binary-data-caption/binary-data-caption.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { BinaryDataCaptionRecordViewComponent } from './binary-data-caption.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'bytea', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/BinaryDataCaption', + component: BinaryDataCaptionRecordViewComponent, + args: { + key: 'field_name', + value: '(binary data)', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '(binary data)' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/boolean/boolean.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/boolean/boolean.component.stories.ts new file mode 100644 index 000000000..0b36b26f6 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/boolean/boolean.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { BooleanRecordViewComponent } from './boolean.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'boolean', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Boolean', + component: BooleanRecordViewComponent, + args: { + key: 'field_name', + value: true, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: true }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/code/code.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/code/code.component.stories.ts new file mode 100644 index 000000000..549ba0000 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/code/code.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { CodeRecordViewComponent } from './code.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'text', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Code', + component: CodeRecordViewComponent, + args: { + key: 'field_name', + value: 'console.log("hello")', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'console.log("hello")' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/color/color.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/color/color.component.stories.ts new file mode 100644 index 000000000..77954e997 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/color/color.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ColorRecordViewComponent } from './color.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Color', + component: ColorRecordViewComponent, + args: { + key: 'field_name', + value: '#FF5733', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '#FF5733' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/country/country.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/country/country.component.stories.ts new file mode 100644 index 000000000..e976fc4bb --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/country/country.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { CountryRecordViewComponent } from './country.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Country', + component: CountryRecordViewComponent, + args: { + key: 'field_name', + value: 'US', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'US' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/date-time/date-time.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/date-time/date-time.component.stories.ts new file mode 100644 index 000000000..3fd9580f2 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/date-time/date-time.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { DateTimeRecordViewComponent } from './date-time.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'datetime', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/DateTime', + component: DateTimeRecordViewComponent, + args: { + key: 'field_name', + value: '2024-01-15T10:30:00', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '2024-01-15T10:30:00' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/date/date.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/date/date.component.stories.ts new file mode 100644 index 000000000..3b35c1eba --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/date/date.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { DateRecordViewComponent } from './date.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'date', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Date', + component: DateRecordViewComponent, + args: { + key: 'field_name', + value: '2024-01-15', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '2024-01-15' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/file/file.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/file/file.component.stories.ts new file mode 100644 index 000000000..ed76f9d26 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/file/file.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { FileRecordViewComponent } from './file.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/File', + component: FileRecordViewComponent, + args: { + key: 'field_name', + value: 'document.pdf', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'document.pdf' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/foreign-key/foreign-key.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/foreign-key/foreign-key.component.stories.ts new file mode 100644 index 000000000..442bf5e6d --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/foreign-key/foreign-key.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ForeignKeyRecordViewComponent } from './foreign-key.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'int', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/ForeignKey', + component: ForeignKeyRecordViewComponent, + args: { + key: 'field_name', + value: '1', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '1' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/id/id.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/id/id.component.stories.ts new file mode 100644 index 000000000..8d5cdb340 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/id/id.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { IdRecordViewComponent } from './id.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'int', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Id', + component: IdRecordViewComponent, + args: { + key: 'field_name', + value: '12345', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '12345' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/image/image.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/image/image.component.stories.ts new file mode 100644 index 000000000..396d3048a --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/image/image.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ImageRecordViewComponent } from './image.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Image', + component: ImageRecordViewComponent, + args: { + key: 'field_name', + value: 'https://via.placeholder.com/150', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'https://via.placeholder.com/150' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/json-editor/json-editor.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/json-editor/json-editor.component.stories.ts new file mode 100644 index 000000000..4b3104a82 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/json-editor/json-editor.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { JsonEditorRecordViewComponent } from './json-editor.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'json', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/JsonEditor', + component: JsonEditorRecordViewComponent, + args: { + key: 'field_name', + value: '{"key": "value"}', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '{"key": "value"}' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/language/language.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/language/language.component.stories.ts new file mode 100644 index 000000000..4804c162f --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/language/language.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { LanguageRecordViewComponent } from './language.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Language', + component: LanguageRecordViewComponent, + args: { + key: 'field_name', + value: 'en', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'en' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/long-text/long-text.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/long-text/long-text.component.stories.ts new file mode 100644 index 000000000..497cd5564 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/long-text/long-text.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { LongTextRecordViewComponent } from './long-text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'text', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/LongText', + component: LongTextRecordViewComponent, + args: { + key: 'field_name', + value: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/markdown/markdown.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/markdown/markdown.component.stories.ts new file mode 100644 index 000000000..3448ca2c0 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/markdown/markdown.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { MarkdownRecordViewComponent } from './markdown.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'text', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Markdown', + component: MarkdownRecordViewComponent, + args: { + key: 'field_name', + value: '# Hello\nThis is **markdown**', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '# Hello\nThis is **markdown**' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/money/money.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/money/money.component.stories.ts new file mode 100644 index 000000000..2dfcb4bed --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/money/money.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { MoneyRecordViewComponent } from './money.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'decimal', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Money', + component: MoneyRecordViewComponent, + args: { + key: 'field_name', + value: '$99.99', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '$99.99' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/number/number.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/number/number.component.stories.ts new file mode 100644 index 000000000..e264b500d --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/number/number.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { NumberRecordViewComponent } from './number.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'int', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Number', + component: NumberRecordViewComponent, + args: { + key: 'field_name', + value: 42, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 42 }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/password/password.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/password/password.component.stories.ts new file mode 100644 index 000000000..334f0fc4d --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/password/password.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PasswordRecordViewComponent } from './password.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Password', + component: PasswordRecordViewComponent, + args: { + key: 'field_name', + value: '********', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '********' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/phone/phone.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/phone/phone.component.stories.ts new file mode 100644 index 000000000..888c24e51 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/phone/phone.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PhoneRecordViewComponent } from './phone.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Phone', + component: PhoneRecordViewComponent, + args: { + key: 'field_name', + value: '+1 (555) 123-4567', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '+1 (555) 123-4567' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/point/point.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/point/point.component.stories.ts new file mode 100644 index 000000000..f8ef70d17 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/point/point.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PointRecordViewComponent } from './point.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'point', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Point', + component: PointRecordViewComponent, + args: { + key: 'field_name', + value: '(40.7128, -74.0060)', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '(40.7128, -74.0060)' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/range/range.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/range/range.component.stories.ts new file mode 100644 index 000000000..f12d85400 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/range/range.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { RangeRecordViewComponent } from './range.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'int', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Range', + component: RangeRecordViewComponent, + args: { + key: 'field_name', + value: '[1, 100]' as any, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '[1, 100]' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/s3/s3.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/s3/s3.component.stories.ts new file mode 100644 index 000000000..4c5dc9081 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/s3/s3.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { S3RecordViewComponent } from './s3.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/S3', + component: S3RecordViewComponent, + args: { + key: 'field_name', + value: 's3://bucket/file.txt', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 's3://bucket/file.txt' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/select/select.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/select/select.component.stories.ts new file mode 100644 index 000000000..242993933 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/select/select.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { SelectRecordViewComponent } from './select.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'enum', + data_type_params: ['option1', 'option2', 'option3'], + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Select', + component: SelectRecordViewComponent, + args: { + key: 'field_name', + value: 'option1', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'option1' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/static-text/static-text.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/static-text/static-text.component.stories.ts new file mode 100644 index 000000000..32a0d4fe9 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/static-text/static-text.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { StaticTextRecordViewComponent } from './static-text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/StaticText', + component: StaticTextRecordViewComponent, + args: { + key: 'field_name', + value: 'Static content', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'Static content' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/text/text.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/text/text.component.stories.ts new file mode 100644 index 000000000..7395923e7 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/text/text.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TextRecordViewComponent } from './text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Text', + component: TextRecordViewComponent, + args: { + key: 'field_name', + value: 'Sample text', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'Sample text' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/time-interval/time-interval.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/time-interval/time-interval.component.stories.ts new file mode 100644 index 000000000..f599db79c --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/time-interval/time-interval.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimeIntervalRecordViewComponent } from './time-interval.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'interval', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/TimeInterval', + component: TimeIntervalRecordViewComponent, + args: { + key: 'field_name', + value: '01:30:00', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '01:30:00' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/time/time.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/time/time.component.stories.ts new file mode 100644 index 000000000..15759b2e2 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/time/time.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimeRecordViewComponent } from './time.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'time', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Time', + component: TimeRecordViewComponent, + args: { + key: 'field_name', + value: '10:30:00', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '10:30:00' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/timezone/timezone.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/timezone/timezone.component.stories.ts new file mode 100644 index 000000000..d1570a66c --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/timezone/timezone.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimezoneRecordViewComponent } from './timezone.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Timezone', + component: TimezoneRecordViewComponent, + args: { + key: 'field_name', + value: 'UTC', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'UTC' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/url/url.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/url/url.component.stories.ts new file mode 100644 index 000000000..08f6efa83 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/url/url.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { UrlRecordViewComponent } from './url.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Url', + component: UrlRecordViewComponent, + args: { + key: 'field_name', + value: 'https://example.com', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'https://example.com' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/record-view-fields/uuid/uuid.component.stories.ts b/frontend/src/app/components/ui-components/record-view-fields/uuid/uuid.component.stories.ts new file mode 100644 index 000000000..81cfadecf --- /dev/null +++ b/frontend/src/app/components/ui-components/record-view-fields/uuid/uuid.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { UuidRecordViewComponent } from './uuid.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'uuid', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Record View Fields/Uuid', + component: UuidRecordViewComponent, + args: { + key: 'field_name', + value: '550e8400-e29b-41d4-a716-446655440000', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '550e8400-e29b-41d4-a716-446655440000' }, + primaryKeys: { id: 1 }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.css b/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.css new file mode 100644 index 000000000..85157a202 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.css @@ -0,0 +1,10 @@ +.static-text { + margin-bottom: 20px; +} + +.static-text__value { + color: #0a0a0a; + font-style: italic; + opacity: 0.32; + padding-left: 8px; +} diff --git a/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.stories.ts new file mode 100644 index 000000000..c7965ee27 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/binary-data-caption/binary-data-caption.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { BinaryDataCaptionDisplayComponent } from './binary-data-caption.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'bytea', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/BinaryDataCaption', + component: BinaryDataCaptionDisplayComponent, + args: { + key: 'field_name', + value: '(binary data)', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '(binary data)' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.stories.ts new file mode 100644 index 000000000..59f1395a9 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/boolean/boolean.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { BooleanDisplayComponent } from './boolean.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'boolean', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Boolean', + component: BooleanDisplayComponent, + args: { + key: 'field_name', + value: true, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: true }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/code/code.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/code/code.component.stories.ts new file mode 100644 index 000000000..9b6006bc8 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/code/code.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { CodeDisplayComponent } from './code.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'text', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Code', + component: CodeDisplayComponent, + args: { + key: 'field_name', + value: 'console.log("hello")', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'console.log("hello")' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/color/color.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/color/color.component.stories.ts new file mode 100644 index 000000000..e7aced75d --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/color/color.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ColorDisplayComponent } from './color.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Color', + component: ColorDisplayComponent, + args: { + key: 'field_name', + value: '#FF5733', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '#FF5733' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/country/country.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/country/country.component.stories.ts new file mode 100644 index 000000000..e282182a8 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/country/country.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { CountryDisplayComponent } from './country.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Country', + component: CountryDisplayComponent, + args: { + key: 'field_name', + value: 'US', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'US' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.stories.ts new file mode 100644 index 000000000..19b6ef2d8 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/date-time/date-time.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { DateTimeDisplayComponent } from './date-time.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'datetime', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/DateTime', + component: DateTimeDisplayComponent, + args: { + key: 'field_name', + value: '2024-01-15T10:30:00', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '2024-01-15T10:30:00' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/date/date.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/date/date.component.stories.ts new file mode 100644 index 000000000..52ea16f5c --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/date/date.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { DateDisplayComponent } from './date.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'date', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Date', + component: DateDisplayComponent, + args: { + key: 'field_name', + value: '2024-01-15', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '2024-01-15' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/file/file.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/file/file.component.stories.ts new file mode 100644 index 000000000..b9eeac0b7 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/file/file.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { FileDisplayComponent } from './file.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/File', + component: FileDisplayComponent, + args: { + key: 'field_name', + value: 'document.pdf', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'document.pdf' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.stories.ts new file mode 100644 index 000000000..da17f7704 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/foreign-key/foreign-key.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ForeignKeyDisplayComponent } from './foreign-key.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'integer', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/ForeignKey', + component: ForeignKeyDisplayComponent, + args: { + key: 'field_name', + value: '1', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '1' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/id/id.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/id/id.component.stories.ts new file mode 100644 index 000000000..cbbeae09e --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/id/id.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { IdDisplayComponent } from './id.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'integer', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Id', + component: IdDisplayComponent, + args: { + key: 'field_name', + value: '12345', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '12345' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/image/image.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/image/image.component.stories.ts new file mode 100644 index 000000000..7cee658d1 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/image/image.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { ImageDisplayComponent } from './image.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Image', + component: ImageDisplayComponent, + args: { + key: 'field_name', + value: 'https://via.placeholder.com/150', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'https://via.placeholder.com/150' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.stories.ts new file mode 100644 index 000000000..dc4d11b6d --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/json-editor/json-editor.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { JsonEditorDisplayComponent } from './json-editor.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'json', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/JsonEditor', + component: JsonEditorDisplayComponent, + args: { + key: 'field_name', + value: '{"key": "value"}', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '{"key": "value"}' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/language/language.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/language/language.component.stories.ts new file mode 100644 index 000000000..8afb31765 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/language/language.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { LanguageDisplayComponent } from './language.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Language', + component: LanguageDisplayComponent, + args: { + key: 'field_name', + value: 'en', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'en' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.stories.ts new file mode 100644 index 000000000..edebbb0d4 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/long-text/long-text.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { LongTextDisplayComponent } from './long-text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'text', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/LongText', + component: LongTextDisplayComponent, + args: { + key: 'field_name', + value: 'Lorem ipsum dolor sit amet...', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'Lorem ipsum dolor sit amet...' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/markdown/markdown.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/markdown/markdown.component.stories.ts new file mode 100644 index 000000000..dfece3e97 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/markdown/markdown.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { MarkdownDisplayComponent } from './markdown.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'text', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Markdown', + component: MarkdownDisplayComponent, + args: { + key: 'field_name', + value: '# Hello', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '# Hello' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/money/money.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/money/money.component.stories.ts new file mode 100644 index 000000000..9d2e8b157 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/money/money.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { MoneyDisplayComponent } from './money.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'numeric', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Money', + component: MoneyDisplayComponent, + args: { + key: 'field_name', + value: '$99.99', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '$99.99' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/number/number.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/number/number.component.stories.ts new file mode 100644 index 000000000..f60be74bb --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/number/number.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { NumberDisplayComponent } from './number.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'integer', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Number', + component: NumberDisplayComponent, + args: { + key: 'field_name', + value: 42, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 42 }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/password/password.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/password/password.component.stories.ts new file mode 100644 index 000000000..5dfa8b36b --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/password/password.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PasswordDisplayComponent } from './password.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Password', + component: PasswordDisplayComponent, + args: { + key: 'field_name', + value: '********', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '********' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.stories.ts new file mode 100644 index 000000000..b10c718f5 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/phone/phone.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PhoneDisplayComponent } from './phone.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Phone', + component: PhoneDisplayComponent, + args: { + key: 'field_name', + value: '+1 (555) 123-4567', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '+1 (555) 123-4567' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/point/point.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/point/point.component.stories.ts new file mode 100644 index 000000000..af366b968 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/point/point.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { PointDisplayComponent } from './point.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'point', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Point', + component: PointDisplayComponent, + args: { + key: 'field_name', + value: '(40.7128, -74.0060)', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '(40.7128, -74.0060)' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/range/range.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/range/range.component.stories.ts new file mode 100644 index 000000000..ba8aa39db --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/range/range.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { RangeDisplayComponent } from './range.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'integer', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Range', + component: RangeDisplayComponent, + args: { + key: 'field_name', + value: 50 as any, + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 50 }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/s3/s3.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/s3/s3.component.stories.ts new file mode 100644 index 000000000..f5ef97c18 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/s3/s3.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { S3DisplayComponent } from './s3.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/S3', + component: S3DisplayComponent, + args: { + key: 'field_name', + value: 's3://bucket/file.txt', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 's3://bucket/file.txt' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/select/select.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/select/select.component.stories.ts new file mode 100644 index 000000000..10b2b31a8 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/select/select.component.stories.ts @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { SelectDisplayComponent } from './select.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'enum', + data_type_params: ['option1', 'option2', 'option3'], + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Select', + component: SelectDisplayComponent, + args: { + key: 'field_name', + value: 'option1', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'option1' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.stories.ts new file mode 100644 index 000000000..c66a2bd3d --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/static-text/static-text.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { StaticTextDisplayComponent } from './static-text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/StaticText', + component: StaticTextDisplayComponent, + args: { + key: 'field_name', + value: 'Static content', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'Static content' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/text/text.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/text/text.component.stories.ts new file mode 100644 index 000000000..4a36e414f --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/text/text.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TextDisplayComponent } from './text.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Text', + component: TextDisplayComponent, + args: { + key: 'field_name', + value: 'Sample text', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'Sample text' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/time-interval/time-interval.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/time-interval/time-interval.component.stories.ts new file mode 100644 index 000000000..5d31102b6 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/time-interval/time-interval.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimeIntervalDisplayComponent } from './time-interval.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'interval', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/TimeInterval', + component: TimeIntervalDisplayComponent, + args: { + key: 'field_name', + value: '01:30:00', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '01:30:00' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/time/time.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/time/time.component.stories.ts new file mode 100644 index 000000000..3104fc7c5 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/time/time.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimeDisplayComponent } from './time.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'time', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Time', + component: TimeDisplayComponent, + args: { + key: 'field_name', + value: '10:30:00', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '10:30:00' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/timezone/timezone.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/timezone/timezone.component.stories.ts new file mode 100644 index 000000000..524bc7927 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/timezone/timezone.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TimezoneDisplayComponent } from './timezone.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/Timezone', + component: TimezoneDisplayComponent, + args: { + key: 'field_name', + value: 'UTC', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'UTC' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/url/url.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/url/url.component.stories.ts new file mode 100644 index 000000000..77cca0652 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/url/url.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { UrlDisplayComponent } from './url.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'varchar', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/URL', + component: UrlDisplayComponent, + args: { + key: 'field_name', + value: 'https://example.com', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: 'https://example.com' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/table-display-fields/uuid/uuid.component.stories.ts b/frontend/src/app/components/ui-components/table-display-fields/uuid/uuid.component.stories.ts new file mode 100644 index 000000000..3cd230e00 --- /dev/null +++ b/frontend/src/app/components/ui-components/table-display-fields/uuid/uuid.component.stories.ts @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { UuidDisplayComponent } from './uuid.component'; + +const mockStructure = { + column_name: 'field_name', + column_default: null, + data_type: 'uuid', + isExcluded: false, + isSearched: false, + allow_null: true, + auto_increment: false, + character_maximum_length: 255, +}; + +const mockWidgetStructure = { + field_name: 'field_name', + widget_type: 'Default', + widget_params: {}, + name: '', + description: '', +}; + +const meta: Meta = { + title: 'Table Display Fields/UUID', + component: UuidDisplayComponent, + args: { + key: 'field_name', + value: '550e8400-e29b-41d4-a716-446655440000', + structure: mockStructure as any, + widgetStructure: mockWidgetStructure as any, + rowData: { field_name: '550e8400-e29b-41d4-a716-446655440000' }, + primaryKeys: [{ column_name: 'id' }], + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Empty: Story = { + args: { value: null }, +}; diff --git a/frontend/src/app/components/ui-components/turnstile/turnstile.stories.ts b/frontend/src/app/components/ui-components/turnstile/turnstile.stories.ts new file mode 100644 index 000000000..4b9ecef94 --- /dev/null +++ b/frontend/src/app/components/ui-components/turnstile/turnstile.stories.ts @@ -0,0 +1,30 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { TurnstileComponent } from './turnstile.component'; + +const meta: Meta = { + title: 'UI/Turnstile', + component: TurnstileComponent, + args: { + siteKey: '1x00000000000000000000AA', + theme: 'auto', + }, + argTypes: { + theme: { + control: 'select', + options: ['light', 'dark', 'auto'], + }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Light: Story = { + args: { theme: 'light' }, +}; + +export const Dark: Story = { + args: { theme: 'dark' }, +}; diff --git a/frontend/src/app/components/ui-components/user-password/user-password.stories.ts b/frontend/src/app/components/ui-components/user-password/user-password.stories.ts new file mode 100644 index 000000000..f5d579d42 --- /dev/null +++ b/frontend/src/app/components/ui-components/user-password/user-password.stories.ts @@ -0,0 +1,24 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { UserPasswordComponent } from './user-password.component'; + +const meta: Meta = { + title: 'UI/UserPassword', + component: UserPasswordComponent, + args: { + value: '', + label: 'Password', + }, +}; + +export default meta; +type Story = StoryObj; + +export const Empty: Story = {}; + +export const WithValue: Story = { + args: { value: 'MyStr0ngP@ss!' }, +}; + +export const CustomLabel: Story = { + args: { label: 'Confirm Password', value: '' }, +}; diff --git a/frontend/src/app/components/user-settings/enable-two-fa-dialog/enable-two-fa-dialog.component.stories.ts b/frontend/src/app/components/user-settings/enable-two-fa-dialog/enable-two-fa-dialog.component.stories.ts new file mode 100644 index 000000000..3565846f4 --- /dev/null +++ b/frontend/src/app/components/user-settings/enable-two-fa-dialog/enable-two-fa-dialog.component.stories.ts @@ -0,0 +1,38 @@ +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { Angulartics2 } from 'angulartics2'; +import { of } from 'rxjs'; +import { UserService } from 'src/app/services/user.service'; +import { EnableTwoFADialogComponent } from './enable-two-fa-dialog.component'; + +const mockUserService: Partial = { + confirm2FA: () => of({ validated: true } as any), +}; + +const mockAngulartics: Partial = { + eventTrack: { next: () => {} } as any, +}; + +const meta: Meta = { + title: 'Dialogs/EnableTwoFA', + component: EnableTwoFADialogComponent, + decorators: [ + applicationConfig({ + providers: [ + { provide: MatDialogRef, useValue: { close: () => {} } }, + { + provide: MAT_DIALOG_DATA, + useValue: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==', + }, + { provide: UserService, useValue: mockUserService }, + { provide: Angulartics2, useValue: mockAngulartics }, + ], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/users/group-add-dialog/group-add-dialog.component.stories.ts b/frontend/src/app/components/users/group-add-dialog/group-add-dialog.component.stories.ts new file mode 100644 index 000000000..6c0b04621 --- /dev/null +++ b/frontend/src/app/components/users/group-add-dialog/group-add-dialog.component.stories.ts @@ -0,0 +1,40 @@ +import { MatDialogRef } from '@angular/material/dialog'; +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { Angulartics2 } from 'angulartics2'; +import { of } from 'rxjs'; +import { ConnectionsService } from 'src/app/services/connections.service'; +import { UsersService } from 'src/app/services/users.service'; +import { GroupAddDialogComponent } from './group-add-dialog.component'; + +const mockConnectionsService: Partial = { + currentConnectionID: 'conn-1', +}; + +const mockUsersService: Partial = { + cast: of([]), + createUsersGroup: () => of(null as any), +}; + +const mockAngulartics: Partial = { + eventTrack: { next: () => {} } as any, +}; + +const meta: Meta = { + title: 'Dialogs/GroupAdd', + component: GroupAddDialogComponent, + decorators: [ + applicationConfig({ + providers: [ + { provide: MatDialogRef, useValue: { close: () => {} } }, + { provide: ConnectionsService, useValue: mockConnectionsService }, + { provide: UsersService, useValue: mockUsersService }, + { provide: Angulartics2, useValue: mockAngulartics }, + ], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/src/app/components/users/user-delete-dialog/user-delete-dialog.component.stories.ts b/frontend/src/app/components/users/user-delete-dialog/user-delete-dialog.component.stories.ts new file mode 100644 index 000000000..267aefa62 --- /dev/null +++ b/frontend/src/app/components/users/user-delete-dialog/user-delete-dialog.component.stories.ts @@ -0,0 +1,35 @@ +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { applicationConfig, type Meta, type StoryObj } from '@storybook/angular'; +import { of } from 'rxjs'; +import { UsersService } from 'src/app/services/users.service'; +import { UserDeleteDialogComponent } from './user-delete-dialog.component'; + +const mockUsersService: Partial = { + cast: of([]), + deleteGroupUser: () => of(null as any), +}; + +const meta: Meta = { + title: 'Dialogs/UserDelete', + component: UserDeleteDialogComponent, + decorators: [ + applicationConfig({ + providers: [ + { provide: MatDialogRef, useValue: { close: () => {} } }, + { + provide: MAT_DIALOG_DATA, + useValue: { + user: { email: 'user@example.com' }, + group: { id: 'group-1', title: 'Admins' }, + }, + }, + { provide: UsersService, useValue: mockUsersService }, + ], + }), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json index df4d05e13..a39b7dc01 100644 --- a/frontend/tsconfig.app.json +++ b/frontend/tsconfig.app.json @@ -1,18 +1,10 @@ { - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] - }, - "files": [ - "src/main.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.d.ts" - ], - "exclude": [ - "src/test.ts", - "src/**/*.spec.ts" - ] + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": ["src/main.ts", "src/polyfills.ts"], + "include": ["src/**/*.d.ts"], + "exclude": ["src/test.ts", "src/**/*.spec.ts", "src/**/*.stories.ts"] } diff --git a/frontend/yarn.lock b/frontend/yarn.lock index b2948a8ab..5766736e3 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -12,6 +12,13 @@ __metadata: languageName: node linkType: hard +"@adobe/css-tools@npm:^4.4.0": + version: 4.4.4 + resolution: "@adobe/css-tools@npm:4.4.4" + checksum: 452b82cd9f42aacc57eeaf0b11e36c6864eb482e8a347054cb986503d221d1f7c1418710d2007858d8919afdbd31357149c2c16bd080ded15506f13608d16cf2 + languageName: node + linkType: hard + "@algolia/abtesting@npm:1.1.0": version: 1.1.0 resolution: "@algolia/abtesting@npm:1.1.0" @@ -820,7 +827,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.27.1, @babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.27.1, @babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": version: 7.29.0 resolution: "@babel/code-frame@npm:7.29.0" dependencies: @@ -2213,6 +2220,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/aix-ppc64@npm:0.27.3" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/android-arm64@npm:0.25.12" @@ -2234,6 +2248,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/android-arm64@npm:0.27.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/android-arm@npm:0.25.12" @@ -2255,6 +2276,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/android-arm@npm:0.27.3" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/android-x64@npm:0.25.12" @@ -2276,6 +2304,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/android-x64@npm:0.27.3" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/darwin-arm64@npm:0.25.12" @@ -2297,6 +2332,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/darwin-arm64@npm:0.27.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/darwin-x64@npm:0.25.12" @@ -2318,6 +2360,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/darwin-x64@npm:0.27.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/freebsd-arm64@npm:0.25.12" @@ -2339,6 +2388,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/freebsd-arm64@npm:0.27.3" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/freebsd-x64@npm:0.25.12" @@ -2360,6 +2416,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/freebsd-x64@npm:0.27.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-arm64@npm:0.25.12" @@ -2381,6 +2444,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-arm64@npm:0.27.3" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-arm@npm:0.25.12" @@ -2402,6 +2472,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-arm@npm:0.27.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-ia32@npm:0.25.12" @@ -2423,6 +2500,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-ia32@npm:0.27.3" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-loong64@npm:0.25.12" @@ -2444,6 +2528,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-loong64@npm:0.27.3" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-mips64el@npm:0.25.12" @@ -2465,6 +2556,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-mips64el@npm:0.27.3" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-ppc64@npm:0.25.12" @@ -2486,6 +2584,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-ppc64@npm:0.27.3" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-riscv64@npm:0.25.12" @@ -2507,6 +2612,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-riscv64@npm:0.27.3" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-s390x@npm:0.25.12" @@ -2528,6 +2640,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-s390x@npm:0.27.3" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-x64@npm:0.25.12" @@ -2549,6 +2668,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-x64@npm:0.27.3" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/netbsd-arm64@npm:0.25.12" @@ -2570,6 +2696,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/netbsd-arm64@npm:0.27.3" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/netbsd-x64@npm:0.25.12" @@ -2591,6 +2724,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/netbsd-x64@npm:0.27.3" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/openbsd-arm64@npm:0.25.12" @@ -2612,6 +2752,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/openbsd-arm64@npm:0.27.3" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/openbsd-x64@npm:0.25.12" @@ -2633,6 +2780,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/openbsd-x64@npm:0.27.3" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openharmony-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/openharmony-arm64@npm:0.25.12" @@ -2654,6 +2808,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openharmony-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/openharmony-arm64@npm:0.27.3" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/sunos-x64@npm:0.25.12" @@ -2675,6 +2836,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/sunos-x64@npm:0.27.3" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/win32-arm64@npm:0.25.12" @@ -2696,6 +2864,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/win32-arm64@npm:0.27.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/win32-ia32@npm:0.25.12" @@ -2717,6 +2892,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/win32-ia32@npm:0.27.3" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/win32-x64@npm:0.25.12" @@ -2738,6 +2920,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/win32-x64@npm:0.27.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@exodus/bytes@npm:^1.6.0": version: 1.11.0 resolution: "@exodus/bytes@npm:1.11.0" @@ -4967,6 +5156,99 @@ __metadata: languageName: node linkType: hard +"@storybook/angular@npm:^10.2.14": + version: 10.2.14 + resolution: "@storybook/angular@npm:10.2.14" + dependencies: + "@storybook/builder-webpack5": 10.2.14 + "@storybook/global": ^5.0.0 + telejson: 8.0.0 + ts-dedent: ^2.0.0 + tsconfig-paths-webpack-plugin: ^4.0.1 + webpack: 5 + peerDependencies: + "@angular-devkit/architect": ">=0.1800.0 < 0.2200.0" + "@angular-devkit/build-angular": ">=18.0.0 < 22.0.0" + "@angular-devkit/core": ">=18.0.0 < 22.0.0" + "@angular/animations": ">=18.0.0 < 22.0.0" + "@angular/cli": ">=18.0.0 < 22.0.0" + "@angular/common": ">=18.0.0 < 22.0.0" + "@angular/compiler": ">=18.0.0 < 22.0.0" + "@angular/compiler-cli": ">=18.0.0 < 22.0.0" + "@angular/core": ">=18.0.0 < 22.0.0" + "@angular/platform-browser": ">=18.0.0 < 22.0.0" + "@angular/platform-browser-dynamic": ">=18.0.0 < 22.0.0" + rxjs: ^6.5.3 || ^7.4.0 + storybook: ^10.2.14 + typescript: ^4.9.0 || ^5.0.0 + zone.js: ">=0.14.0" + peerDependenciesMeta: + "@angular/animations": + optional: true + "@angular/cli": + optional: true + zone.js: + optional: true + checksum: d740749ffc773a66bffe8b9da979c621edfc5fbaa909bc2136af87b75df358db0e949ca75cf291daac4bfeae00891b1836c166041112ee3f12e02a65cfb20efb + languageName: node + linkType: hard + +"@storybook/builder-webpack5@npm:10.2.14": + version: 10.2.14 + resolution: "@storybook/builder-webpack5@npm:10.2.14" + dependencies: + "@storybook/core-webpack": 10.2.14 + case-sensitive-paths-webpack-plugin: ^2.4.0 + cjs-module-lexer: ^1.2.3 + css-loader: ^7.1.2 + es-module-lexer: ^1.5.0 + fork-ts-checker-webpack-plugin: ^9.1.0 + html-webpack-plugin: ^5.5.0 + magic-string: ^0.30.5 + style-loader: ^4.0.0 + terser-webpack-plugin: ^5.3.14 + ts-dedent: ^2.0.0 + webpack: 5 + webpack-dev-middleware: ^6.1.2 + webpack-hot-middleware: ^2.25.1 + webpack-virtual-modules: ^0.6.0 + peerDependencies: + storybook: ^10.2.14 + peerDependenciesMeta: + typescript: + optional: true + checksum: a8d29b131faaad222db8337abeb6342577fa2cb4bbcd0d793febbd5f394edf699a47fe896cdca7de4fe28ef3410f751f8aed3a5bd93c076caf3e7814aa4e2e12 + languageName: node + linkType: hard + +"@storybook/core-webpack@npm:10.2.14": + version: 10.2.14 + resolution: "@storybook/core-webpack@npm:10.2.14" + dependencies: + ts-dedent: ^2.0.0 + peerDependencies: + storybook: ^10.2.14 + checksum: d1792befa6049cc217946264104c44304ba8719e6d403f7342b86b81759418f6dafb6dc758b4a463d00c2b0bb99ed31d692d5e26ea10582f3007a29a5fe74a98 + languageName: node + linkType: hard + +"@storybook/global@npm:^5.0.0": + version: 5.0.0 + resolution: "@storybook/global@npm:5.0.0" + checksum: ede0ad35ec411fe31c61150dbd118fef344d1d0e72bf5d3502368e35cf68126f6b7ae4a0ab5e2ffe2f0baa3b4286f03ad069ba3e098e1725449ef08b7e154ba8 + languageName: node + linkType: hard + +"@storybook/icons@npm:^2.0.1": + version: 2.0.1 + resolution: "@storybook/icons@npm:2.0.1" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: b7038a96d0fb183b9ad66e88127a44ef5b5b8dcb71130f30a01f26e7368f298d0ade656eb7a429545427e339dd603c6fc74620dcc1fa4d17ee8cea09b26fdd0b + languageName: node + linkType: hard + "@stripe/stripe-js@npm:^5.3.0": version: 5.10.0 resolution: "@stripe/stripe-js@npm:5.10.0" @@ -4990,6 +5272,20 @@ __metadata: languageName: node linkType: hard +"@testing-library/jest-dom@npm:^6.6.3": + version: 6.9.1 + resolution: "@testing-library/jest-dom@npm:6.9.1" + dependencies: + "@adobe/css-tools": ^4.4.0 + aria-query: ^5.0.0 + css.escape: ^1.5.1 + dom-accessibility-api: ^0.6.3 + picocolors: ^1.1.1 + redent: ^3.0.0 + checksum: 5c77126a59a1c0df5935d29569652364c56e5026982f0357f0daaeb21b75fcd9a6aeff8365bdcba719687a4359b3f8bf74bba81ccbae7635cf18ad9789e1e323 + languageName: node + linkType: hard + "@testing-library/user-event@npm:^14.6.1": version: 14.6.1 resolution: "@testing-library/user-event@npm:14.6.1" @@ -5489,6 +5785,13 @@ __metadata: languageName: node linkType: hard +"@types/html-minifier-terser@npm:^6.0.0": + version: 6.1.0 + resolution: "@types/html-minifier-terser@npm:6.1.0" + checksum: eb843f6a8d662d44fb18ec61041117734c6aae77aa38df1be3b4712e8e50ffaa35f1e1c92fdd0fde14a5675fecf457abcd0d15a01fae7506c91926176967f452 + languageName: node + linkType: hard + "@types/http-errors@npm:*": version: 2.0.5 resolution: "@types/http-errors@npm:2.0.5" @@ -5505,7 +5808,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 @@ -6070,6 +6373,15 @@ __metadata: languageName: node linkType: hard +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 + languageName: node + linkType: hard + "ajv-keywords@npm:^5.1.0": version: 5.1.0 resolution: "ajv-keywords@npm:5.1.0" @@ -6093,6 +6405,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^6.12.5": + version: 6.14.0 + resolution: "ajv@npm:6.14.0" + dependencies: + fast-deep-equal: ^3.1.1 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.4.1 + uri-js: ^4.2.2 + checksum: 7bb3ea97bb8af52521589079f427e799b6561acaa94f50e13410cb87588c51df8db1afe1157b3e48f1a829269adaa11116e0c2cafe2b998add1523789809a3c5 + languageName: node + linkType: hard + "algoliasearch@npm:5.35.0": version: 5.35.0 resolution: "algoliasearch@npm:5.35.0" @@ -6185,7 +6509,7 @@ __metadata: languageName: node linkType: hard -"ansi-html-community@npm:^0.0.8": +"ansi-html-community@npm:0.0.8, ansi-html-community@npm:^0.0.8": version: 0.0.8 resolution: "ansi-html-community@npm:0.0.8" bin: @@ -6208,7 +6532,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^4.0.0": +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: @@ -6264,6 +6588,13 @@ __metadata: languageName: node linkType: hard +"aria-query@npm:^5.0.0": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: d971175c85c10df0f6d14adfe6f1292409196114ab3c62f238e208b53103686f46cc70695a4f775b73bc65f6a09b6a092fd963c4f3a5a7d690c8fc5094925717 + languageName: node + linkType: hard + "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -6287,6 +6618,15 @@ __metadata: languageName: node linkType: hard +"ast-types@npm:^0.16.1": + version: 0.16.1 + resolution: "ast-types@npm:0.16.1" + dependencies: + tslib: ^2.0.1 + checksum: 21c186da9fdb1d8087b1b7dabbc4059f91aa5a1e593a9776b4393cc1eaa857e741b2dda678d20e34b16727b78fef3ab59cf8f0c75ed1ba649c78fe194e5c114b + languageName: node + linkType: hard + "async-function@npm:^1.0.0": version: 1.0.0 resolution: "async-function@npm:1.0.0" @@ -6379,6 +6719,13 @@ __metadata: languageName: node linkType: hard +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + "bare-events@npm:^2.5.4, bare-events@npm:^2.7.0": version: 2.8.2 resolution: "bare-events@npm:2.8.2" @@ -6581,6 +6928,16 @@ __metadata: languageName: node linkType: hard +"brace-expansion@npm:^1.1.7": + version: 1.1.12 + resolution: "brace-expansion@npm:1.1.12" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: 12cb6d6310629e3048cadb003e1aca4d8c9bb5c67c3c321bafdd7e7a50155de081f78ea3e0ed92ecc75a9015e784f301efc8132383132f4f7904ad1ac529c562 + languageName: node + linkType: hard + "braces@npm:^3.0.3, braces@npm:~3.0.2": version: 3.0.3 resolution: "braces@npm:3.0.3" @@ -6688,6 +7045,16 @@ __metadata: languageName: node linkType: hard +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: ^3.1.2 + tslib: ^2.0.3 + checksum: bcbd25cd253b3cbc69be3f535750137dbf2beb70f093bdc575f73f800acc8443d34fd52ab8f0a2413c34f1e8203139ffc88428d8863e4dfe530cfb257a379ad6 + languageName: node + linkType: hard + "caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001759": version: 1.0.30001767 resolution: "caniuse-lite@npm:1.0.30001767" @@ -6695,6 +7062,13 @@ __metadata: languageName: node linkType: hard +"case-sensitive-paths-webpack-plugin@npm:^2.4.0": + version: 2.4.0 + resolution: "case-sensitive-paths-webpack-plugin@npm:2.4.0" + checksum: bcf469446eeee9ac0046e30860074ebb9aa4803aab9140e6bb72b600b23b1d70635690754be4504ce35cd99cdf05226bee8d894ba362a3f5485d5f6310fc6d02 + languageName: node + linkType: hard + "chai@npm:^5.2.0": version: 5.3.3 resolution: "chai@npm:5.3.3" @@ -6708,6 +7082,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^4.1.0, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + "chalk@npm:^5.3.0": version: 5.6.2 resolution: "chalk@npm:5.6.2" @@ -6792,7 +7176,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^4.0.0": +"chokidar@npm:^4.0.0, chokidar@npm:^4.0.1": version: 4.0.3 resolution: "chokidar@npm:4.0.3" dependencies: @@ -6827,6 +7211,22 @@ __metadata: languageName: node linkType: hard +"cjs-module-lexer@npm:^1.2.3": + version: 1.4.3 + resolution: "cjs-module-lexer@npm:1.4.3" + checksum: 221a1661a9ff4944b472c85ac7cd5029b2f2dc7f6c5f4ecf887f261503611110b43a48acb6c07f8f04109c772d1637fdb20b31252bf27058f35aa97bf5ad8b12 + languageName: node + linkType: hard + +"clean-css@npm:^5.2.2": + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" + dependencies: + source-map: ~0.6.0 + checksum: 941987c14860dd7d346d5cf121a82fd2caf8344160b1565c5387f7ccca4bbcaf885bace961be37c4f4713ce2d8c488dd89483c1add47bb779790edbfdcc79cbc + languageName: node + linkType: hard + "cli-cursor@npm:^5.0.0": version: 5.0.0 resolution: "cli-cursor@npm:5.0.0" @@ -6988,6 +7388,13 @@ __metadata: languageName: node linkType: hard +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + "confbox@npm:^0.1.8": version: 0.1.8 resolution: "confbox@npm:0.1.8" @@ -7142,6 +7549,23 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:^8.2.0": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" + dependencies: + import-fresh: ^3.3.0 + js-yaml: ^4.1.0 + parse-json: ^5.2.0 + path-type: ^4.0.0 + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: dc339ebea427898c9e03bf01b56ba7afbac07fc7d2a2d5a15d6e9c14de98275a9565da949375aee1809591c152c0a3877bb86dbeaf74d5bd5aaa79955ad9e7a0 + languageName: node + linkType: hard + "cosmiconfig@npm:^9.0.0": version: 9.0.0 resolution: "cosmiconfig@npm:9.0.0" @@ -7201,6 +7625,43 @@ __metadata: languageName: node linkType: hard +"css-loader@npm:^7.1.2": + version: 7.1.4 + resolution: "css-loader@npm:7.1.4" + dependencies: + icss-utils: ^5.1.0 + postcss: ^8.4.40 + postcss-modules-extract-imports: ^3.1.0 + postcss-modules-local-by-default: ^4.0.5 + postcss-modules-scope: ^3.2.0 + postcss-modules-values: ^4.0.0 + postcss-value-parser: ^4.2.0 + semver: ^7.6.3 + peerDependencies: + "@rspack/core": 0.x || ^1.0.0 || ^2.0.0-0 + webpack: ^5.27.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 92a486a6fb224540d6fd57a7dc6877cd5fc5296414dece1da0857224492147aa71887aea0d9ff04c5a76cbd12bd4d65ed5b02f58510dc3fc7e7a426c04259162 + languageName: node + linkType: hard + +"css-select@npm:^4.1.3": + version: 4.3.0 + resolution: "css-select@npm:4.3.0" + dependencies: + boolbase: ^1.0.0 + css-what: ^6.0.1 + domhandler: ^4.3.1 + domutils: ^2.8.0 + nth-check: ^2.0.1 + checksum: d6202736839194dd7f910320032e7cfc40372f025e4bf21ca5bf6eb0a33264f322f50ba9c0adc35dadd342d3d6fae5ca244779a4873afbfa76561e343f2058e0 + languageName: node + linkType: hard + "css-select@npm:^6.0.0": version: 6.0.0 resolution: "css-select@npm:6.0.0" @@ -7224,6 +7685,13 @@ __metadata: languageName: node linkType: hard +"css-what@npm:^6.0.1": + version: 6.2.2 + resolution: "css-what@npm:6.2.2" + checksum: 4d1f07b348a638e1f8b4c72804a1e93881f35e0f541256aec5ac0497c5855df7db7ab02da030de950d4813044f6d029a14ca657e0f92c3987e4b604246235b2b + languageName: node + linkType: hard + "css-what@npm:^7.0.0": version: 7.0.0 resolution: "css-what@npm:7.0.0" @@ -7231,6 +7699,13 @@ __metadata: languageName: node linkType: hard +"css.escape@npm:^1.5.1": + version: 1.5.1 + resolution: "css.escape@npm:1.5.1" + checksum: f6d38088d870a961794a2580b2b2af1027731bb43261cfdce14f19238a88664b351cc8978abc20f06cc6bbde725699dec8deb6fe9816b139fc3f2af28719e774 + languageName: node + linkType: hard + "cssesc@npm:^3.0.0": version: 3.0.0 resolution: "cssesc@npm:3.0.0" @@ -7717,6 +8192,13 @@ __metadata: languageName: node linkType: hard +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 + languageName: node + linkType: hard + "default-browser-id@npm:^5.0.0": version: 5.0.1 resolution: "default-browser-id@npm:5.0.1" @@ -7840,24 +8322,60 @@ __metadata: languageName: node linkType: hard -"dom-serializer@npm:^2.0.0": - version: 2.0.0 - resolution: "dom-serializer@npm:2.0.0" - dependencies: - domelementtype: ^2.3.0 - domhandler: ^5.0.2 - entities: ^4.2.0 - checksum: cd1810544fd8cdfbd51fa2c0c1128ec3a13ba92f14e61b7650b5de421b88205fd2e3f0cc6ace82f13334114addb90ed1c2f23074a51770a8e9c1273acbc7f3e6 +"dom-accessibility-api@npm:^0.6.3": + version: 0.6.3 + resolution: "dom-accessibility-api@npm:0.6.3" + checksum: c325b5144bb406df23f4affecffc117dbaec9af03daad9ee6b510c5be647b14d28ef0a4ea5ca06d696d8ab40bb777e5fed98b985976fdef9d8790178fa1d573f languageName: node linkType: hard -"domelementtype@npm:^2.3.0": - version: 2.3.0 +"dom-converter@npm:^0.2.0": + version: 0.2.0 + resolution: "dom-converter@npm:0.2.0" + dependencies: + utila: ~0.4 + checksum: ea52fe303f5392e48dea563abef0e6fb3a478b8dbe3c599e99bb5d53981c6c38fc4944e56bb92a8ead6bb989d10b7914722ae11febbd2fd0910e33b9fc4aaa77 + languageName: node + linkType: hard + +"dom-serializer@npm:^1.0.1": + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" + dependencies: + domelementtype: ^2.0.1 + domhandler: ^4.2.0 + entities: ^2.0.0 + checksum: fbb0b01f87a8a2d18e6e5a388ad0f7ec4a5c05c06d219377da1abc7bb0f674d804f4a8a94e3f71ff15f6cb7dcfc75704a54b261db672b9b3ab03da6b758b0b22 + languageName: node + linkType: hard + +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" + dependencies: + domelementtype: ^2.3.0 + domhandler: ^5.0.2 + entities: ^4.2.0 + checksum: cd1810544fd8cdfbd51fa2c0c1128ec3a13ba92f14e61b7650b5de421b88205fd2e3f0cc6ace82f13334114addb90ed1c2f23074a51770a8e9c1273acbc7f3e6 + languageName: node + linkType: hard + +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": + version: 2.3.0 resolution: "domelementtype@npm:2.3.0" checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 languageName: node linkType: hard +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" + dependencies: + domelementtype: ^2.2.0 + checksum: 4c665ceed016e1911bf7d1dadc09dc888090b64dee7851cccd2fcf5442747ec39c647bb1cb8c8919f8bbdd0f0c625a6bafeeed4b2d656bbecdbae893f43ffaaa + languageName: node + linkType: hard + "domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": version: 5.0.3 resolution: "domhandler@npm:5.0.3" @@ -7891,6 +8409,17 @@ __metadata: languageName: node linkType: hard +"domutils@npm:^2.5.2, domutils@npm:^2.8.0": + version: 2.8.0 + resolution: "domutils@npm:2.8.0" + dependencies: + dom-serializer: ^1.0.1 + domelementtype: ^2.2.0 + domhandler: ^4.2.0 + checksum: abf7434315283e9aadc2a24bac0e00eab07ae4313b40cc239f89d84d7315ebdfd2fb1b5bf750a96bc1b4403d7237c7b2ebf60459be394d625ead4ca89b934391 + languageName: node + linkType: hard + "domutils@npm:^3.2.2": version: 3.2.2 resolution: "domutils@npm:3.2.2" @@ -7902,6 +8431,16 @@ __metadata: languageName: node linkType: hard +"dot-case@npm:^3.0.4": + version: 3.0.4 + resolution: "dot-case@npm:3.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + checksum: a65e3519414856df0228b9f645332f974f2bf5433370f544a681122eab59e66038fc3349b4be1cdc47152779dac71a5864f1ccda2f745e767c46e9c6543b1169 + languageName: node + linkType: hard + "dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -7990,6 +8529,23 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.7.0": + version: 5.20.0 + resolution: "enhanced-resolve@npm:5.20.0" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.3.0 + checksum: cefb4c241cb8fa15c5f53b39042250c95432e0028b64f4cccb29bb4b5b4b4a20435b59a7a0d5c1e133d41b49ec2e5392198152a2237cc8f302c6c21c248bdc50 + languageName: node + linkType: hard + +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 19010dacaf0912c895ea262b4f6128574f9ccf8d4b3b65c7e8334ad0079b3706376360e28d8843ff50a78aabcb8f08f0a32dbfacdc77e47ed77ca08b713669b3 + languageName: node + linkType: hard + "entities@npm:^4.2.0": version: 4.5.0 resolution: "entities@npm:4.5.0" @@ -8066,7 +8622,7 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.7.0": +"es-module-lexer@npm:^1.5.0, es-module-lexer@npm:^1.7.0": version: 1.7.0 resolution: "es-module-lexer@npm:1.7.0" checksum: 7858bb76ae387fdbf8a6fccc951bf18919768309850587553eca34698b9193fbc65fab03d3d9f69163d860321fbf66adf89d5821e7f4148c7cb7d7b997259211 @@ -8187,6 +8743,95 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0": + version: 0.27.3 + resolution: "esbuild@npm:0.27.3" + dependencies: + "@esbuild/aix-ppc64": 0.27.3 + "@esbuild/android-arm": 0.27.3 + "@esbuild/android-arm64": 0.27.3 + "@esbuild/android-x64": 0.27.3 + "@esbuild/darwin-arm64": 0.27.3 + "@esbuild/darwin-x64": 0.27.3 + "@esbuild/freebsd-arm64": 0.27.3 + "@esbuild/freebsd-x64": 0.27.3 + "@esbuild/linux-arm": 0.27.3 + "@esbuild/linux-arm64": 0.27.3 + "@esbuild/linux-ia32": 0.27.3 + "@esbuild/linux-loong64": 0.27.3 + "@esbuild/linux-mips64el": 0.27.3 + "@esbuild/linux-ppc64": 0.27.3 + "@esbuild/linux-riscv64": 0.27.3 + "@esbuild/linux-s390x": 0.27.3 + "@esbuild/linux-x64": 0.27.3 + "@esbuild/netbsd-arm64": 0.27.3 + "@esbuild/netbsd-x64": 0.27.3 + "@esbuild/openbsd-arm64": 0.27.3 + "@esbuild/openbsd-x64": 0.27.3 + "@esbuild/openharmony-arm64": 0.27.3 + "@esbuild/sunos-x64": 0.27.3 + "@esbuild/win32-arm64": 0.27.3 + "@esbuild/win32-ia32": 0.27.3 + "@esbuild/win32-x64": 0.27.3 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 3a45334b00ca235ad96843738c4698970aacde92058aee28ab1fa57ad823c29667070af90b6071cc876e492bebdeed79f593a273c39b419097afd2a772296085 + languageName: node + linkType: hard + "esbuild@npm:^0.25.0": version: 0.25.12 resolution: "esbuild@npm:0.25.12" @@ -8407,7 +9052,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.1": +"esprima@npm:^4.0.1, esprima@npm:~4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -8624,7 +9269,7 @@ __metadata: languageName: node linkType: hard -"fast-deep-equal@npm:^3.1.3": +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d @@ -8651,6 +9296,13 @@ __metadata: languageName: node linkType: hard +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + "fast-uri@npm:^3.0.1": version: 3.1.0 resolution: "fast-uri@npm:3.1.0" @@ -8794,6 +9446,29 @@ __metadata: languageName: node linkType: hard +"fork-ts-checker-webpack-plugin@npm:^9.1.0": + version: 9.1.0 + resolution: "fork-ts-checker-webpack-plugin@npm:9.1.0" + dependencies: + "@babel/code-frame": ^7.16.7 + chalk: ^4.1.2 + chokidar: ^4.0.1 + cosmiconfig: ^8.2.0 + deepmerge: ^4.2.2 + fs-extra: ^10.0.0 + memfs: ^3.4.1 + minimatch: ^3.0.4 + node-abort-controller: ^3.0.1 + schema-utils: ^3.1.1 + semver: ^7.3.5 + tapable: ^2.2.1 + peerDependencies: + typescript: ">3.6.0" + webpack: ^5.11.0 + checksum: 8c3e011cce7ad2b45adce8aea8226db7d79e6ea0900030e86d24ea689152127a7a420f16ac09b9634e461fcd317e32b922a1f3106fe5107b1e8b74b83ed8ae82 + languageName: node + linkType: hard + "formatly@npm:^0.3.0": version: 0.3.0 resolution: "formatly@npm:0.3.0" @@ -8833,6 +9508,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^10.0.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 + languageName: node + linkType: hard + "fs-minipass@npm:^3.0.0": version: 3.0.3 resolution: "fs-minipass@npm:3.0.3" @@ -8842,6 +9528,13 @@ __metadata: languageName: node linkType: hard +"fs-monkey@npm:^1.0.4": + version: 1.1.0 + resolution: "fs-monkey@npm:1.1.0" + checksum: ebb6305a37ca4731ffe9aceae21be40992fe5384f7a25819a1d64d17c649e7eeac3fc9ad6269cad6fffc409df0f4583253c93a930549fd82d5f8aed46beb5b9b + languageName: node + linkType: hard + "fsevents@npm:2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" @@ -9027,7 +9720,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 @@ -9071,6 +9764,15 @@ __metadata: languageName: node linkType: hard +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 + languageName: node + linkType: hard + "hosted-git-info@npm:^9.0.0": version: 9.0.2 resolution: "hosted-git-info@npm:9.0.2" @@ -9101,6 +9803,51 @@ __metadata: languageName: node linkType: hard +"html-entities@npm:^2.1.0": + version: 2.6.0 + resolution: "html-entities@npm:2.6.0" + checksum: 720643f7954019c80911430a7df2728524c07080edfe812610bfc5d8191cd772b470bee0ee151bf7426679314ae53cf28a1c845d702123714e625a8565b26567 + languageName: node + linkType: hard + +"html-minifier-terser@npm:^6.0.2": + version: 6.1.0 + resolution: "html-minifier-terser@npm:6.1.0" + dependencies: + camel-case: ^4.1.2 + clean-css: ^5.2.2 + commander: ^8.3.0 + he: ^1.2.0 + param-case: ^3.0.4 + relateurl: ^0.2.7 + terser: ^5.10.0 + bin: + html-minifier-terser: cli.js + checksum: ac52c14006476f773204c198b64838477859dc2879490040efab8979c0207424da55d59df7348153f412efa45a0840a1ca3c757bf14767d23a15e3e389d37a93 + languageName: node + linkType: hard + +"html-webpack-plugin@npm:^5.5.0": + version: 5.6.6 + resolution: "html-webpack-plugin@npm:5.6.6" + dependencies: + "@types/html-minifier-terser": ^6.0.0 + html-minifier-terser: ^6.0.2 + lodash: ^4.17.21 + pretty-error: ^4.0.0 + tapable: ^2.0.0 + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 6aab02f4be85ed2d939bd7dff296bf4af4b7288d6523670176c143d67f7cd4163daa1070c459d1c40e75b233f7fccefae714f58c3402a78aa83dbe9378ecf76f + languageName: node + linkType: hard + "htmlparser2@npm:^10.0.0": version: 10.1.0 resolution: "htmlparser2@npm:10.1.0" @@ -9113,6 +9860,18 @@ __metadata: languageName: node linkType: hard +"htmlparser2@npm:^6.1.0": + version: 6.1.0 + resolution: "htmlparser2@npm:6.1.0" + dependencies: + domelementtype: ^2.0.1 + domhandler: ^4.0.0 + domutils: ^2.5.2 + entities: ^2.0.0 + checksum: 81a7b3d9c3bb9acb568a02fc9b1b81ffbfa55eae7f1c41ae0bf840006d1dbf54cb3aa245b2553e2c94db674840a9f0fdad7027c9a9d01a062065314039058c4e + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.1": version: 4.2.0 resolution: "http-cache-semantics@npm:4.2.0" @@ -9308,6 +10067,13 @@ __metadata: languageName: node linkType: hard +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + languageName: node + linkType: hard + "inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" @@ -9708,6 +10474,13 @@ __metadata: languageName: node linkType: hard +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + "json-schema-traverse@npm:^1.0.0": version: 1.0.0 resolution: "json-schema-traverse@npm:1.0.0" @@ -9722,7 +10495,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.3": +"json5@npm:^2.1.2, json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -9738,6 +10511,19 @@ __metadata: languageName: node linkType: hard +"jsonfile@npm:^6.0.1": + version: 6.2.0 + resolution: "jsonfile@npm:6.2.0" + dependencies: + graceful-fs: ^4.1.6 + universalify: ^2.0.0 + dependenciesMeta: + graceful-fs: + optional: true + checksum: c3028ec5c770bb41290c9bb9ca04bdd0a1b698ddbdf6517c9453d3f90fc9e000c9675959fb46891d317690a93c62de03ff1735d8dbe02be83e51168ce85815d3 + languageName: node + linkType: hard + "jsonparse@npm:^1.3.1": version: 1.3.1 resolution: "jsonparse@npm:1.3.1" @@ -10028,7 +10814,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.21": +"lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.23 resolution: "lodash@npm:4.17.23" checksum: 7daad39758a72872e94651630fbb54ba76868f904211089721a64516ce865506a759d9ad3d8ff22a2a49a50a09db5d27c36f22762d21766e47e3ba918d6d7bab @@ -10072,6 +10858,15 @@ __metadata: languageName: node linkType: hard +"lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 83a0a5f159ad7614bee8bf976b96275f3954335a84fad2696927f609ddae902802c4f3312d86668722e668bef41400254807e1d3a7f2e8c3eede79691aa1f010 + languageName: node + linkType: hard + "lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1, lru-cache@npm:^11.2.4, lru-cache@npm:^11.2.5": version: 11.2.5 resolution: "lru-cache@npm:11.2.5" @@ -10113,7 +10908,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.17": +"magic-string@npm:^0.30.17, magic-string@npm:^0.30.5": version: 0.30.21 resolution: "magic-string@npm:0.30.21" dependencies: @@ -10204,6 +10999,15 @@ __metadata: languageName: node linkType: hard +"memfs@npm:^3.4.1, memfs@npm:^3.4.12": + version: 3.5.3 + resolution: "memfs@npm:3.5.3" + dependencies: + fs-monkey: ^1.0.4 + checksum: 18dfdeacad7c8047b976a6ccd58bc98ba76e122ad3ca0e50a21837fe2075fc0d9aafc58ab9cf2576c2b6889da1dd2503083f2364191b695273f40969db2ecc44 + languageName: node + linkType: hard + "memfs@npm:^4.43.1, memfs@npm:^4.6.0": version: 4.56.10 resolution: "memfs@npm:4.56.10" @@ -10349,6 +11153,13 @@ __metadata: languageName: node linkType: hard +"min-indent@npm:^1.0.0": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 + languageName: node + linkType: hard + "mini-css-extract-plugin@npm:2.9.4": version: 2.9.4 resolution: "mini-css-extract-plugin@npm:2.9.4" @@ -10377,7 +11188,16 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.8": +"minimatch@npm:^3.0.4": + version: 3.1.5 + resolution: "minimatch@npm:3.1.5" + dependencies: + brace-expansion: ^1.1.7 + checksum: 47ef6f412c08be045a7291d11b1c40777925accf7252dc6d3caa39b1bfbb3a7ea390ba7aba464d762d783265c644143d2c8a204e6b5763145024d52ee65a1941 + languageName: node + linkType: hard + +"minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 @@ -10715,6 +11535,23 @@ __metadata: languageName: node linkType: hard +"no-case@npm:^3.0.4": + version: 3.0.4 + resolution: "no-case@npm:3.0.4" + dependencies: + lower-case: ^2.0.2 + tslib: ^2.0.3 + checksum: 0b2ebc113dfcf737d48dde49cfebf3ad2d82a8c3188e7100c6f375e30eafbef9e9124aadc3becef237b042fd5eb0aad2fd78669c20972d045bbe7fea8ba0be5c + languageName: node + linkType: hard + +"node-abort-controller@npm:^3.0.1": + version: 3.1.1 + resolution: "node-abort-controller@npm:3.1.1" + checksum: 2c340916af9710328b11c0828223fc65ba320e0d082214a211311bf64c2891028e42ef276b9799188c4ada9e6e1c54cf7a0b7c05dd9d59fcdc8cd633304c8047 + languageName: node + linkType: hard + "node-addon-api@npm:^6.1.0": version: 6.1.0 resolution: "node-addon-api@npm:6.1.0" @@ -10892,7 +11729,7 @@ __metadata: languageName: node linkType: hard -"nth-check@npm:^2.1.1": +"nth-check@npm:^2.0.1, nth-check@npm:^2.1.1": version: 2.1.1 resolution: "nth-check@npm:2.1.1" dependencies: @@ -10956,7 +11793,7 @@ __metadata: languageName: node linkType: hard -"open@npm:10.2.0, open@npm:^10.0.3": +"open@npm:10.2.0, open@npm:^10.0.3, open@npm:^10.2.0": version: 10.2.0 resolution: "open@npm:10.2.0" dependencies: @@ -11157,6 +11994,16 @@ __metadata: languageName: node linkType: hard +"param-case@npm:^3.0.4": + version: 3.0.4 + resolution: "param-case@npm:3.0.4" + dependencies: + dot-case: ^3.0.4 + tslib: ^2.0.3 + checksum: b34227fd0f794e078776eb3aa6247442056cb47761e9cd2c4c881c86d84c64205f6a56ef0d70b41ee7d77da02c3f4ed2f88e3896a8fefe08bdfb4deca037c687 + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -11221,6 +12068,16 @@ __metadata: languageName: node linkType: hard +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + checksum: ba98bfd595fc91ef3d30f4243b1aee2f6ec41c53b4546bfa3039487c367abaa182471dcfc830a1f9e1a0df00c14a370514fa2b3a1aacc68b15a460c31116873e + languageName: node + linkType: hard + "path-data-parser@npm:0.1.0, path-data-parser@npm:^0.1.0": version: 0.1.0 resolution: "path-data-parser@npm:0.1.0" @@ -11273,6 +12130,13 @@ __metadata: languageName: node linkType: hard +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + "pathe@npm:^2.0.1, pathe@npm:^2.0.3": version: 2.0.3 resolution: "pathe@npm:2.0.3" @@ -11488,7 +12352,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.5.6, postcss@npm:^8.2.14, postcss@npm:^8.4.33, postcss@npm:^8.4.49, postcss@npm:^8.5.6": +"postcss@npm:8.5.6, postcss@npm:^8.2.14, postcss@npm:^8.4.33, postcss@npm:^8.4.40, postcss@npm:^8.4.49, postcss@npm:^8.5.6": version: 8.5.6 resolution: "postcss@npm:8.5.6" dependencies: @@ -11534,6 +12398,16 @@ __metadata: languageName: node linkType: hard +"pretty-error@npm:^4.0.0": + version: 4.0.0 + resolution: "pretty-error@npm:4.0.0" + dependencies: + lodash: ^4.17.20 + renderkid: ^3.0.0 + checksum: a5b9137365690104ded6947dca2e33360bf55e62a4acd91b1b0d7baa3970e43754c628cc9e16eafbdd4e8f8bcb260a5865475d4fc17c3106ff2d61db4e72cdf3 + languageName: node + linkType: hard + "pretty-format@npm:^27.0.2": version: 27.5.1 resolution: "pretty-format@npm:27.5.1" @@ -11672,7 +12546,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.3.1": +"punycode@npm:^2.1.0, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 @@ -11833,6 +12707,29 @@ __metadata: languageName: node linkType: hard +"recast@npm:^0.23.5": + version: 0.23.11 + resolution: "recast@npm:0.23.11" + dependencies: + ast-types: ^0.16.1 + esprima: ~4.0.0 + source-map: ~0.6.1 + tiny-invariant: ^1.3.3 + tslib: ^2.0.1 + checksum: 1807159b1c33bc4a2d146e4ffea13b658e54bdcfab04fc4f9c9d7f1b4626c931e2ce41323e214516ec1e02a119037d686d825fc62f28072db27962b85e5b481d + languageName: node + linkType: hard + +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: ^4.0.0 + strip-indent: ^3.0.0 + checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b + languageName: node + linkType: hard + "reflect-metadata@npm:^0.2.0": version: 0.2.2 resolution: "reflect-metadata@npm:0.2.2" @@ -11895,6 +12792,26 @@ __metadata: languageName: node linkType: hard +"relateurl@npm:^0.2.7": + version: 0.2.7 + resolution: "relateurl@npm:0.2.7" + checksum: 5891e792eae1dfc3da91c6fda76d6c3de0333a60aa5ad848982ebb6dccaa06e86385fb1235a1582c680a3d445d31be01c6bfc0804ebbcab5aaf53fa856fde6b6 + languageName: node + linkType: hard + +"renderkid@npm:^3.0.0": + version: 3.0.0 + resolution: "renderkid@npm:3.0.0" + dependencies: + css-select: ^4.1.3 + dom-converter: ^0.2.0 + htmlparser2: ^6.1.0 + lodash: ^4.17.21 + strip-ansi: ^6.0.1 + checksum: 77162b62d6f33ab81f337c39efce0439ff0d1f6d441e29c35183151f83041c7850774fb904da163d6c844264d440d10557714e6daa0b19e4561a5cd4ef305d41 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -12060,6 +12977,7 @@ __metadata: "@ngstack/code-editor": ^9.0.0 "@sentry-internal/rrweb": ^2.16.0 "@sentry/angular": ^10.33.0 + "@storybook/angular": ^10.2.14 "@stripe/stripe-js": ^5.3.0 "@types/google-one-tap": ^1.2.6 "@types/lodash": ^4.17.13 @@ -12097,6 +13015,7 @@ __metadata: private-ip: ^3.0.2 puppeteer: ^24.29.1 rxjs: ^7.4.0 + storybook: ^10.2.14 ts-node: ~10.9.2 tslib: ^2.8.1 typescript: ~5.9.3 @@ -12415,6 +13334,17 @@ __metadata: languageName: node linkType: hard +"schema-utils@npm:^3.1.1": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": ^7.0.8 + ajv: ^6.12.5 + ajv-keywords: ^3.5.2 + checksum: ea56971926fac2487f0757da939a871388891bc87c6a82220d125d587b388f1704788f3706e7f63a7b70e49fc2db974c41343528caea60444afd5ce0fe4b85c0 + languageName: node + linkType: hard + "schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3": version: 4.3.3 resolution: "schema-utils@npm:4.3.3" @@ -12487,6 +13417,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.3": + version: 7.7.4 + resolution: "semver@npm:7.7.4" + bin: + semver: bin/semver.js + checksum: 9b4a6a58e98b9723fafcafa393c9d4e8edefaa60b8dfbe39e30892a3604cf1f45f52df9cfb1ae1a22b44c8b3d57fec8a9bb7b3e1645431587cb272399ede152e + languageName: node + linkType: hard + "send@npm:^1.1.0, send@npm:^1.2.0": version: 1.2.1 resolution: "send@npm:1.2.1" @@ -12922,6 +13861,33 @@ __metadata: languageName: node linkType: hard +"storybook@npm:^10.2.14": + version: 10.2.14 + resolution: "storybook@npm:10.2.14" + dependencies: + "@storybook/global": ^5.0.0 + "@storybook/icons": ^2.0.1 + "@testing-library/jest-dom": ^6.6.3 + "@testing-library/user-event": ^14.6.1 + "@vitest/expect": 3.2.4 + "@vitest/spy": 3.2.4 + esbuild: ^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 + open: ^10.2.0 + recast: ^0.23.5 + semver: ^7.7.3 + use-sync-external-store: ^1.5.0 + ws: ^8.18.0 + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + bin: + storybook: ./dist/bin/dispatcher.js + checksum: c26feb191aa1a47c2b7dc0b0b3ea18dfd78f7bf3f96387e42e2fcb09b8dcb07e74fe2b3624c5c8a75c8b67a78f7dcd86a3fee6eeea94d24947b5f2a807f52119 + languageName: node + linkType: hard + "streamx@npm:^2.15.0, streamx@npm:^2.21.0": version: 2.23.0 resolution: "streamx@npm:2.23.0" @@ -12991,6 +13957,22 @@ __metadata: languageName: node linkType: hard +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b + languageName: node + linkType: hard + +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: ^1.0.0 + checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 + languageName: node + linkType: hard + "strip-json-comments@npm:5.0.3": version: 5.0.3 resolution: "strip-json-comments@npm:5.0.3" @@ -13007,6 +13989,15 @@ __metadata: languageName: node linkType: hard +"style-loader@npm:^4.0.0": + version: 4.0.0 + resolution: "style-loader@npm:4.0.0" + peerDependencies: + webpack: ^5.27.0 + checksum: 0b751b4cc8394a2fe1df6194bb2f6dd68e859e36f22030994bb7b5220f24f9efb5705e78b2442226e6fa4c90f74b397529c7eb0a1d7326fb016e1e140e90151c + languageName: node + linkType: hard + "stylis@npm:^4.3.6": version: 4.3.6 resolution: "stylis@npm:4.3.6" @@ -13014,6 +14005,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + "supports-color@npm:^8.0.0": version: 8.1.1 resolution: "supports-color@npm:8.1.1" @@ -13044,7 +14044,7 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.2.0, tapable@npm:^2.2.1, tapable@npm:^2.3.0": +"tapable@npm:^2.0.0, tapable@npm:^2.2.0, tapable@npm:^2.2.1, tapable@npm:^2.3.0": version: 2.3.0 resolution: "tapable@npm:2.3.0" checksum: ada1194219ad550e3626d15019d87a2b8e77521d8463ab1135f46356e987a4c37eff1e87ffdd5acd573590962e519cc81e8ea6f7ed632c66bb58c0f12bd772a4 @@ -13092,7 +14092,14 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.16": +"telejson@npm:8.0.0": + version: 8.0.0 + resolution: "telejson@npm:8.0.0" + checksum: 7c4414fe4e5a48781934c7c533467ea44cbbb477e1b31f5559b826723228afea453d52c387316d2ec1e7caabb2bed18bfb7b90af2d6df4dc91487ac1fc551c98 + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.3.14, terser-webpack-plugin@npm:^5.3.16": version: 5.3.16 resolution: "terser-webpack-plugin@npm:5.3.16" dependencies: @@ -13128,7 +14135,7 @@ __metadata: languageName: node linkType: hard -"terser@npm:^5.31.1": +"terser@npm:^5.10.0, terser@npm:^5.31.1": version: 5.46.0 resolution: "terser@npm:5.46.0" dependencies: @@ -13174,6 +14181,13 @@ __metadata: languageName: node linkType: hard +"tiny-invariant@npm:^1.3.3": + version: 1.3.3 + resolution: "tiny-invariant@npm:1.3.3" + checksum: 5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe + languageName: node + linkType: hard + "tinybench@npm:^2.9.0": version: 2.9.0 resolution: "tinybench@npm:2.9.0" @@ -13320,7 +14334,7 @@ __metadata: languageName: node linkType: hard -"ts-dedent@npm:^2.2.0": +"ts-dedent@npm:^2.0.0, ts-dedent@npm:^2.2.0": version: 2.2.0 resolution: "ts-dedent@npm:2.2.0" checksum: 93ed8f7878b6d5ed3c08d99b740010eede6bccfe64bce61c5a4da06a2c17d6ddbb80a8c49c2d15251de7594a4f93ffa21dd10e7be75ef66a4dc9951b4a94e2af @@ -13365,7 +14379,30 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.8.1, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.5.0, tslib@npm:^2.8.0, tslib@npm:^2.8.1": +"tsconfig-paths-webpack-plugin@npm:^4.0.1": + version: 4.2.0 + resolution: "tsconfig-paths-webpack-plugin@npm:4.2.0" + dependencies: + chalk: ^4.1.0 + enhanced-resolve: ^5.7.0 + tapable: ^2.2.1 + tsconfig-paths: ^4.1.2 + checksum: b35e4da5fb4ee438267125f369220102a061824c1dd568cd84e9db2368b72581ec7b88db1a5fda180bba65ff7b7597b18561a24f1db9c9a85fdc803bea122aa6 + languageName: node + linkType: hard + +"tsconfig-paths@npm:^4.1.2": + version: 4.2.0 + resolution: "tsconfig-paths@npm:4.2.0" + dependencies: + json5: ^2.2.2 + minimist: ^1.2.6 + strip-bom: ^3.0.0 + checksum: 28c5f7bbbcabc9dabd4117e8fdc61483f6872a1c6b02a4b1c4d68c5b79d06896c3cc9547610c4c3ba64658531caa2de13ead1ea1bf321c7b53e969c4752b98c7 + languageName: node + linkType: hard + +"tslib@npm:2.8.1, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.5.0, tslib@npm:^2.8.0, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a @@ -13508,6 +14545,13 @@ __metadata: languageName: node linkType: hard +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 + languageName: node + linkType: hard + "unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" @@ -13529,6 +14573,24 @@ __metadata: languageName: node linkType: hard +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"use-sync-external-store@npm:^1.5.0": + version: 1.6.0 + resolution: "use-sync-external-store@npm:1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 61a62e910713adfaf91bdb72ff2cd30e5ba83687accaf3b6e75a903b45bf635f5722e3694af30d83a03e92cb533c0a5c699298d2fef639a03ffc86b469f4eee2 + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -13536,6 +14598,13 @@ __metadata: languageName: node linkType: hard +"utila@npm:~0.4": + version: 0.4.0 + resolution: "utila@npm:0.4.0" + checksum: 97ffd3bd2bb80c773429d3fb8396469115cd190dded1e733f190d8b602bd0a1bcd6216b7ce3c4395ee3c79e3c879c19d268dbaae3093564cb169ad1212d436f4 + languageName: node + linkType: hard + "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" @@ -13928,6 +14997,24 @@ __metadata: languageName: node linkType: hard +"webpack-dev-middleware@npm:^6.1.2": + version: 6.1.3 + resolution: "webpack-dev-middleware@npm:6.1.3" + dependencies: + colorette: ^2.0.10 + memfs: ^3.4.12 + mime-types: ^2.1.31 + range-parser: ^1.2.1 + schema-utils: ^4.0.0 + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: ddedaa913cc39d7ac7f971d902f181ecc5c4ab0b91f9eda5923f0ea513ecf458f71046f2ed423cb4fc657c2177fe279186453e395bd1051f0949e265c3124665 + languageName: node + linkType: hard + "webpack-dev-middleware@npm:^7.4.2": version: 7.4.5 resolution: "webpack-dev-middleware@npm:7.4.5" @@ -13992,6 +15079,17 @@ __metadata: languageName: node linkType: hard +"webpack-hot-middleware@npm:^2.25.1": + version: 2.26.1 + resolution: "webpack-hot-middleware@npm:2.26.1" + dependencies: + ansi-html-community: 0.0.8 + html-entities: ^2.1.0 + strip-ansi: ^6.0.0 + checksum: 78513d8d5770c59c3039ce094c49b2e2772b3f1d4ec5c124a7aabe6124a0e08429993b81129649087dc300f496822257e39135bf8b891b51aea197c1b554072a + languageName: node + linkType: hard + "webpack-merge@npm:6.0.1": version: 6.0.1 resolution: "webpack-merge@npm:6.0.1" @@ -14025,6 +15123,13 @@ __metadata: languageName: node linkType: hard +"webpack-virtual-modules@npm:^0.6.0": + version: 0.6.2 + resolution: "webpack-virtual-modules@npm:0.6.2" + checksum: 7e8e1d63f35864c815420cc2f27da8561a1e028255040698a352717de0ba46d3b3faf16f06c1a1965217054c4c2894eb9af53a85451870e919b5707ce9c5822d + languageName: node + linkType: hard + "webpack@npm:5.104.1": version: 5.104.1 resolution: "webpack@npm:5.104.1"