🛠️ Company user search feature (#300)

🛠️ Company user search feature
This commit is contained in:
Montassar Ghanmy
2023-12-20 08:38:59 +01:00
committed by GitHub
parent 8efe4ec194
commit 75dffb1c7a
7 changed files with 281 additions and 273 deletions
@@ -125,6 +125,7 @@
}, },
"drive": { "drive": {
"rootAdmins": "DRIVE_ROOT_ADMINS", "rootAdmins": "DRIVE_ROOT_ADMINS",
"defaultLanguage": "DRIVE_DEFAULT_LANGUAGE" "defaultLanguage": "DRIVE_DEFAULT_LANGUAGE",
"featureSearchUsers": "ENABLE_FEATURE_SEARCH_USERS"
} }
} }
+256 -265
View File
@@ -1,270 +1,261 @@
{ {
"general":{ "general": {
"help_url":false, "help_url": false,
"pricing_plan_url":"", "pricing_plan_url": "",
"app_download_url":"https://twake.app/download", "app_download_url": "https://twake.app/download",
"mobile":{ "mobile": {
"mobile_redirect":"mobile.twake.app", "mobile_redirect": "mobile.twake.app",
"mobile_appstore":"https://apps.apple.com/fr/app/tdrive/id1588764852?l=en", "mobile_appstore": "https://apps.apple.com/fr/app/tdrive/id1588764852?l=en",
"mobile_googleplay":"https://play.google.com/store/apps/details?id=com.tdrive.tdrive&gl=FR" "mobile_googleplay": "https://play.google.com/store/apps/details?id=com.tdrive.tdrive&gl=FR"
}, },
"accounts":{ "accounts": {
"_type":"remote", "_type": "remote",
"type":"internal", "type": "internal",
"internal":{ "internal": {
"disable_account_creation":false "disable_account_creation": false
},
"remote": {
"authority": "http://auth.example.com/",
"client_id": "tdriveweb",
"client_secret": "",
"issuer": "",
"audience": "",
"redirect_uris": [""],
"account_management_url": "http://web.tdrive-console.local/profile?company-code={company_id}",
"collaborators_management_url": "http://web.tdrive-console.local/compaies/{company_id}/users?company-code={company_id}",
"company_management_url": "http://web.tdrive-console.local/companies?company-code={company_id}"
}
}
},
"console": {
"type": "internal"
},
"sentry": {
"dsn": ""
},
"logger": {
"level": "debug"
},
"tracker": {
"type": "segment",
"segment": {
"key": ""
}
},
"webserver": {
"port": 4000,
"logger": {
"level": "info"
},
"cors": {
"origin": "*"
},
"static": {
"root": "./public"
}
},
"websocket": {
"path": "/socket/",
"adapters": {
"types": [],
"redis": {
"host": "redis",
"port": 6379
}
},
"auth": {
"jwt": {
"secret": "supersecret"
}
}
},
"auth": {
"jwt": {
"secret": "supersecret",
"expiration": 3600,
"refresh_expiration": 2592000
}
},
"database": {
"secret": "",
"type": "cassandra",
"mongodb": {
"uri": "mongodb://mongo:27017",
"database": "tdrive"
},
"cassandra": {
"contactPoints": ["scylladb:9042"],
"localDataCenter": "datacenter1",
"keyspace": "tdrive",
"wait": false,
"retries": 10,
"delay": 200
}
},
"message-queue": {
"// possible 'type' values are": "'amqp' or 'local'",
"type": "amqp",
"amqp": {
"urls": ["amqp://guest:guest@rabbitmq:5672"]
}
},
"search": {
"type": "elasticsearch",
"elasticsearch": {
"endpoint": "http://elasticsearch:9200"
}
},
"push": {
"type": false,
"fcm": {
"endpoint": "https://fcm.googleapis.com/fcm/send",
"key": ""
}
},
"storage": {
"secret": "0ea28a329df23220fa814e005bfb671c",
"iv": "1234abcd00000000",
"type": "local",
"S3": {
"endPoint": "play.min.io",
"port": 9000,
"useSSL": false,
"accessKey": "ABCD",
"secretKey": "x1yz"
},
"local": {
"path": "/tdrive"
}
},
"email-pusher": {
"endpoint": "https://api.smtp2go.com/v3/email/send",
"api_key": "secret",
"sender": "noreply@twake.app",
"debug": true
},
"drive": {
"featureSearchUsers": true
},
"applications": {
"grid": [
{
"name": "Chat",
"logo": "/public/img/grid/twake.svg",
"url": "https://web.twake.app/"
},
{
"name": "Mail",
"logo": "/public/img/grid/mail.svg",
"url": "https://tmail.linagora.com/"
},
{
"name": "Drive",
"logo": "/public/img/grid/drive.svg",
"url": "https://tdrive.qa.lin-saas.com/"
},
{
"name": "Calendar",
"logo": "/public/img/grid/calendar.svg",
"url": "https://openpaas.linagora.com/calendar/"
},
{
"name": "Contacts",
"logo": "/public/img/grid/contacts.svg",
"url": "https://openpaas.linagora.com/contacts"
},
{
"name": "Visio",
"logo": "/public/img/grid/visio.svg",
"url": "https://jitsi.linagora.com/"
}
],
"plugins": [
{
"api": {
"private_key": "c1cc66db78e1d3bb4713c55d5ab2"
}, },
"remote":{ "display": {
"authority":"http://auth.example.com/", "tdrive": {
"client_id":"tdriveweb", "files": {
"client_secret":"", "editor": {
"issuer":"", "edition_url": "http://localhost:5000/plugins/onlyoffice/",
"audience":"", "empty_files": [
"redirect_uris":[ {
"" "filename": "Untitled.docx",
], "name": "ONLYOFFICE Word Document",
"account_management_url":"http://web.tdrive-console.local/profile?company-code={company_id}", "url": "/plugins/onlyoffice/assets/empty.docx"
"collaborators_management_url":"http://web.tdrive-console.local/compaies/{company_id}/users?company-code={company_id}", },
"company_management_url":"http://web.tdrive-console.local/companies?company-code={company_id}" {
} "filename": "Untitled.xlsx",
} "name": "ONLYOFFICE Excel Document",
}, "url": "/plugins/onlyoffice/assets/empty.xlsx"
"console":{ },
"type":"internal" {
}, "filename": "Untitled.pptx",
"sentry":{ "name": "ONLYOFFICE PowerPoint Document",
"dsn":"" "url": "/plugins/onlyoffice/assets/empty.pptx"
}, }
"logger":{ ],
"level":"debug" "extensions": [
}, "xlsx",
"tracker":{ "pptx",
"type":"segment", "docx",
"segment":{ "xls",
"key":"" "ppt",
} "doc",
}, "odt",
"webserver":{ "ods",
"port":4000, "odp",
"logger":{ "txt",
"level":"info" "html",
}, "csv"
"cors":{ ],
"origin":"*" "preview_url": "http://localhost:5000/plugins/onlyoffice/?preview=1"
},
"static":{
"root":"./public"
}
},
"websocket":{
"path":"/socket/",
"adapters":{
"types":[
],
"redis":{
"host":"redis",
"port":6379
}
},
"auth":{
"jwt":{
"secret":"supersecret"
}
}
},
"auth":{
"jwt":{
"secret":"supersecret",
"expiration":3600,
"refresh_expiration":2592000
}
},
"database":{
"secret":"",
"type":"cassandra",
"mongodb":{
"uri":"mongodb://mongo:27017",
"database":"tdrive"
},
"cassandra":{
"contactPoints":[
"scylladb:9042"
],
"localDataCenter":"datacenter1",
"keyspace":"tdrive",
"wait":false,
"retries":10,
"delay":200
}
},
"message-queue":{
"// possible 'type' values are":"'amqp' or 'local'",
"type":"amqp",
"amqp":{
"urls":[
"amqp://guest:guest@rabbitmq:5672"
]
}
},
"search":{
"type":"elasticsearch",
"elasticsearch":{
"endpoint":"http://elasticsearch:9200"
}
},
"push":{
"type":false,
"fcm":{
"endpoint":"https://fcm.googleapis.com/fcm/send",
"key":""
}
},
"storage":{
"secret":"0ea28a329df23220fa814e005bfb671c",
"iv":"1234abcd00000000",
"type":"local",
"S3":{
"endPoint":"play.min.io",
"port":9000,
"useSSL":false,
"accessKey":"ABCD",
"secretKey":"x1yz"
},
"local":{
"path":"/tdrive"
}
},
"email-pusher":{
"endpoint":"https://api.smtp2go.com/v3/email/send",
"api_key":"secret",
"sender":"noreply@twake.app",
"debug": true
},
"applications":{
"grid":[
{
"name":"Chat",
"logo":"/public/img/grid/twake.svg",
"url":"https://web.twake.app/"
},
{
"name":"Mail",
"logo":"/public/img/grid/mail.svg",
"url":"https://tmail.linagora.com/"
},
{
"name":"Drive",
"logo":"/public/img/grid/drive.svg",
"url":"https://tdrive.qa.lin-saas.com/"
},
{
"name":"Calendar",
"logo":"/public/img/grid/calendar.svg",
"url":"https://openpaas.linagora.com/calendar/"
},
{
"name":"Contacts",
"logo":"/public/img/grid/contacts.svg",
"url":"https://openpaas.linagora.com/contacts"
},
{
"name":"Visio",
"logo":"/public/img/grid/visio.svg",
"url":"https://jitsi.linagora.com/"
}
],
"plugins":[
{
"api":{
"private_key":"c1cc66db78e1d3bb4713c55d5ab2"
},
"display":{
"tdrive":{
"files":{
"editor":{
"edition_url":"http://localhost:5000/plugins/onlyoffice/",
"empty_files":[
{
"filename":"Untitled.docx",
"name":"ONLYOFFICE Word Document",
"url":"/plugins/onlyoffice/assets/empty.docx"
},
{
"filename":"Untitled.xlsx",
"name":"ONLYOFFICE Excel Document",
"url":"/plugins/onlyoffice/assets/empty.xlsx"
},
{
"filename":"Untitled.pptx",
"name":"ONLYOFFICE PowerPoint Document",
"url":"/plugins/onlyoffice/assets/empty.pptx"
}
],
"extensions":[
"xlsx",
"pptx",
"docx",
"xls",
"ppt",
"doc",
"odt",
"ods",
"odp",
"txt",
"html",
"csv"
],
"preview_url":"http://localhost:5000/plugins/onlyoffice/?preview=1"
}
},
"version":1
} }
}, },
"external_prefix":"/plugins/onlyoffice/", "version": 1
"id":"tdrive_onlyoffice", }
"identity":{ },
"categories":[ "external_prefix": "/plugins/onlyoffice/",
"id": "tdrive_onlyoffice",
], "identity": {
"code":"only_office", "categories": [],
"compatibility":[ "code": "only_office",
"tdrive" "compatibility": ["tdrive"],
], "description": null,
"description":null, "icon": "/plugins/onlyoffice/assets/logo.png",
"icon":"/plugins/onlyoffice/assets/logo.png", "name": "Only Office",
"name":"Only Office", "website": "http://twake.app/"
"website":"http://twake.app/" },
}, "internal_domain": "http://localhost:5000/"
"internal_domain":"http://localhost:5000/" }
} ]
]
}, },
"services":[ "services": [
"auth", "auth",
"push", "push",
"storage", "storage",
"webserver", "webserver",
"websocket", "websocket",
"database", "database",
"cron", "cron",
"search", "search",
"message-queue", "message-queue",
"realtime", "realtime",
"tracker", "tracker",
"general", "general",
"user", "user",
"files", "files",
"workspaces", "workspaces",
"console", "console",
"counter", "counter",
"statistics", "statistics",
"cron", "cron",
"online", "online",
"email-pusher", "email-pusher",
"documents", "documents",
"applications", "applications",
"applications-api", "applications-api",
"tags" "tags"
] ]
} }
@@ -1,4 +1,5 @@
import Company from "./entities/company"; import Company from "./entities/company";
import config from "../../core/config";
import { import {
CompanyFeaturesEnum, CompanyFeaturesEnum,
CompanyLimitsEnum, CompanyLimitsEnum,
@@ -53,6 +54,9 @@ export function formatCompany(
[CompanyFeaturesEnum.CHAT_EDIT_FILES]: true, [CompanyFeaturesEnum.CHAT_EDIT_FILES]: true,
[CompanyFeaturesEnum.CHAT_UNLIMITED_STORAGE]: true, [CompanyFeaturesEnum.CHAT_UNLIMITED_STORAGE]: true,
[CompanyFeaturesEnum.COMPANY_INVITE_MEMBER]: true, [CompanyFeaturesEnum.COMPANY_INVITE_MEMBER]: true,
// use the config value for this one
[CompanyFeaturesEnum.COMPANY_SEARCH_USERS]:
(config.get("drive.featureSearchUsers") as boolean) || true,
}, },
{ {
...(res.plan?.features || {}), ...(res.plan?.features || {}),
@@ -62,6 +66,8 @@ export function formatCompany(
}, },
); );
console.log("🚀🚀 res.plan.features: ", res.plan.features);
return res; return res;
} }
@@ -92,6 +92,7 @@ export const companyObjectSchema = {
[CompanyFeaturesEnum.CHAT_MULTIPLE_WORKSPACES]: { type: "boolean" }, [CompanyFeaturesEnum.CHAT_MULTIPLE_WORKSPACES]: { type: "boolean" },
[CompanyFeaturesEnum.CHAT_UNLIMITED_STORAGE]: { type: "boolean" }, [CompanyFeaturesEnum.CHAT_UNLIMITED_STORAGE]: { type: "boolean" },
[CompanyFeaturesEnum.COMPANY_INVITE_MEMBER]: { type: "boolean" }, [CompanyFeaturesEnum.COMPANY_INVITE_MEMBER]: { type: "boolean" },
[CompanyFeaturesEnum.COMPANY_SEARCH_USERS]: { type: "boolean" },
guests: { type: "number" }, // to rename or delete guests: { type: "number" }, // to rename or delete
members: { type: "number" }, // to rename or delete members: { type: "number" }, // to rename or delete
storage: { type: "number" }, // to rename or delete storage: { type: "number" }, // to rename or delete
@@ -83,6 +83,7 @@ export enum CompanyFeaturesEnum {
CHAT_EDIT_FILES = "chat:edit_files", CHAT_EDIT_FILES = "chat:edit_files",
CHAT_UNLIMITED_STORAGE = "chat:unlimited_storage", CHAT_UNLIMITED_STORAGE = "chat:unlimited_storage",
COMPANY_INVITE_MEMBER = "company:invite_member", COMPANY_INVITE_MEMBER = "company:invite_member",
COMPANY_SEARCH_USERS = "company:search_users",
} }
export type CompanyFeaturesObject = { export type CompanyFeaturesObject = {
@@ -92,6 +93,7 @@ export type CompanyFeaturesObject = {
[CompanyFeaturesEnum.CHAT_EDIT_FILES]?: boolean; [CompanyFeaturesEnum.CHAT_EDIT_FILES]?: boolean;
[CompanyFeaturesEnum.CHAT_UNLIMITED_STORAGE]?: boolean; [CompanyFeaturesEnum.CHAT_UNLIMITED_STORAGE]?: boolean;
[CompanyFeaturesEnum.COMPANY_INVITE_MEMBER]?: boolean; [CompanyFeaturesEnum.COMPANY_INVITE_MEMBER]?: boolean;
[CompanyFeaturesEnum.COMPANY_SEARCH_USERS]?: boolean;
}; };
export type CompanyLimitsObject = { export type CompanyLimitsObject = {
@@ -8,6 +8,7 @@ export enum FeatureNames {
EDIT_FILES = 'chat:edit_files', EDIT_FILES = 'chat:edit_files',
UNLIMITED_STORAGE = 'chat:unlimited_storage', //Currently inactive UNLIMITED_STORAGE = 'chat:unlimited_storage', //Currently inactive
COMPANY_INVITE_MEMBER = 'company:invite_member', COMPANY_INVITE_MEMBER = 'company:invite_member',
COMPANY_SEARCH_USERS = 'company:search_users',
} }
export type FeatureValueType = boolean | number; export type FeatureValueType = boolean | number;
@@ -22,6 +23,7 @@ availableFeaturesWithDefaults.set(FeatureNames.MULTIPLE_WORKSPACES, true);
availableFeaturesWithDefaults.set(FeatureNames.EDIT_FILES, true); availableFeaturesWithDefaults.set(FeatureNames.EDIT_FILES, true);
availableFeaturesWithDefaults.set(FeatureNames.UNLIMITED_STORAGE, true); availableFeaturesWithDefaults.set(FeatureNames.UNLIMITED_STORAGE, true);
availableFeaturesWithDefaults.set(FeatureNames.COMPANY_INVITE_MEMBER, true); availableFeaturesWithDefaults.set(FeatureNames.COMPANY_INVITE_MEMBER, true);
availableFeaturesWithDefaults.set(FeatureNames.COMPANY_SEARCH_USERS, true);
/** /**
* ChannelServiceImpl that allow you to manage feature flipping in Tdrive using react feature toggles * ChannelServiceImpl that allow you to manage feature flipping in Tdrive using react feature toggles
@@ -4,8 +4,11 @@ import { useEffect } from 'react';
import { atom, useRecoilState } from 'recoil'; import { atom, useRecoilState } from 'recoil';
import { InternalAccessManager } from './internal-access'; import { InternalAccessManager } from './internal-access';
import { PublicLinkManager } from './public-link-access'; import { PublicLinkManager } from './public-link-access';
import { useCurrentCompany } from '@features/companies/hooks/use-companies';
import Languages from 'features/global/services/languages-service'; import Languages from 'features/global/services/languages-service';
import FeatureTogglesService, {
FeatureNames,
} from '@features/global/services/feature-toggles-service';
export type AccessModalType = { export type AccessModalType = {
open: boolean; open: boolean;
@@ -32,17 +35,19 @@ export const AccessModal = () => {
const AccessModalContent = ({ id }: { id: string }) => { const AccessModalContent = ({ id }: { id: string }) => {
const { item, access, refresh } = useDriveItem(id); const { item, access, refresh } = useDriveItem(id);
const { company, refresh: refreshCompany } = useCurrentCompany();
useEffect(() => { useEffect(() => {
refresh(id); refresh(id);
refreshCompany();
}, []); }, []);
console.log(item?.access_info?.public?.level, 'item');
return ( return (
<ModalContent title={Languages.t('components.item_context_menu.manage_access_to') + " " + item?.name}> <ModalContent
title={Languages.t('components.item_context_menu.manage_access_to') + ' ' + item?.name}
>
<PublicLinkManager id={id} disabled={access !== 'manage'} /> <PublicLinkManager id={id} disabled={access !== 'manage'} />
<InternalAccessManager id={id} disabled={access !== 'manage'} /> {FeatureTogglesService.isActiveFeatureName(FeatureNames.COMPANY_SEARCH_USERS) && (
<InternalAccessManager id={id} disabled={access !== 'manage'} />
)}
</ModalContent> </ModalContent>
); );
}; };