add object settings permission tab (#10159)

## Context
Introducing the "Permissions" tab in the role page

Next: Need to address some css improvements, some components might be
reusable and it still does not fully match the figma (icon missing for
permission types for example). We decided to merge like this for now so
we have something functional and I will update the code in an upcoming
PR

<img width="633" alt="Screenshot 2025-02-12 at 13 54 16"
src="https://github.com/user-attachments/assets/762db5d7-e0a6-4ee1-b299-24de6645bad1"
/>
This commit is contained in:
Weiko
2025-02-12 18:49:50 +01:00
committed by GitHub
parent 61881d6d0f
commit 193ef432a0
18 changed files with 479 additions and 160 deletions

View File

@ -32,7 +32,6 @@ import { TypeORMService } from 'src/database/typeorm/typeorm.service';
import { InjectCacheStorage } from 'src/engine/core-modules/cache-storage/decorators/cache-storage.decorator';
import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service';
import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity';
import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service';
import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/field-metadata.service';
@ -43,12 +42,11 @@ import { PETS_METADATA_SEEDS } from 'src/engine/seeder/metadata-seeds/pets-metad
import { SURVEY_RESULTS_METADATA_SEEDS } from 'src/engine/seeder/metadata-seeds/survey-results-metadata-seeds';
import { SeederService } from 'src/engine/seeder/seeder.service';
import { shouldSeedWorkspaceFavorite } from 'src/engine/utils/should-seed-workspace-favorite';
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
import { createWorkspaceViews } from 'src/engine/workspace-manager/standard-objects-prefill-data/create-workspace-views';
import { seedViewWithDemoData } from 'src/engine/workspace-manager/standard-objects-prefill-data/seed-view-with-demo-data';
import { opportunitiesTableByStageView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/opportunity-table-by-stage.view';
import { WorkspaceManagerService } from 'src/engine/workspace-manager/workspace-manager.service';
import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids';
import { WorkspaceSyncMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service';
// TODO: implement dry-run
@Command({
@ -63,14 +61,12 @@ export class DataSeedWorkspaceCommand extends CommandRunner {
constructor(
private readonly dataSourceService: DataSourceService,
private readonly typeORMService: TypeORMService,
private readonly workspaceSyncMetadataService: WorkspaceSyncMetadataService,
private readonly workspaceDataSourceService: WorkspaceDataSourceService,
private readonly fieldMetadataService: FieldMetadataService,
private readonly objectMetadataService: ObjectMetadataService,
@InjectCacheStorage(CacheStorageNamespace.EngineWorkspace)
private readonly workspaceSchemaCache: CacheStorageService,
private readonly featureFlagService: FeatureFlagService,
private readonly seederService: SeederService,
private readonly workspaceManagerService: WorkspaceManagerService,
) {
super();
}
@ -100,21 +96,7 @@ export class DataSeedWorkspaceCommand extends CommandRunner {
await rawDataSource.destroy();
const schemaName =
await this.workspaceDataSourceService.createWorkspaceDBSchema(
workspaceId,
);
const dataSourceMetadata =
await this.dataSourceService.createDataSourceMetadata(
workspaceId,
schemaName,
);
await this.workspaceSyncMetadataService.synchronize({
workspaceId: workspaceId,
dataSourceId: dataSourceMetadata.id,
});
await this.workspaceManagerService.initDev(workspaceId);
}
async seedWorkspace(workspaceId: string) {

View File

@ -4,6 +4,12 @@ import { DEMO_SEED_USER_IDS } from 'src/database/typeorm-seeds/core/demo/users';
const tableName = 'userWorkspace';
export const DEV_SEED_USER_WORKSPACE_IDS = {
NOAH: '20202020-9e3b-46d4-a556-88b9ddc2b534',
HUGO: '20202020-3957-4908-9c36-2929a23f8457',
TIM: '20202020-9e3b-46d4-a556-88b9ddc2b015',
};
export const seedUserWorkspaces = async (
workspaceDataSource: DataSource,
schemaName: string,
@ -12,18 +18,21 @@ export const seedUserWorkspaces = async (
await workspaceDataSource
.createQueryBuilder()
.insert()
.into(`${schemaName}.${tableName}`, ['userId', 'workspaceId'])
.into(`${schemaName}.${tableName}`, ['id', 'userId', 'workspaceId'])
.orIgnore()
.values([
{
id: DEV_SEED_USER_WORKSPACE_IDS.NOAH,
userId: DEMO_SEED_USER_IDS.NOAH,
workspaceId: workspaceId,
},
{
id: DEV_SEED_USER_WORKSPACE_IDS.HUGO,
userId: DEMO_SEED_USER_IDS.HUGO,
workspaceId: workspaceId,
},
{
id: DEV_SEED_USER_WORKSPACE_IDS.TIM,
userId: DEMO_SEED_USER_IDS.TIM,
workspaceId: workspaceId,
},

View File

@ -1,9 +1,9 @@
import { DataSource } from 'typeorm';
import { seedFeatureFlags } from 'src/database/typeorm-seeds/core/feature-flags';
import { seedUserWorkspaces } from 'src/database/typeorm-seeds/core/user-workspaces';
import { seedUsers } from 'src/database/typeorm-seeds/core/users';
import { seedWorkspaces } from 'src/database/typeorm-seeds/core/workspaces';
import { seedFeatureFlags } from 'src/database/typeorm-seeds/core/feature-flags';
import { seedUserWorkspaces } from 'src/database/typeorm-seeds/core/userWorkspaces';
export const seedCoreSchema = async (
workspaceDataSource: DataSource,

View File

@ -1,32 +1,43 @@
import { DataSource } from 'typeorm';
import { DEV_SEED_USER_IDS } from 'src/database/typeorm-seeds/core/users';
import {
SEED_APPLE_WORKSPACE_ID,
SEED_ACME_WORKSPACE_ID,
SEED_APPLE_WORKSPACE_ID,
} from 'src/database/typeorm-seeds/core/workspaces';
import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { DEV_SEED_USER_IDS } from 'src/database/typeorm-seeds/core/users';
const tableName = 'userWorkspace';
export const DEV_SEED_USER_WORKSPACE_IDS = {
TIM: '20202020-9e3b-46d4-a556-88b9ddc2b035',
JONY: '20202020-3957-4908-9c36-2929a23f8353',
PHIL: '20202020-7169-42cf-bc47-1cfef15264b1',
TIM_ACME: '20202020-9e3b-46d4-a556-88b9ddc2b436',
};
export const seedUserWorkspaces = async (
workspaceDataSource: DataSource,
schemaName: string,
workspaceId: string,
) => {
let userWorkspaces: Pick<UserWorkspace, 'userId' | 'workspaceId'>[] = [];
let userWorkspaces: Pick<UserWorkspace, 'id' | 'userId' | 'workspaceId'>[] =
[];
if (workspaceId === SEED_APPLE_WORKSPACE_ID) {
userWorkspaces = [
{
id: DEV_SEED_USER_WORKSPACE_IDS.TIM,
userId: DEV_SEED_USER_IDS.TIM,
workspaceId,
},
{
id: DEV_SEED_USER_WORKSPACE_IDS.JONY,
userId: DEV_SEED_USER_IDS.JONY,
workspaceId,
},
{
id: DEV_SEED_USER_WORKSPACE_IDS.PHIL,
userId: DEV_SEED_USER_IDS.PHIL,
workspaceId,
},
@ -36,6 +47,7 @@ export const seedUserWorkspaces = async (
if (workspaceId === SEED_ACME_WORKSPACE_ID) {
userWorkspaces = [
{
id: DEV_SEED_USER_WORKSPACE_IDS.TIM_ACME,
userId: DEV_SEED_USER_IDS.TIM,
workspaceId,
},
@ -44,7 +56,7 @@ export const seedUserWorkspaces = async (
await workspaceDataSource
.createQueryBuilder()
.insert()
.into(`${schemaName}.${tableName}`, ['userId', 'workspaceId'])
.into(`${schemaName}.${tableName}`, ['id', 'userId', 'workspaceId'])
.orIgnore()
.values(userWorkspaces)
.execute();