From 87aec670b527ec1bd4a0ac603db2888fc6cbd5f5 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Tue, 4 Nov 2025 17:16:42 -0300 Subject: [PATCH 1/9] Add shield icons --- android/app/src/main/assets/fonts/custom.ttf | Bin 59536 -> 60564 bytes app/containers/CustomIcon/mappedIcons.js | 2 ++ app/containers/CustomIcon/selection.json | 2 +- ios/custom.ttf | Bin 59536 -> 60564 bytes 4 files changed, 3 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/assets/fonts/custom.ttf b/android/app/src/main/assets/fonts/custom.ttf index 410ec49c02906ac08dad8828039e339c8a15c963..b0758f2fa60ec7d33ab136418ed1aa939022731b 100644 GIT binary patch delta 1263 zcmZuxO>7%g5T1E&f8N^JeO~W+O^DmtyYWv5CH`B-G(R9N90Do|6{n!ol#&S5X-X3* zaHw)fdm8uhe}wSxu6!QNR_Gr34(Ghssu`yUDFCE*1VlJ^Jc#JX5{zY z{+7S{J?{YmKoT~AL-pkI6Lp!^J@QD=qD zs9(MIJJ}lmKW;9c?Yw-v_tJX+Ki#GC)-pNtua$2A_Nru$E_c^9KG>lh?41JOAD%mZ z=JC#*n~!b*{6bE=-tBCx!d)x^{Cb@n`IS!h>~{z4kH{uKd}H;oW)48C13ZoNZMGlA{4JtsP|ek*esQ+evNXgrCN*=l%hC^ zaglM1Q3-y6c0qX-?~@`r6rz|U&|1adTTO9qfDaQQ0rdC)doiPUPRa|73&@iA!?mSm7>;g-5qlrr{bvYc!sIW z&LvHoF{UI1QyAk+5vp(!2Y)b?Ye`iV3i;?nBqwqqigjxCWa zWE{E1g%rq96;e;Qh9GMI?NG{}R^AetrJ*cHRj3(%NcvK6m2=e|3W9QLIK%pe(XQn4 zrh}Mp6O?;!85tsu6pOu)q$`X}A~oiPb93P#RNC!Iv`oh_Y2j6WahR*ZSP6m^L#TXs z5wB^e={gD~n8q~Ml;sT7Ti1!56Eh=PDk=&hC(>lZ{W=K>xP<79rINNr)u*X9>>-Mr zeJQH8o<3%fo0vrzq&ZC}9zx`$j2Cs(2$9iVV+uENX_Xulp)0i^8*#Q(u4T){XyRdO zsnQO0ige7SXx6qt-=D35T^t!H>Y6p2Fy&kr&gI)r#m!dQPsZI+$9-v8^HV1l(&>d0 zQ}dQ3f!)6$GjNh_Mcq4s(PaqiLP#pJEt|)C|MSNwzJ2BD9mvTZiz8>FRGjkU|i64=69K#(y}+&l5dSTd#hxyC|pcKvIdWKRqat po}q!>9=$b*w|5tAz0bFw`$2rVcMXRw%wOooxwkRcy|Mop{ssNM!|DJ4 delta 272 zcmbPolX=2L=6VK31_lOhh6V;^1_S?KeItG$b`hY+9w1Ig&P^;354)Vrz`!U2<98I7#Qw%WTYmhXh-+~`45583}zWX0ro>Ir+|D5AYUaT zx1?g>0+7_h7zPIBB{})YmWeGryUsB%JOv6eUdc_YC}8-;sK~(Z>$5Um4^NAl6!VJ~N)*<|_j?3rHQq n6PZ?^aS(d4%u{p5mzzVLE@9sE@(Lpd*zYeH7%g5T1E&f8N^JeO~W+O^DmtyYWv5CH`B-G(R9N90Do|6{n!ol#&S5X-X3* zaHw)fdm8uhe}wSxu6!QNR_Gr34(Ghssu`yUDFCE*1VlJ^Jc#JX5{zY z{+7S{J?{YmKoT~AL-pkI6Lp!^J@QD=qD zs9(MIJJ}lmKW;9c?Yw-v_tJX+Ki#GC)-pNtua$2A_Nru$E_c^9KG>lh?41JOAD%mZ z=JC#*n~!b*{6bE=-tBCx!d)x^{Cb@n`IS!h>~{z4kH{uKd}H;oW)48C13ZoNZMGlA{4JtsP|ek*esQ+evNXgrCN*=l%hC^ zaglM1Q3-y6c0qX-?~@`r6rz|U&|1adTTO9qfDaQQ0rdC)doiPUPRa|73&@iA!?mSm7>;g-5qlrr{bvYc!sIW z&LvHoF{UI1QyAk+5vp(!2Y)b?Ye`iV3i;?nBqwqqigjxCWa zWE{E1g%rq96;e;Qh9GMI?NG{}R^AetrJ*cHRj3(%NcvK6m2=e|3W9QLIK%pe(XQn4 zrh}Mp6O?;!85tsu6pOu)q$`X}A~oiPb93P#RNC!Iv`oh_Y2j6WahR*ZSP6m^L#TXs z5wB^e={gD~n8q~Ml;sT7Ti1!56Eh=PDk=&hC(>lZ{W=K>xP<79rINNr)u*X9>>-Mr zeJQH8o<3%fo0vrzq&ZC}9zx`$j2Cs(2$9iVV+uENX_Xulp)0i^8*#Q(u4T){XyRdO zsnQO0ige7SXx6qt-=D35T^t!H>Y6p2Fy&kr&gI)r#m!dQPsZI+$9-v8^HV1l(&>d0 zQ}dQ3f!)6$GjNh_Mcq4s(PaqiLP#pJEt|)C|MSNwzJ2BD9mvTZiz8>FRGjkU|i64=69K#(y}+&l5dSTd#hxyC|pcKvIdWKRqat po}q!>9=$b*w|5tAz0bFw`$2rVcMXRw%wOooxwkRcy|Mop{ssNM!|DJ4 delta 272 zcmbPolX=2L=6VK31_lOhh6V;^1_S?KeItG$b`hY+9w1Ig&P^;354)Vrz`!U2<98I7#Qw%WTYmhXh-+~`45583}zWX0ro>Ir+|D5AYUaT zx1?g>0+7_h7zPIBB{})YmWeGryUsB%JOv6eUdc_YC}8-;sK~(Z>$5Um4^NAl6!VJ~N)*<|_j?3rHQq n6PZ?^aS(d4%u{p5mzzVLE@9sE@(Lpd*zYeH Date: Tue, 4 Nov 2025 17:36:29 -0300 Subject: [PATCH 2/9] Add subscription.abacAttributes --- app/lib/database/model/Subscription.js | 5 ++++- app/lib/database/model/migrations.js | 9 +++++++++ app/lib/database/schema/app.js | 5 +++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/lib/database/model/Subscription.js b/app/lib/database/model/Subscription.js index 396817283bb..50eb2260cf2 100644 --- a/app/lib/database/model/Subscription.js +++ b/app/lib/database/model/Subscription.js @@ -153,6 +153,8 @@ export default class Subscription extends Model { @field('federated') federated; + @json('abac_attributes', sanitizer) abacAttributes; + asPlain() { return { _id: this._id, @@ -219,7 +221,8 @@ export default class Subscription extends Model { usersCount: this.usersCount, source: this.source, disableNotifications: this.disableNotifications, - federated: this.federated + federated: this.federated, + abacAttributes: this.abacAttributes }; } } diff --git a/app/lib/database/model/migrations.js b/app/lib/database/model/migrations.js index 601ece52607..6b0cef3b7c3 100644 --- a/app/lib/database/model/migrations.js +++ b/app/lib/database/model/migrations.js @@ -331,6 +331,15 @@ export default schemaMigrations({ columns: [{ name: 'federated', type: 'boolean', isOptional: true }] }) ] + }, + { + toVersion: 28, + steps: [ + addColumns({ + table: 'subscriptions', + columns: [{ name: 'abac_attributes', type: 'string', isOptional: true }] + }) + ] } ] }); diff --git a/app/lib/database/schema/app.js b/app/lib/database/schema/app.js index acca231cc08..f60705b7a17 100644 --- a/app/lib/database/schema/app.js +++ b/app/lib/database/schema/app.js @@ -1,7 +1,7 @@ import { appSchema, tableSchema } from '@nozbe/watermelondb'; export default appSchema({ - version: 27, + version: 28, tables: [ tableSchema({ name: 'subscriptions', @@ -70,7 +70,8 @@ export default appSchema({ { name: 'users_count', type: 'number', isOptional: true }, { name: 'unmuted', type: 'string', isOptional: true }, { name: 'disable_notifications', type: 'boolean', isOptional: true }, - { name: 'federated', type: 'boolean', isOptional: true } + { name: 'federated', type: 'boolean', isOptional: true }, + { name: 'abac_attributes', type: 'string', isOptional: true } ] }), tableSchema({ From b85a67ecf65a7554f1a3f9a97fa8f8f65e9d10a0 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Tue, 4 Nov 2025 18:01:56 -0300 Subject: [PATCH 3/9] Add stories and snapshots --- .../RoomHeader/RoomHeader.stories.tsx | 2 + app/containers/RoomHeader/RoomHeader.tsx | 8 +- .../__snapshots__/RoomHeader.test.tsx.snap | 286 +++- app/containers/RoomHeader/index.tsx | 7 +- app/containers/RoomItem/IconOrAvatar.tsx | 4 +- app/containers/RoomItem/RoomItem.stories.tsx | 2 + app/containers/RoomItem/RoomItem.tsx | 5 +- app/containers/RoomItem/TypeIcon.tsx | 27 +- .../__snapshots__/RoomItem.test.tsx.snap | 1262 ++++++++++++++++- app/containers/RoomItem/index.tsx | 1 + app/containers/RoomItem/interfaces.ts | 3 + .../RoomTypeIcon/RoomTypeIcon.stories.tsx | 2 + .../__snapshots__/RoomTypeIcon.test.tsx.snap | 62 + app/containers/RoomTypeIcon/index.tsx | 9 +- app/definitions/ISubscription.ts | 1 + .../helpers/mergeSubscriptionsRooms.ts | 1 + app/views/RoomActionsView/index.tsx | 1 + .../components/RoomInfoViewTitle.tsx | 1 + app/views/RoomView/index.tsx | 1 + 19 files changed, 1643 insertions(+), 42 deletions(-) diff --git a/app/containers/RoomHeader/RoomHeader.stories.tsx b/app/containers/RoomHeader/RoomHeader.stories.tsx index 7ea6952f625..3187cb4f0b6 100644 --- a/app/containers/RoomHeader/RoomHeader.stories.tsx +++ b/app/containers/RoomHeader/RoomHeader.stories.tsx @@ -55,6 +55,8 @@ export const Icons = () => ( } /> } /> } /> + } /> + } /> ); diff --git a/app/containers/RoomHeader/RoomHeader.tsx b/app/containers/RoomHeader/RoomHeader.tsx index ec65eb792ea..bd2a95d89d5 100644 --- a/app/containers/RoomHeader/RoomHeader.tsx +++ b/app/containers/RoomHeader/RoomHeader.tsx @@ -7,7 +7,7 @@ import I18n from '../../i18n'; import sharedStyles from '../../views/Styles'; import { MarkdownPreview } from '../markdown'; import RoomTypeIcon from '../RoomTypeIcon'; -import { type TUserStatus, type IOmnichannelSource } from '../../definitions'; +import { type TUserStatus, type IOmnichannelSource, type ISubscription } from '../../definitions'; import { useTheme } from '../../theme'; import { useAppSelector } from '../../lib/hooks/useAppSelector'; import useStatusAccessibilityLabel from '../../lib/hooks/useStatusAccessibilityLabel'; @@ -80,6 +80,7 @@ interface IRoomHeader { sourceType?: IOmnichannelSource; disabled?: boolean; rightButtonsWidth?: number; + abacAttributes?: ISubscription['abacAttributes']; } const SubTitle = React.memo(({ usersTyping, subtitle, renderFunc, scale }: TRoomHeaderSubTitle) => { @@ -148,7 +149,8 @@ const Header = React.memo( testID, usersTyping = [], sourceType, - disabled + disabled, + abacAttributes }: IRoomHeader) => { const statusAccessibilityLabel = useStatusAccessibilityLabel({ isGroupChat, @@ -182,6 +184,7 @@ const Header = React.memo( isGroupChat={isGroupChat} status={status} teamMain={teamMain} + abacAttributes={abacAttributes} /> {parentTitle} @@ -208,6 +211,7 @@ const Header = React.memo( status={status} teamMain={teamMain} sourceType={sourceType} + abacAttributes={abacAttributes} /> )} diff --git a/app/containers/RoomHeader/__snapshots__/RoomHeader.test.tsx.snap b/app/containers/RoomHeader/__snapshots__/RoomHeader.test.tsx.snap index f75b0a2470e..089fa4625c8 100644 --- a/app/containers/RoomHeader/__snapshots__/RoomHeader.test.tsx.snap +++ b/app/containers/RoomHeader/__snapshots__/RoomHeader.test.tsx.snap @@ -1575,6 +1575,266 @@ exports[`Story Snapshots: Icons should match snapshot 1`] = ` , + + + + + + +  + + + classified + + + + + + , + + + + + + +  + + + classified + + + + + + , ] `; @@ -1611,7 +1871,7 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={13} + handlerTag={15} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1774,7 +2034,7 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={14} + handlerTag={16} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1937,7 +2197,7 @@ exports[`Story Snapshots: Themes should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={15} + handlerTag={17} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -2105,7 +2365,7 @@ exports[`Story Snapshots: Thread should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={16} + handlerTag={18} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -2280,7 +2540,7 @@ preview delayLongPress={600} enabled={true} exclusive={true} - handlerTag={17} + handlerTag={19} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -2460,7 +2720,7 @@ exports[`Story Snapshots: TitleSubtitle should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={18} + handlerTag={20} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -2590,7 +2850,7 @@ exports[`Story Snapshots: TitleSubtitle should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={19} + handlerTag={21} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -2720,7 +2980,7 @@ exports[`Story Snapshots: TitleSubtitle should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={20} + handlerTag={22} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -2883,7 +3143,7 @@ exports[`Story Snapshots: TitleSubtitle should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={21} + handlerTag={23} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -3046,7 +3306,7 @@ exports[`Story Snapshots: TitleSubtitle should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={22} + handlerTag={24} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -3215,7 +3475,7 @@ exports[`Story Snapshots: Typing should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={23} + handlerTag={25} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -3378,7 +3638,7 @@ exports[`Story Snapshots: Typing should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={24} + handlerTag={26} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -3541,7 +3801,7 @@ exports[`Story Snapshots: Typing should match snapshot 1`] = ` delayLongPress={600} enabled={true} exclusive={true} - handlerTag={25} + handlerTag={27} handlerType="NativeViewGestureHandler" hitSlop={ { diff --git a/app/containers/RoomHeader/index.tsx b/app/containers/RoomHeader/index.tsx index 838c5eb62cc..50a3df02f9d 100644 --- a/app/containers/RoomHeader/index.tsx +++ b/app/containers/RoomHeader/index.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { shallowEqual, useSelector } from 'react-redux'; -import { type IApplicationState, type TUserStatus, type IOmnichannelSource, type IVisitor } from '../../definitions'; +import type { IApplicationState, TUserStatus, IOmnichannelSource, IVisitor, ISubscription } from '../../definitions'; import I18n from '../../i18n'; import RoomHeader from './RoomHeader'; import { useResponsiveLayout } from '../../lib/hooks/useResponsiveLayout/useResponsiveLayout'; @@ -21,6 +21,7 @@ interface IRoomHeaderContainerProps { sourceType?: IOmnichannelSource; visitor?: IVisitor; disabled?: boolean; + abacAttributes?: ISubscription['abacAttributes']; } const RoomHeaderContainer = React.memo( @@ -38,7 +39,8 @@ const RoomHeaderContainer = React.memo( type, sourceType, visitor, - disabled + disabled, + abacAttributes }: IRoomHeaderContainerProps) => { let subtitle: string | undefined; let statusVisitor: TUserStatus | undefined; @@ -89,6 +91,7 @@ const RoomHeaderContainer = React.memo( onPress={onPress} sourceType={sourceType} disabled={disabled} + abacAttributes={abacAttributes} /> ); } diff --git a/app/containers/RoomItem/IconOrAvatar.tsx b/app/containers/RoomItem/IconOrAvatar.tsx index 5a5c6de9ad5..59d054864b4 100644 --- a/app/containers/RoomItem/IconOrAvatar.tsx +++ b/app/containers/RoomItem/IconOrAvatar.tsx @@ -20,7 +20,8 @@ const IconOrAvatar = ({ teamMain, showLastMessage, displayMode, - sourceType + sourceType, + abacAttributes }: IIconOrAvatar): React.ReactElement | null => { const { rowHeight } = useResponsiveLayout(); @@ -43,6 +44,7 @@ const IconOrAvatar = ({ size={24} style={{ marginRight: 12 }} sourceType={sourceType} + abacAttributes={abacAttributes} /> ); diff --git a/app/containers/RoomItem/RoomItem.stories.tsx b/app/containers/RoomItem/RoomItem.stories.tsx index 962de2ab91d..ccfcf93893b 100644 --- a/app/containers/RoomItem/RoomItem.stories.tsx +++ b/app/containers/RoomItem/RoomItem.stories.tsx @@ -71,6 +71,8 @@ export const Type = () => ( + + ); diff --git a/app/containers/RoomItem/RoomItem.tsx b/app/containers/RoomItem/RoomItem.tsx index 3b6454fbbc6..75f302422b1 100644 --- a/app/containers/RoomItem/RoomItem.tsx +++ b/app/containers/RoomItem/RoomItem.tsx @@ -53,7 +53,8 @@ const RoomItem = ({ displayMode, sourceType, hideMentionStatus, - accessibilityDate + accessibilityDate, + abacAttributes }: IRoomItemProps) => { 'use memo'; @@ -112,6 +113,7 @@ const RoomItem = ({ isGroupChat={isGroupChat} teamMain={teamMain} sourceType={sourceType} + abacAttributes={abacAttributes} /> ) : null} @@ -153,6 +155,7 @@ const RoomItem = ({ size={22} style={{ marginRight: 8 }} sourceType={sourceType} + abacAttributes={abacAttributes} /> <Title name={name} hideUnreadStatus={hideUnreadStatus} alert={alert} /> {autoJoin ? <Tag name={I18n.t('Auto-join')} /> : null} diff --git a/app/containers/RoomItem/TypeIcon.tsx b/app/containers/RoomItem/TypeIcon.tsx index ad14a7037f0..b2556a8770c 100644 --- a/app/containers/RoomItem/TypeIcon.tsx +++ b/app/containers/RoomItem/TypeIcon.tsx @@ -3,17 +3,20 @@ import React from 'react'; import RoomTypeIcon from '../RoomTypeIcon'; import { type ITypeIconProps } from './interfaces'; -const TypeIcon = React.memo(({ userId, type, prid, status, isGroupChat, teamMain, size, style, sourceType }: ITypeIconProps) => ( - <RoomTypeIcon - userId={userId} - type={prid ? 'discussion' : type} - isGroupChat={isGroupChat} - status={status} - teamMain={teamMain} - size={size} - style={style} - sourceType={sourceType} - /> -)); +const TypeIcon = React.memo( + ({ userId, type, prid, status, isGroupChat, teamMain, size, style, sourceType, abacAttributes }: ITypeIconProps) => ( + <RoomTypeIcon + userId={userId} + type={prid ? 'discussion' : type} + isGroupChat={isGroupChat} + status={status} + teamMain={teamMain} + size={size} + style={style} + sourceType={sourceType} + abacAttributes={abacAttributes} + /> + ) +); export default TypeIcon; diff --git a/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap b/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap index a57f8ad2e8e..9e8141dec08 100644 --- a/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap +++ b/app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap @@ -32397,6 +32397,1252 @@ exports[`Story Snapshots: Type should match snapshot 1`] = ` width={48} /> </View> + <View + style={ + [ + { + "borderBottomWidth": 0.5, + "flex": 1, + "paddingRight": 14, + "paddingVertical": 10, + }, + { + "borderColor": "#CBCED1", + }, + ] + } + > + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + "width": "100%", + }, + { + "flex": 1, + }, + ] + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#1F2329", + "fontSize": 22, + }, + [ + { + "lineHeight": 22, + }, + [ + { + "marginRight": 4, + }, + { + "marginRight": 8, + }, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + ellipsizeMode="tail" + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "flex": 1, + "fontFamily": "Inter", + "fontSize": 17, + "fontWeight": "500", + "textAlign": "left", + }, + undefined, + { + "color": "#1F2329", + }, + ] + } + > + rocket.cat + </Text> + <View + style={ + { + "alignItems": "flex-end", + } + } + > + <Text + ellipsizeMode="tail" + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "400", + "marginLeft": 4, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + undefined, + ] + } + > + 10:00 + </Text> + </View> + </View> + </View> + </View> + </View> + </RNGestureHandlerButton> + </View> + </View>, + <View + collapsable={false} + > + <View + pointerEvents="box-none" + style={ + [ + { + "left": 0, + "position": "absolute", + "right": 0, + }, + { + "flexDirection": "row", + "left": 0, + "position": "absolute", + "right": 0, + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "right": 0, + "top": 0, + }, + { + "backgroundColor": "#1D74F5", + "right": "100%", + "width": 1500, + }, + { + "height": 75, + }, + { + "transform": [ + { + "translateX": 0, + }, + ], + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "right": 0, + "top": 0, + }, + { + "height": 75, + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Mark read" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={287} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 28, + }, + [ + { + "lineHeight": 28, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + </View> + </View> + <View + pointerEvents="box-none" + style={ + [ + { + "flexDirection": "row", + "left": 0, + "position": "absolute", + "right": 0, + }, + { + "height": 75, + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "top": 0, + }, + { + "backgroundColor": "#8E6300", + "left": "100%", + "width": 750, + }, + { + "height": 75, + }, + { + "transform": [ + { + "translateX": 0, + }, + ], + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Favorite" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={288} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "backgroundColor": "#8E6300", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 28, + }, + [ + { + "lineHeight": 28, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "top": 0, + }, + { + "backgroundColor": "#9EA2A8", + "left": "100%", + "width": 1500, + }, + { + "height": 75, + }, + { + "transform": [ + { + "translateX": 80, + }, + ], + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Hide" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={289} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "backgroundColor": "#9EA2A8", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 28, + }, + [ + { + "lineHeight": 28, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + </View> + <View + style={ + { + "transform": [ + { + "translateX": 0, + }, + ], + } + } + > + <RNGestureHandlerButton + activeOpacity={1} + collapsable={false} + delayLongPress={600} + handlerTag={290} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + rippleColor="#E4E7EA" + style={ + [ + { + "backgroundColor": "#FFFFFF", + "borderRadius": undefined, + "margin": undefined, + "marginBottom": undefined, + "marginEnd": undefined, + "marginHorizontal": undefined, + "marginLeft": undefined, + "marginRight": undefined, + "marginStart": undefined, + "marginTop": undefined, + "marginVertical": undefined, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="#E4E7EA" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "#E4E7EA", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <View + style={{}} + > + <View + accessibilityLabel="rocket.cat. private team. undefined. " + accessibilityRole="button" + accessible={true} + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "paddingLeft": 14, + }, + { + "height": 75, + }, + ] + } + > + <View + accessibilityLabel="rocket.cat's avatar" + accessible={true} + style={ + [ + { + "borderRadius": 4, + "height": 48, + "width": 48, + }, + { + "marginRight": 10, + }, + ] + } + testID="avatar" + > + <ViewManagerAdapter_ExpoImage + borderRadius={4} + containerViewRef={"[React.ref]"} + contentFit="cover" + contentPosition={ + { + "left": "50%", + "top": "50%", + } + } + height={48} + nativeViewRef={"[React.ref]"} + onError={[Function]} + onLoad={[Function]} + onLoadStart={[Function]} + onProgress={[Function]} + placeholder={[]} + priority="high" + source={ + [ + { + "headers": { + "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)", + }, + "uri": "https://open.rocket.chat/avatar/@rocket.cat?format=png&size=96", + }, + ] + } + style={ + { + "borderRadius": 4, + "height": 48, + "width": 48, + } + } + transition={null} + width={48} + /> + </View> + <View + style={ + [ + { + "borderBottomWidth": 0.5, + "flex": 1, + "paddingRight": 14, + "paddingVertical": 10, + }, + { + "borderColor": "#CBCED1", + }, + ] + } + > + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + "width": "100%", + }, + { + "flex": 1, + }, + ] + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#1F2329", + "fontSize": 22, + }, + [ + { + "lineHeight": 22, + }, + [ + { + "marginRight": 4, + }, + { + "marginRight": 8, + }, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + ellipsizeMode="tail" + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "flex": 1, + "fontFamily": "Inter", + "fontSize": 17, + "fontWeight": "500", + "textAlign": "left", + }, + undefined, + { + "color": "#1F2329", + }, + ] + } + > + rocket.cat + </Text> + <View + style={ + { + "alignItems": "flex-end", + } + } + > + <Text + ellipsizeMode="tail" + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "400", + "marginLeft": 4, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + undefined, + ] + } + > + 10:00 + </Text> + </View> + </View> + </View> + </View> + </View> + </RNGestureHandlerButton> + </View> + </View>, + <View + collapsable={false} + > + <View + pointerEvents="box-none" + style={ + [ + { + "left": 0, + "position": "absolute", + "right": 0, + }, + { + "flexDirection": "row", + "left": 0, + "position": "absolute", + "right": 0, + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "right": 0, + "top": 0, + }, + { + "backgroundColor": "#1D74F5", + "right": "100%", + "width": 1500, + }, + { + "height": 75, + }, + { + "transform": [ + { + "translateX": 0, + }, + ], + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "right": 0, + "top": 0, + }, + { + "height": 75, + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Mark read" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={291} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 28, + }, + [ + { + "lineHeight": 28, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + </View> + </View> + <View + pointerEvents="box-none" + style={ + [ + { + "flexDirection": "row", + "left": 0, + "position": "absolute", + "right": 0, + }, + { + "height": 75, + }, + ] + } + > + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "top": 0, + }, + { + "backgroundColor": "#8E6300", + "left": "100%", + "width": 750, + }, + { + "height": 75, + }, + { + "transform": [ + { + "translateX": 0, + }, + ], + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Favorite" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={292} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "backgroundColor": "#8E6300", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 28, + }, + [ + { + "lineHeight": 28, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + <View + style={ + [ + { + "justifyContent": "center", + "position": "absolute", + "top": 0, + }, + { + "backgroundColor": "#9EA2A8", + "left": "100%", + "width": 1500, + }, + { + "height": 75, + }, + { + "transform": [ + { + "translateX": 80, + }, + ], + }, + ] + } + > + <RNGestureHandlerButton + accessibilityLabel="Hide" + accessible={true} + activeOpacity={0.105} + collapsable={false} + delayLongPress={600} + handlerTag={293} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + style={ + [ + { + "alignItems": "center", + "backgroundColor": "#9EA2A8", + "height": "100%", + "justifyContent": "center", + "width": 80, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="black" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "black", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#FFFFFF", + "fontSize": 28, + }, + [ + { + "lineHeight": 28, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </RNGestureHandlerButton> + </View> + </View> + <View + style={ + { + "transform": [ + { + "translateX": 0, + }, + ], + } + } + > + <RNGestureHandlerButton + activeOpacity={1} + collapsable={false} + delayLongPress={600} + handlerTag={294} + handlerType="NativeViewGestureHandler" + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[Function]} + rippleColor="#E4E7EA" + style={ + [ + { + "backgroundColor": "#FFFFFF", + "borderRadius": undefined, + "margin": undefined, + "marginBottom": undefined, + "marginEnd": undefined, + "marginHorizontal": undefined, + "marginLeft": undefined, + "marginRight": undefined, + "marginStart": undefined, + "marginTop": undefined, + "marginVertical": undefined, + }, + { + "cursor": undefined, + }, + ] + } + underlayColor="#E4E7EA" + > + <View + collapsable={false} + style={ + { + "backgroundColor": "#E4E7EA", + "borderBottomLeftRadius": undefined, + "borderBottomRightRadius": undefined, + "borderRadius": undefined, + "borderTopLeftRadius": undefined, + "borderTopRightRadius": undefined, + "bottom": 0, + "left": 0, + "opacity": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + <View + style={{}} + > + <View + accessibilityLabel="rocket.cat. private channel. undefined. " + accessibilityRole="button" + accessible={true} + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "paddingLeft": 14, + }, + { + "height": 75, + }, + ] + } + > + <View + accessibilityLabel="rocket.cat's avatar" + accessible={true} + style={ + [ + { + "borderRadius": 4, + "height": 48, + "width": 48, + }, + { + "marginRight": 10, + }, + ] + } + testID="avatar" + > + <ViewManagerAdapter_ExpoImage + borderRadius={4} + containerViewRef={"[React.ref]"} + contentFit="cover" + contentPosition={ + { + "left": "50%", + "top": "50%", + } + } + height={48} + nativeViewRef={"[React.ref]"} + onError={[Function]} + onLoad={[Function]} + onLoadStart={[Function]} + onProgress={[Function]} + placeholder={[]} + priority="high" + source={ + [ + { + "headers": { + "User-Agent": "RC Mobile; ios unknown; vunknown (unknown)", + }, + "uri": "https://open.rocket.chat/avatar/@rocket.cat?format=png&size=96", + }, + ] + } + style={ + { + "borderRadius": 4, + "height": 48, + "width": 48, + } + } + transition={null} + width={48} + /> + </View> <View style={ [ @@ -32593,7 +33839,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={301} + handlerTag={313} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -32712,7 +33958,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={302} + handlerTag={314} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -32814,7 +34060,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={303} + handlerTag={315} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -32900,7 +34146,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={304} + handlerTag={316} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -33223,7 +34469,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={305} + handlerTag={317} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -33342,7 +34588,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={306} + handlerTag={318} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -33444,7 +34690,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={0.105} collapsable={false} delayLongPress={600} - handlerTag={307} + handlerTag={319} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} @@ -33530,7 +34776,7 @@ exports[`Story Snapshots: User should match snapshot 1`] = ` activeOpacity={1} collapsable={false} delayLongPress={600} - handlerTag={308} + handlerTag={320} handlerType="NativeViewGestureHandler" innerRef={null} onActiveStateChange={[Function]} diff --git a/app/containers/RoomItem/index.tsx b/app/containers/RoomItem/index.tsx index dd135367976..4509becff28 100644 --- a/app/containers/RoomItem/index.tsx +++ b/app/containers/RoomItem/index.tsx @@ -94,6 +94,7 @@ const RoomItemContainer = React.memo( displayMode={displayMode} status={item.t === 'l' ? item?.visitor?.status : null} sourceType={item.t === 'l' ? item.source : null} + abacAttributes={item.abacAttributes} /> ); }, diff --git a/app/containers/RoomItem/interfaces.ts b/app/containers/RoomItem/interfaces.ts index fc26c2663cf..ba1641b6a08 100644 --- a/app/containers/RoomItem/interfaces.ts +++ b/app/containers/RoomItem/interfaces.ts @@ -67,6 +67,7 @@ export interface ITypeIconProps { size?: number; style?: object; sourceType: IOmnichannelSource; + abacAttributes?: ISubscription['abacAttributes']; } interface IRoomItemTouchables { @@ -124,6 +125,7 @@ export interface IRoomItemProps extends IBaseRoomItem { sourceType: IOmnichannelSource; hideMentionStatus?: boolean; accessibilityDate: string; + abacAttributes?: ISubscription['abacAttributes']; } export interface ILastMessageProps { @@ -161,6 +163,7 @@ export interface IIconOrAvatar { teamMain: boolean; showLastMessage: boolean; sourceType: IOmnichannelSource; + abacAttributes?: ISubscription['abacAttributes']; } export interface IRoomItem extends ISubscription { diff --git a/app/containers/RoomTypeIcon/RoomTypeIcon.stories.tsx b/app/containers/RoomTypeIcon/RoomTypeIcon.stories.tsx index 02307ec8c2b..9181c98fc57 100644 --- a/app/containers/RoomTypeIcon/RoomTypeIcon.stories.tsx +++ b/app/containers/RoomTypeIcon/RoomTypeIcon.stories.tsx @@ -18,6 +18,8 @@ export const All = () => ( <RoomTypeIcon size={30} type='p' teamMain /> <RoomTypeIcon size={30} type='discussion' /> <RoomTypeIcon size={30} type='l' status='away' sourceType={{ type: OmnichannelSourceType.SMS }} /> + <RoomTypeIcon size={30} type='p' abacAttributes={['Classified']} /> + <RoomTypeIcon size={30} type='p' abacAttributes={['Classified']} teamMain /> <RoomTypeIcon size={30} type='p' style={{ margin: 10 }} /> </> ); diff --git a/app/containers/RoomTypeIcon/__snapshots__/RoomTypeIcon.test.tsx.snap b/app/containers/RoomTypeIcon/__snapshots__/RoomTypeIcon.test.tsx.snap index 4cf1e7eb8c0..d3f054edc7a 100644 --- a/app/containers/RoomTypeIcon/__snapshots__/RoomTypeIcon.test.tsx.snap +++ b/app/containers/RoomTypeIcon/__snapshots__/RoomTypeIcon.test.tsx.snap @@ -295,6 +295,68 @@ exports[`Story Snapshots: All should match snapshot 1`] = ` >  </Text>, + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#1F2329", + "fontSize": 30, + }, + [ + { + "lineHeight": 30, + }, + [ + { + "marginRight": 4, + }, + undefined, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text>, + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#1F2329", + "fontSize": 30, + }, + [ + { + "lineHeight": 30, + }, + [ + { + "marginRight": 4, + }, + undefined, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text>, <Text allowFontScaling={false} selectable={false} diff --git a/app/containers/RoomTypeIcon/index.tsx b/app/containers/RoomTypeIcon/index.tsx index 783c727c667..1dec36f0eed 100644 --- a/app/containers/RoomTypeIcon/index.tsx +++ b/app/containers/RoomTypeIcon/index.tsx @@ -7,7 +7,7 @@ import { CustomIcon, type TIconsName } from '../CustomIcon'; import { themes } from '../../lib/constants/colors'; import Status from '../Status'; import { useTheme } from '../../theme'; -import { type TUserStatus, type IOmnichannelSource } from '../../definitions'; +import { type TUserStatus, type IOmnichannelSource, type ISubscription } from '../../definitions'; const styles = StyleSheet.create({ icon: { @@ -24,10 +24,11 @@ interface IRoomTypeIcon { size?: number; style?: ViewStyle; sourceType?: IOmnichannelSource; + abacAttributes?: ISubscription['abacAttributes']; } const RoomTypeIcon = React.memo( - ({ userId, type, isGroupChat, status, style, teamMain, size = 16, sourceType }: IRoomTypeIcon) => { + ({ userId, type, isGroupChat, status, style, teamMain, size = 16, sourceType, abacAttributes }: IRoomTypeIcon) => { const { theme } = useTheme(); if (!type) { @@ -49,7 +50,9 @@ const RoomTypeIcon = React.memo( // TODO: move this to a separate function let icon: TIconsName = 'channel-private'; - if (teamMain) { + if (abacAttributes?.length) { + icon = teamMain ? 'team-shield' : 'hash-shield'; + } else if (teamMain) { icon = `teams${type === 'p' ? '-private' : ''}`; } else if (type === 'discussion') { icon = 'discussions'; diff --git a/app/definitions/ISubscription.ts b/app/definitions/ISubscription.ts index 17e09f329a1..ada68d0681b 100644 --- a/app/definitions/ISubscription.ts +++ b/app/definitions/ISubscription.ts @@ -116,6 +116,7 @@ export interface ISubscription { uploads: RelationModified<TUploadModel>; disableNotifications?: boolean; federated?: boolean; + abacAttributes?: string[]; } export type TSubscriptionModel = ISubscription & diff --git a/app/lib/methods/helpers/mergeSubscriptionsRooms.ts b/app/lib/methods/helpers/mergeSubscriptionsRooms.ts index a120a8e920c..2199c023272 100644 --- a/app/lib/methods/helpers/mergeSubscriptionsRooms.ts +++ b/app/lib/methods/helpers/mergeSubscriptionsRooms.ts @@ -34,6 +34,7 @@ export const merge = ( mergedSubscription.jitsiTimeout = room.jitsiTimeout; mergedSubscription.usernames = room.usernames; mergedSubscription.uids = room.uids; + mergedSubscription.abacAttributes = ['Classified', 'Top Secret', 'Confidential']; // TODO: remove this once we have the actual abac attributes } if (compareServerVersion(serverVersion, 'lowerThan', '3.7.0')) { diff --git a/app/views/RoomActionsView/index.tsx b/app/views/RoomActionsView/index.tsx index 400389faea6..e1fd6db97a5 100644 --- a/app/views/RoomActionsView/index.tsx +++ b/app/views/RoomActionsView/index.tsx @@ -795,6 +795,7 @@ class RoomActionsView extends React.Component<IRoomActionsViewProps, IRoomAction teamMain={room.teamMain} status={room.visitor?.status} sourceType={source} + abacAttributes={room.abacAttributes} /> <Text style={[styles.roomTitle, { color: themes[theme].fontTitlesLabels }]} numberOfLines={1}> {getRoomTitle(room)} diff --git a/app/views/RoomInfoView/components/RoomInfoViewTitle.tsx b/app/views/RoomInfoView/components/RoomInfoViewTitle.tsx index ebbd409af79..036413c5860 100644 --- a/app/views/RoomInfoView/components/RoomInfoViewTitle.tsx +++ b/app/views/RoomInfoView/components/RoomInfoViewTitle.tsx @@ -63,6 +63,7 @@ const RoomInfoViewTitle = ({ room, name, username, statusText, type }: IRoomInfo key='room-info-type' status={room?.visitor?.status} sourceType={room?.source} + abacAttributes={room?.abacAttributes} /> <Text testID='room-info-view-name' style={[styles.roomTitle, { color: colors.fontTitlesLabels }]} key='room-info-name'> {getRoomTitle(room)} diff --git a/app/views/RoomView/index.tsx b/app/views/RoomView/index.tsx index 4b76f4b55d0..5fa7ffedb9e 100644 --- a/app/views/RoomView/index.tsx +++ b/app/views/RoomView/index.tsx @@ -510,6 +510,7 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> { onPress={this.goRoomActionsView} testID={`room-view-title-${title}`} sourceType={sourceType} + abacAttributes={iSubRoom.abacAttributes} /> ), headerRight: () => ( From 7fa31797a4ff667b20f445b21e25682d772c49bd Mon Sep 17 00:00:00 2001 From: Diego Mello <diegolmello@gmail.com> Date: Wed, 5 Nov 2025 14:47:52 -0300 Subject: [PATCH 4/9] Refactor room info tags --- app/views/RoomInfoView/Direct.tsx | 14 ++++-------- .../RoomInfoView/components/RoomInfoTag.tsx | 22 +++++++++++++++++++ app/views/RoomInfoView/styles.ts | 17 ++++++++------ 3 files changed, 36 insertions(+), 17 deletions(-) create mode 100644 app/views/RoomInfoView/components/RoomInfoTag.tsx diff --git a/app/views/RoomInfoView/Direct.tsx b/app/views/RoomInfoView/Direct.tsx index 065068d9642..40d64c203e4 100644 --- a/app/views/RoomInfoView/Direct.tsx +++ b/app/views/RoomInfoView/Direct.tsx @@ -7,6 +7,7 @@ import CustomFields from './CustomFields'; import Timezone from './Timezone'; import styles from './styles'; import { type IUser } from '../../definitions'; +import { RoomInfoTag, RoomInfoTagContainer } from './components/RoomInfoTag'; const Roles = ({ roles }: { roles?: string[] }) => { const { colors } = useTheme(); @@ -15,18 +16,11 @@ const Roles = ({ roles }: { roles?: string[] }) => { return ( <View style={styles.item} testID='user-roles'> <Text style={[styles.itemLabel, { color: colors.fontTitlesLabels }]}>{I18n.t('Roles')}</Text> - <View style={styles.rolesContainer}> + <RoomInfoTagContainer> {roles.map(role => - role ? ( - <View - style={[styles.roleBadge, { backgroundColor: colors.surfaceSelected }]} - key={role} - testID={`user-role-${role.replace(/ /g, '-')}`}> - <Text style={[styles.role, { color: colors.fontTitlesLabels }]}>{role}</Text> - </View> - ) : null + role ? <RoomInfoTag name={role} key={role} testID={`user-role-${role.replace(/ /g, '-')}`} /> : null )} - </View> + </RoomInfoTagContainer> </View> ); } diff --git a/app/views/RoomInfoView/components/RoomInfoTag.tsx b/app/views/RoomInfoView/components/RoomInfoTag.tsx new file mode 100644 index 00000000000..81ddff006d7 --- /dev/null +++ b/app/views/RoomInfoView/components/RoomInfoTag.tsx @@ -0,0 +1,22 @@ +import { Text, View } from 'react-native'; +import type { ReactNode } from 'react'; + +import { useTheme } from '../../../theme'; +import styles from '../styles'; +import { CustomIcon } from '../../../containers/CustomIcon'; +import type { TIconsName } from '../../../containers/CustomIcon'; + +export const RoomInfoTag = ({ name, icon, testID }: { name: string; icon?: TIconsName; testID: string }) => { + const { colors } = useTheme(); + + return ( + <View style={[styles.roleBadge, { backgroundColor: colors.surfaceSelected }]} testID={testID}> + {icon ? <CustomIcon name={icon} size={16} /> : null} + <Text style={[styles.role, { color: colors.buttonFontSecondary }]}>{name}</Text> + </View> + ); +}; + +export const RoomInfoTagContainer = ({ children }: { children: ReactNode }) => ( + <View style={styles.rolesContainer}>{children}</View> +); diff --git a/app/views/RoomInfoView/styles.ts b/app/views/RoomInfoView/styles.ts index 7711e6fcb74..5e6f741db12 100644 --- a/app/views/RoomInfoView/styles.ts +++ b/app/views/RoomInfoView/styles.ts @@ -61,17 +61,20 @@ export default StyleSheet.create({ }, rolesContainer: { flexDirection: 'row', - flexWrap: 'wrap' + flexWrap: 'wrap', + gap: 4 }, roleBadge: { - padding: 6, - borderRadius: 4, - marginRight: 6, - marginBottom: 6 + flexDirection: 'row', + alignItems: 'center', + gap: 2, + padding: 4, + borderRadius: 4 }, role: { - fontSize: 14, - ...sharedStyles.textRegular + fontSize: 12, + lineHeight: 16, + ...sharedStyles.textBold }, roomButtonsContainer: { flexDirection: 'row', From 762965bc5014f2fdcb96e256e68da9d435aac89d Mon Sep 17 00:00:00 2001 From: Diego Mello <diegolmello@gmail.com> Date: Wed, 5 Nov 2025 16:11:01 -0300 Subject: [PATCH 5/9] Finish and add stories --- app/definitions/ISubscription.ts | 2 +- app/i18n/locales/en.json | 5 +- .../helpers/mergeSubscriptionsRooms.ts | 6 +- app/views/RoomInfoView/Channel.tsx | 2 + app/views/RoomInfoView/Item.tsx | 10 +- .../RoomInfoView/components/ItemLabel.tsx | 18 + .../components/RoomInfoABAC.stories.tsx | 53 + .../components/RoomInfoABAC.test.tsx | 4 + .../RoomInfoView/components/RoomInfoABAC.tsx | 42 + .../RoomInfoView/components/RoomInfoTag.tsx | 2 +- .../__snapshots__/RoomInfoABAC.test.tsx.snap | 2755 +++++++++++++++++ app/views/RoomInfoView/index.tsx | 2 +- app/views/RoomInfoView/styles.ts | 9 +- 13 files changed, 2896 insertions(+), 14 deletions(-) create mode 100644 app/views/RoomInfoView/components/ItemLabel.tsx create mode 100644 app/views/RoomInfoView/components/RoomInfoABAC.stories.tsx create mode 100644 app/views/RoomInfoView/components/RoomInfoABAC.test.tsx create mode 100644 app/views/RoomInfoView/components/RoomInfoABAC.tsx create mode 100644 app/views/RoomInfoView/components/__snapshots__/RoomInfoABAC.test.tsx.snap diff --git a/app/definitions/ISubscription.ts b/app/definitions/ISubscription.ts index ada68d0681b..0c7bc2b7262 100644 --- a/app/definitions/ISubscription.ts +++ b/app/definitions/ISubscription.ts @@ -116,7 +116,7 @@ export interface ISubscription { uploads: RelationModified<TUploadModel>; disableNotifications?: boolean; federated?: boolean; - abacAttributes?: string[]; + abacAttributes?: { name: string; values: string[] }[]; } export type TSubscriptionModel = ISubscription & diff --git a/app/i18n/locales/en.json b/app/i18n/locales/en.json index 4c36b2afa3b..60dccaf9a20 100644 --- a/app/i18n/locales/en.json +++ b/app/i18n/locales/en.json @@ -995,5 +995,8 @@ "Your_invite_link_will_never_expire": "Your invite link will never expire.", "Your_password_is": "Your password is", "Your_Password_Must_Have": "Your password must have:", - "Your_push_was_sent_to_s_devices": "Your push was sent to {{s}} devices" + "Your_push_was_sent_to_s_devices": "Your push was sent to {{s}} devices", + "ABAC_room_attributes": "Room attributes", + "ABAC_managed": "ABAC managed", + "ABAC_managed_description": "Only compliant users have access to attribute-based access controlled rooms. Attributes determine room access." } \ No newline at end of file diff --git a/app/lib/methods/helpers/mergeSubscriptionsRooms.ts b/app/lib/methods/helpers/mergeSubscriptionsRooms.ts index 2199c023272..5cb9d7166c8 100644 --- a/app/lib/methods/helpers/mergeSubscriptionsRooms.ts +++ b/app/lib/methods/helpers/mergeSubscriptionsRooms.ts @@ -34,7 +34,11 @@ export const merge = ( mergedSubscription.jitsiTimeout = room.jitsiTimeout; mergedSubscription.usernames = room.usernames; mergedSubscription.uids = room.uids; - mergedSubscription.abacAttributes = ['Classified', 'Top Secret', 'Confidential']; // TODO: remove this once we have the actual abac attributes + mergedSubscription.abacAttributes = [ + { name: 'Chat sensitivity', values: ['Classified', 'Top Secret'] }, + { name: 'Country', values: ['US-only'] }, + { name: 'Project', values: ['F-038', 'A-072'] } + ]; // TODO: remove this once we have the actual abac attributes } if (compareServerVersion(serverVersion, 'lowerThan', '3.7.0')) { diff --git a/app/views/RoomInfoView/Channel.tsx b/app/views/RoomInfoView/Channel.tsx index ae8bdce74b9..a8615c1ab55 100644 --- a/app/views/RoomInfoView/Channel.tsx +++ b/app/views/RoomInfoView/Channel.tsx @@ -3,6 +3,7 @@ import React from 'react'; import I18n from '../../i18n'; import { type ISubscription } from '../../definitions'; import Item from './Item'; +import { RoomInfoABAC } from './components/RoomInfoABAC'; const Channel = ({ room }: { room?: ISubscription }): React.ReactElement => { const description = room?.description || `__${I18n.t('No_label_provided', { label: 'description' })}__`; @@ -15,6 +16,7 @@ const Channel = ({ room }: { room?: ISubscription }): React.ReactElement => { <Item label={I18n.t('Topic')} content={topic} testID='room-info-view-topic' /> <Item label={I18n.t('Announcement')} content={announcement} testID='room-info-view-announcement' /> <Item label={I18n.t('Broadcast')} content={broadcast} testID='room-info-view-broadcast' /> + <RoomInfoABAC abacAttributes={room?.abacAttributes} /> </> ); }; diff --git a/app/views/RoomInfoView/Item.tsx b/app/views/RoomInfoView/Item.tsx index 3707c365014..45bacc9de89 100644 --- a/app/views/RoomInfoView/Item.tsx +++ b/app/views/RoomInfoView/Item.tsx @@ -1,9 +1,9 @@ import React from 'react'; -import { Text, View } from 'react-native'; +import { View } from 'react-native'; import Markdown from '../../containers/markdown'; -import { useTheme } from '../../theme'; import styles from './styles'; +import { ItemLabel } from './components/ItemLabel'; interface IItem { label?: string; @@ -12,15 +12,11 @@ interface IItem { } const Item = ({ label, content, testID }: IItem): React.ReactElement | null => { - const { colors } = useTheme(); - if (!content) return null; return ( <View style={styles.item} testID={testID}> - <Text accessibilityLabel={label} style={[styles.itemLabel, { color: colors.fontTitlesLabels }]}> - {label} - </Text> + {label ? <ItemLabel label={label} testID={testID} /> : null} <Markdown msg={content} /> </View> ); diff --git a/app/views/RoomInfoView/components/ItemLabel.tsx b/app/views/RoomInfoView/components/ItemLabel.tsx new file mode 100644 index 00000000000..50b5c872881 --- /dev/null +++ b/app/views/RoomInfoView/components/ItemLabel.tsx @@ -0,0 +1,18 @@ +import { Text } from 'react-native'; + +import { useTheme } from '../../../theme'; +import styles from '../styles'; + +interface IItemLabel { + label: string; + testID?: string; +} + +export const ItemLabel = ({ label, testID }: IItemLabel) => { + const { colors } = useTheme(); + return ( + <Text accessibilityLabel={label} style={[styles.itemLabel, { color: colors.fontTitlesLabels }]} testID={testID}> + {label} + </Text> + ); +}; diff --git a/app/views/RoomInfoView/components/RoomInfoABAC.stories.tsx b/app/views/RoomInfoView/components/RoomInfoABAC.stories.tsx new file mode 100644 index 00000000000..236b05091b3 --- /dev/null +++ b/app/views/RoomInfoView/components/RoomInfoABAC.stories.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { ScrollView, View } from 'react-native'; + +import { RoomInfoABAC } from './RoomInfoABAC'; +import type { TSupportedThemes } from '../../../theme'; +import { ThemeContext } from '../../../theme'; +import { colors } from '../../../lib/constants/colors'; + +export default { + title: 'RoomInfoABAC', + component: RoomInfoABAC, + decorators: [ + (Story: any) => ( + <ScrollView> + <Story /> + </ScrollView> + ) + ] +}; + +const Story = () => ( + <> + <RoomInfoABAC abacAttributes={[{ name: 'Chat sensitivity', values: ['Classified', 'Top Secret'] }]} /> + <RoomInfoABAC + abacAttributes={[ + { name: 'Attribute', values: Array.from({ length: 10 }, (_, index) => `Value ${index + 1}`) }, + { name: 'Chat sensitivity', values: ['Classified', 'Top Secret'] } + ]} + /> + </> +); + +const ThemeProvider = ({ children, theme }: { children: React.ReactNode; theme: TSupportedThemes }) => ( + <ThemeContext.Provider value={{ theme, colors: colors[theme] }}> + <View style={{ backgroundColor: colors[theme].surfaceRoom }}>{children}</View> + </ThemeContext.Provider> +); + +export const Light = () => ( + <ThemeProvider theme='light'> + <Story /> + </ThemeProvider> +); +export const Dark = () => ( + <ThemeProvider theme='dark'> + <Story /> + </ThemeProvider> +); +export const Black = () => ( + <ThemeProvider theme='black'> + <Story /> + </ThemeProvider> +); diff --git a/app/views/RoomInfoView/components/RoomInfoABAC.test.tsx b/app/views/RoomInfoView/components/RoomInfoABAC.test.tsx new file mode 100644 index 00000000000..862228bfbd1 --- /dev/null +++ b/app/views/RoomInfoView/components/RoomInfoABAC.test.tsx @@ -0,0 +1,4 @@ +import { generateSnapshots } from '../../../../.rnstorybook/generateSnapshots'; +import * as stories from './RoomInfoABAC.stories'; + +generateSnapshots(stories); diff --git a/app/views/RoomInfoView/components/RoomInfoABAC.tsx b/app/views/RoomInfoView/components/RoomInfoABAC.tsx new file mode 100644 index 00000000000..f5ba348a75e --- /dev/null +++ b/app/views/RoomInfoView/components/RoomInfoABAC.tsx @@ -0,0 +1,42 @@ +import { Text, View } from 'react-native'; + +import * as List from '../../../containers/List'; +import styles from '../styles'; +import { RoomInfoTag, RoomInfoTagContainer } from './RoomInfoTag'; +import type { ISubscription } from '../../../definitions'; +import { ItemLabel } from './ItemLabel'; +import { useTheme } from '../../../theme'; +import I18n from '../../../i18n'; + +export const RoomInfoABAC = ({ abacAttributes }: { abacAttributes?: ISubscription['abacAttributes'] }) => { + const { colors } = useTheme(); + + if (!abacAttributes?.length) { + return null; + } + + return ( + <View style={styles.item}> + <List.Separator style={{ marginBottom: 20 }} /> + <View style={{ gap: 16 }}> + <RoomInfoTagContainer> + <RoomInfoTag name={I18n.t('ABAC_managed')} icon='hash-shield' /> + </RoomInfoTagContainer> + + <Text style={[styles.abacDescription, { color: colors.fontSecondaryInfo }]}>{I18n.t('ABAC_managed_description')}</Text> + + <ItemLabel label={I18n.t('ABAC_room_attributes')} /> + {abacAttributes.map(attribute => ( + <View key={attribute.name} style={{ gap: 8 }}> + <Text style={[styles.abacDescription, { color: colors.fontDefault }]}>{attribute.name}</Text> + <RoomInfoTagContainer> + {attribute.values.map(value => ( + <RoomInfoTag name={value} key={value} /> + ))} + </RoomInfoTagContainer> + </View> + ))} + </View> + </View> + ); +}; diff --git a/app/views/RoomInfoView/components/RoomInfoTag.tsx b/app/views/RoomInfoView/components/RoomInfoTag.tsx index 81ddff006d7..a68e27ab8d5 100644 --- a/app/views/RoomInfoView/components/RoomInfoTag.tsx +++ b/app/views/RoomInfoView/components/RoomInfoTag.tsx @@ -6,7 +6,7 @@ import styles from '../styles'; import { CustomIcon } from '../../../containers/CustomIcon'; import type { TIconsName } from '../../../containers/CustomIcon'; -export const RoomInfoTag = ({ name, icon, testID }: { name: string; icon?: TIconsName; testID: string }) => { +export const RoomInfoTag = ({ name, icon, testID }: { name: string; icon?: TIconsName; testID?: string }) => { const { colors } = useTheme(); return ( diff --git a/app/views/RoomInfoView/components/__snapshots__/RoomInfoABAC.test.tsx.snap b/app/views/RoomInfoView/components/__snapshots__/RoomInfoABAC.test.tsx.snap new file mode 100644 index 00000000000..cde5b132df6 --- /dev/null +++ b/app/views/RoomInfoView/components/__snapshots__/RoomInfoABAC.test.tsx.snap @@ -0,0 +1,2755 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Story Snapshots: Black should match snapshot 1`] = ` +<RCTScrollView> + <View> + <View + style={ + { + "backgroundColor": "#000000", + } + } + > + <View + style={ + { + "gap": 8, + "justifyContent": "center", + "paddingHorizontal": 20, + "paddingVertical": 10, + } + } + > + <View + style={ + [ + { + "height": 0.5, + }, + { + "marginBottom": 20, + }, + { + "backgroundColor": "#1f2329", + }, + ] + } + /> + <View + style={ + { + "gap": 16, + } + } + > + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#E4E7EA", + "fontSize": 16, + }, + [ + { + "lineHeight": 16, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + ABAC managed + </Text> + </View> + </View> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#9EA2A8", + }, + ] + } + > + Only compliant users have access to attribute-based access controlled rooms. Attributes determine room access. + </Text> + <Text + accessibilityLabel="Room attributes" + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "500", + "textAlign": "left", + }, + { + "color": "#F2F3F5", + }, + ] + } + > + Room attributes + </Text> + <View + style={ + { + "gap": 8, + } + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Chat sensitivity + </Text> + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Classified + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Top Secret + </Text> + </View> + </View> + </View> + </View> + </View> + <View + style={ + { + "gap": 8, + "justifyContent": "center", + "paddingHorizontal": 20, + "paddingVertical": 10, + } + } + > + <View + style={ + [ + { + "height": 0.5, + }, + { + "marginBottom": 20, + }, + { + "backgroundColor": "#1f2329", + }, + ] + } + /> + <View + style={ + { + "gap": 16, + } + } + > + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#E4E7EA", + "fontSize": 16, + }, + [ + { + "lineHeight": 16, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + ABAC managed + </Text> + </View> + </View> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#9EA2A8", + }, + ] + } + > + Only compliant users have access to attribute-based access controlled rooms. Attributes determine room access. + </Text> + <Text + accessibilityLabel="Room attributes" + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "500", + "textAlign": "left", + }, + { + "color": "#F2F3F5", + }, + ] + } + > + Room attributes + </Text> + <View + style={ + { + "gap": 8, + } + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Attribute + </Text> + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 1 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 2 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 3 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 4 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 5 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 6 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 7 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 8 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 9 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 10 + </Text> + </View> + </View> + </View> + <View + style={ + { + "gap": 8, + } + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Chat sensitivity + </Text> + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Classified + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Top Secret + </Text> + </View> + </View> + </View> + </View> + </View> + </View> + </View> +</RCTScrollView> +`; + +exports[`Story Snapshots: Dark should match snapshot 1`] = ` +<RCTScrollView> + <View> + <View + style={ + { + "backgroundColor": "#1F2329", + } + } + > + <View + style={ + { + "gap": 8, + "justifyContent": "center", + "paddingHorizontal": 20, + "paddingVertical": 10, + } + } + > + <View + style={ + [ + { + "height": 0.5, + }, + { + "marginBottom": 20, + }, + { + "backgroundColor": "#333842", + }, + ] + } + /> + <View + style={ + { + "gap": 16, + } + } + > + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#E4E7EA", + "fontSize": 16, + }, + [ + { + "lineHeight": 16, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + ABAC managed + </Text> + </View> + </View> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#9EA2A8", + }, + ] + } + > + Only compliant users have access to attribute-based access controlled rooms. Attributes determine room access. + </Text> + <Text + accessibilityLabel="Room attributes" + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "500", + "textAlign": "left", + }, + { + "color": "#F2F3F5", + }, + ] + } + > + Room attributes + </Text> + <View + style={ + { + "gap": 8, + } + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Chat sensitivity + </Text> + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Classified + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Top Secret + </Text> + </View> + </View> + </View> + </View> + </View> + <View + style={ + { + "gap": 8, + "justifyContent": "center", + "paddingHorizontal": 20, + "paddingVertical": 10, + } + } + > + <View + style={ + [ + { + "height": 0.5, + }, + { + "marginBottom": 20, + }, + { + "backgroundColor": "#333842", + }, + ] + } + /> + <View + style={ + { + "gap": 16, + } + } + > + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#E4E7EA", + "fontSize": 16, + }, + [ + { + "lineHeight": 16, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + ABAC managed + </Text> + </View> + </View> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#9EA2A8", + }, + ] + } + > + Only compliant users have access to attribute-based access controlled rooms. Attributes determine room access. + </Text> + <Text + accessibilityLabel="Room attributes" + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "500", + "textAlign": "left", + }, + { + "color": "#F2F3F5", + }, + ] + } + > + Room attributes + </Text> + <View + style={ + { + "gap": 8, + } + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Attribute + </Text> + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 1 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 2 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 3 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 4 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 5 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 6 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 7 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 8 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 9 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Value 10 + </Text> + </View> + </View> + </View> + <View + style={ + { + "gap": 8, + } + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Chat sensitivity + </Text> + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Classified + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#3C3F44", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#E4E7EA", + }, + ] + } + > + Top Secret + </Text> + </View> + </View> + </View> + </View> + </View> + </View> + </View> +</RCTScrollView> +`; + +exports[`Story Snapshots: Light should match snapshot 1`] = ` +<RCTScrollView> + <View> + <View + style={ + { + "backgroundColor": "#FFFFFF", + } + } + > + <View + style={ + { + "gap": 8, + "justifyContent": "center", + "paddingHorizontal": 20, + "paddingVertical": 10, + } + } + > + <View + style={ + [ + { + "height": 0.5, + }, + { + "marginBottom": 20, + }, + { + "backgroundColor": "#CBCED1", + }, + ] + } + /> + <View + style={ + { + "gap": 16, + } + } + > + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#2F343D", + "fontSize": 16, + }, + [ + { + "lineHeight": 16, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + ABAC managed + </Text> + </View> + </View> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#6C727A", + }, + ] + } + > + Only compliant users have access to attribute-based access controlled rooms. Attributes determine room access. + </Text> + <Text + accessibilityLabel="Room attributes" + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "500", + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Room attributes + </Text> + <View + style={ + { + "gap": 8, + } + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + ] + } + > + Chat sensitivity + </Text> + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Classified + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Top Secret + </Text> + </View> + </View> + </View> + </View> + </View> + <View + style={ + { + "gap": 8, + "justifyContent": "center", + "paddingHorizontal": 20, + "paddingVertical": 10, + } + } + > + <View + style={ + [ + { + "height": 0.5, + }, + { + "marginBottom": 20, + }, + { + "backgroundColor": "#CBCED1", + }, + ] + } + /> + <View + style={ + { + "gap": 16, + } + } + > + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#2F343D", + "fontSize": 16, + }, + [ + { + "lineHeight": 16, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + ABAC managed + </Text> + </View> + </View> + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#6C727A", + }, + ] + } + > + Only compliant users have access to attribute-based access controlled rooms. Attributes determine room access. + </Text> + <Text + accessibilityLabel="Room attributes" + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "500", + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Room attributes + </Text> + <View + style={ + { + "gap": 8, + } + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + ] + } + > + Attribute + </Text> + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Value 1 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Value 2 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Value 3 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Value 4 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Value 5 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Value 6 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Value 7 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Value 8 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Value 9 + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Value 10 + </Text> + </View> + </View> + </View> + <View + style={ + { + "gap": 8, + } + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "400", + "lineHeight": 22, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + ] + } + > + Chat sensitivity + </Text> + <View + style={ + { + "flexDirection": "row", + "flexWrap": "wrap", + "gap": 4, + } + } + > + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Classified + </Text> + </View> + <View + style={ + [ + { + "alignItems": "center", + "borderRadius": 4, + "flexDirection": "row", + "gap": 2, + "padding": 4, + }, + { + "backgroundColor": "#D7DBE0", + }, + ] + } + > + <Text + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "700", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#1F2329", + }, + ] + } + > + Top Secret + </Text> + </View> + </View> + </View> + </View> + </View> + </View> + </View> +</RCTScrollView> +`; diff --git a/app/views/RoomInfoView/index.tsx b/app/views/RoomInfoView/index.tsx index e0f9fa01159..76e6a355c09 100644 --- a/app/views/RoomInfoView/index.tsx +++ b/app/views/RoomInfoView/index.tsx @@ -284,7 +284,7 @@ const RoomInfoView = (): React.ReactElement => { }; return ( - <ScrollView style={[styles.scroll, { backgroundColor: colors.surfaceRoom }]}> + <ScrollView style={[styles.scroll, { backgroundColor: colors.surfaceRoom }]} contentContainerStyle={{ paddingBottom: 30 }}> <SafeAreaView style={{ backgroundColor: colors.surfaceRoom }} testID='room-info-view'> <View style={[styles.avatarContainer, { backgroundColor: colors.surfaceHover }]}> <RoomInfoViewAvatar diff --git a/app/views/RoomInfoView/styles.ts b/app/views/RoomInfoView/styles.ts index 5e6f741db12..13b0741d5bc 100644 --- a/app/views/RoomInfoView/styles.ts +++ b/app/views/RoomInfoView/styles.ts @@ -13,7 +13,8 @@ export default StyleSheet.create({ item: { paddingVertical: 10, paddingHorizontal: 20, - justifyContent: 'center' + justifyContent: 'center', + gap: 8 }, avatarContainer: { minHeight: 320, @@ -48,7 +49,6 @@ export default StyleSheet.create({ alignItems: 'center' }, itemLabel: { - marginBottom: 10, fontSize: 14, ...sharedStyles.textMedium }, @@ -93,5 +93,10 @@ export default StyleSheet.create({ paddingTop: 16, paddingHorizontal: 20, alignItems: 'center' + }, + abacDescription: { + lineHeight: 22, + fontSize: 16, + ...sharedStyles.textRegular } }); From 2b55ca1486921630dd056102fa26c46745dbd78c Mon Sep 17 00:00:00 2001 From: Diego Mello <diegolmello@gmail.com> Date: Wed, 5 Nov 2025 16:37:09 -0300 Subject: [PATCH 6/9] i18n --- app/i18n/locales/ar.json | 5 ++++- app/i18n/locales/bn-IN.json | 5 ++++- app/i18n/locales/cs.json | 5 ++++- app/i18n/locales/de.json | 5 ++++- app/i18n/locales/es.json | 5 ++++- app/i18n/locales/fi.json | 5 ++++- app/i18n/locales/fr.json | 5 ++++- app/i18n/locales/hi-IN.json | 5 ++++- app/i18n/locales/hu.json | 5 ++++- app/i18n/locales/it.json | 5 ++++- app/i18n/locales/ja.json | 5 ++++- app/i18n/locales/nl.json | 5 ++++- app/i18n/locales/nn.json | 5 ++++- app/i18n/locales/no.json | 6 +++++- app/i18n/locales/pt-BR.json | 5 ++++- app/i18n/locales/pt-PT.json | 5 ++++- app/i18n/locales/ru.json | 5 ++++- app/i18n/locales/sl-SI.json | 5 ++++- app/i18n/locales/sv.json | 5 ++++- app/i18n/locales/ta-IN.json | 5 ++++- app/i18n/locales/te-IN.json | 5 ++++- app/i18n/locales/tr.json | 5 ++++- app/i18n/locales/zh-CN.json | 5 ++++- app/i18n/locales/zh-TW.json | 5 ++++- 24 files changed, 97 insertions(+), 24 deletions(-) diff --git a/app/i18n/locales/ar.json b/app/i18n/locales/ar.json index a0746a5f14e..4c699d91811 100644 --- a/app/i18n/locales/ar.json +++ b/app/i18n/locales/ar.json @@ -629,5 +629,8 @@ "Your_invite_link_will_never_expire": "لن تنتهي صلاحية رابط الدعوة الخاص بك", "Your_password_is": "كلمة المرور الخاصة بك هي", "Your_Password_Must_Have": "يجب أن تحتوي كلمة المرور الخاصة بك على:", - "Your_workspace": "مساحة عملك" + "Your_workspace": "مساحة عملك", + "ABAC_room_attributes": "سمات الغرفة", + "ABAC_managed": "مدار بواسطة ABAC", + "ABAC_managed_description": "فقط المستخدمون المتوافقون لديهم حق الوصول إلى الغرف التي يتم التحكم فيها بالوصول المستند إلى السمات. تحدد السمات الوصول إلى الغرفة." } \ No newline at end of file diff --git a/app/i18n/locales/bn-IN.json b/app/i18n/locales/bn-IN.json index 95b146f28ed..8cf520405ad 100644 --- a/app/i18n/locales/bn-IN.json +++ b/app/i18n/locales/bn-IN.json @@ -892,5 +892,8 @@ "Your_invite_link_will_never_expire": "আপনার আমন্ত্রণ লিঙ্কটি কখনও মেয়াদ শেষ হবে না।", "Your_password_is": "আপনার পাসওয়ার্ড হল", "Your_Password_Must_Have": "আপনার পাসওয়ার্ড থাকতে হবে:", - "Your_workspace": "আপনার ওয়ার্কস্পেস" + "Your_workspace": "আপনার ওয়ার্কস্পেস", + "ABAC_room_attributes": "রুমের বৈশিষ্ট্য", + "ABAC_managed": "ABAC দ্বারা পরিচালিত", + "ABAC_managed_description": "শুধুমাত্র অনুগত ব্যবহারকারীদের অ্যাট্রিবিউট-ভিত্তিক অ্যাক্সেস নিয়ন্ত্রিত রুমগুলিতে অ্যাক্সেস আছে। অ্যাট্রিবিউটগুলি রুমের অ্যাক্সেস নির্ধারণ করে।" } \ No newline at end of file diff --git a/app/i18n/locales/cs.json b/app/i18n/locales/cs.json index 9af2efdfae6..db37000f5ee 100644 --- a/app/i18n/locales/cs.json +++ b/app/i18n/locales/cs.json @@ -967,5 +967,8 @@ "Your_password_is": "Vaše heslo je", "Your_Password_Must_Have": "Vaše heslo musí mít:", "Your_push_was_sent_to_s_devices": "Vaše push byla odeslána do {{s}} zařízení", - "Your_workspace": "Váš pracovní prostor" + "Your_workspace": "Váš pracovní prostor", + "ABAC_room_attributes": "Atributy místnosti", + "ABAC_managed": "Spravováno ABAC", + "ABAC_managed_description": "Pouze vyhovující uživatelé mají přístup k místnostem řízeným přístupem na základě atributů. Atributy určují přístup k místnosti." } \ No newline at end of file diff --git a/app/i18n/locales/de.json b/app/i18n/locales/de.json index c485902adc4..c813b5d7de0 100644 --- a/app/i18n/locales/de.json +++ b/app/i18n/locales/de.json @@ -882,5 +882,8 @@ "Your_invite_link_will_never_expire": "Ihr Einladungs-Link wird niemals ablaufen.", "Your_password_is": "Ihr Passwort lautet", "Your_Password_Must_Have": "Ihr Passwort muss:", - "Your_workspace": "Ihr Arbeitsbereich" + "Your_workspace": "Ihr Arbeitsbereich", + "ABAC_room_attributes": "Raumattribute", + "ABAC_managed": "ABAC verwaltet", + "ABAC_managed_description": "Nur konforme Benutzer haben Zugriff auf attributbasierte zugriffsgesteuerte Räume. Attribute bestimmen den Raumzugriff." } \ No newline at end of file diff --git a/app/i18n/locales/es.json b/app/i18n/locales/es.json index 5ff50fe88f5..11b63245287 100644 --- a/app/i18n/locales/es.json +++ b/app/i18n/locales/es.json @@ -448,5 +448,8 @@ "you_were_mentioned": "has sido mencionado", "You_will_not_be_able_to_recover_this_message": "¡No podrás recuperar este mensaje!", "Your_certificate": "Tu certificado", - "Your_Password_Must_Have": "Su contraseña debe tener:" + "Your_Password_Must_Have": "Su contraseña debe tener:", + "ABAC_room_attributes": "Atributos de la sala", + "ABAC_managed": "Gestionado por ABAC", + "ABAC_managed_description": "Solo los usuarios compatibles tienen acceso a las salas controladas por acceso basado en atributos. Los atributos determinan el acceso a la sala." } \ No newline at end of file diff --git a/app/i18n/locales/fi.json b/app/i18n/locales/fi.json index 02c4b692e3e..21d7df5216f 100644 --- a/app/i18n/locales/fi.json +++ b/app/i18n/locales/fi.json @@ -854,5 +854,8 @@ "Your_invite_link_will_never_expire": "Kutsulinkkisi ei vanhene.", "Your_password_is": "Salasanasi on", "Your_Password_Must_Have": "Salasanasi on oltava:", - "Your_workspace": "Työtilasi" + "Your_workspace": "Työtilasi", + "ABAC_room_attributes": "Huoneen attribuutit", + "ABAC_managed": "ABAC-hallittu", + "ABAC_managed_description": "Vain yhteensopivilla käyttäjillä on pääsy attribuuttipohjaisesti hallittuihin huoneisiin. Attribuutit määrittävät huoneen pääsyn." } \ No newline at end of file diff --git a/app/i18n/locales/fr.json b/app/i18n/locales/fr.json index 477a3bdca92..5db54e6cad5 100644 --- a/app/i18n/locales/fr.json +++ b/app/i18n/locales/fr.json @@ -775,5 +775,8 @@ "Your_invite_link_will_never_expire": "Votre lien d'invitation n'expirera jamais.", "Your_password_is": "Votre mot de passe est", "Your_Password_Must_Have": "Votre mot de passe doit avoir:", - "Your_workspace": "Votre espace de travail" + "Your_workspace": "Votre espace de travail", + "ABAC_room_attributes": "Attributs de la salle", + "ABAC_managed": "Géré par ABAC", + "ABAC_managed_description": "Seuls les utilisateurs conformes ont accès aux salles contrôlées par accès basé sur les attributs. Les attributs déterminent l'accès à la salle." } \ No newline at end of file diff --git a/app/i18n/locales/hi-IN.json b/app/i18n/locales/hi-IN.json index cc2f95777fe..f3e4e6f04ee 100644 --- a/app/i18n/locales/hi-IN.json +++ b/app/i18n/locales/hi-IN.json @@ -892,5 +892,8 @@ "Your_invite_link_will_never_expire": "आपका आमंत्रण लिंक कभी समाप्त नहीं होगा।", "Your_password_is": "आपका पासवर्ड है", "Your_Password_Must_Have": "आपका पासवर्ड होना चाहिए:", - "Your_workspace": "आपका कार्यस्थान" + "Your_workspace": "आपका कार्यस्थान", + "ABAC_room_attributes": "कमरे के गुण", + "ABAC_managed": "ABAC प्रबंधित", + "ABAC_managed_description": "केवल संगत उपयोगकर्ताओं के पास विशेषता-आधारित पहुँच नियंत्रित कमरों तक पहुँच है। विशेषताएँ कमरे तक पहुँच निर्धारित करती हैं।" } \ No newline at end of file diff --git a/app/i18n/locales/hu.json b/app/i18n/locales/hu.json index 678ad46d8de..ad52babd41e 100644 --- a/app/i18n/locales/hu.json +++ b/app/i18n/locales/hu.json @@ -895,5 +895,8 @@ "Your_invite_link_will_never_expire": "A meghívási hivatkozása sosem jár le.", "Your_password_is": "A jelszava a következő", "Your_Password_Must_Have": "A jelszavának rendelkeznie kell:", - "Your_workspace": "Az Ön munkaterülete" + "Your_workspace": "Az Ön munkaterülete", + "ABAC_room_attributes": "Szoba attribútumok", + "ABAC_managed": "ABAC által kezelt", + "ABAC_managed_description": "Csak a megfelelő felhasználók férhetnek hozzá az attribútum alapú hozzáférés-vezérelt szobákhoz. Az attribútumok határozzák meg a szoba hozzáférését." } \ No newline at end of file diff --git a/app/i18n/locales/it.json b/app/i18n/locales/it.json index cbbff6eb3b1..ece6607a075 100644 --- a/app/i18n/locales/it.json +++ b/app/i18n/locales/it.json @@ -678,5 +678,8 @@ "Your_invite_link_will_never_expire": "Il tuo link di invito non scadrà mai.", "Your_password_is": "La tua password è", "Your_Password_Must_Have": "La tua password deve avere:", - "Your_workspace": "Il tuo workspace" + "Your_workspace": "Il tuo workspace", + "ABAC_room_attributes": "Attributi della stanza", + "ABAC_managed": "Gestito da ABAC", + "ABAC_managed_description": "Solo gli utenti conformi hanno accesso alle stanze controllate da accesso basato su attributi. Gli attributi determinano l'accesso alla stanza." } \ No newline at end of file diff --git a/app/i18n/locales/ja.json b/app/i18n/locales/ja.json index 6eac408d43c..1c4f0659f45 100644 --- a/app/i18n/locales/ja.json +++ b/app/i18n/locales/ja.json @@ -548,5 +548,8 @@ "Your_invite_link_will_expire_on__date__": "招待リンクは{{date}}に使用できなくなります。", "Your_invite_link_will_expire_on__date__or_after__usesLeft__uses": "招待リンクは{{date}}までか、あと{{usesLeft}}回で使用できなくなります。", "Your_invite_link_will_never_expire": "招待リンクはずっと有効です。", - "Your_Password_Must_Have": "パスワードには次のことが必要です。" + "Your_Password_Must_Have": "パスワードには次のことが必要です。", + "ABAC_room_attributes": "部屋の属性", + "ABAC_managed": "ABAC管理", + "ABAC_managed_description": "準拠しているユーザーのみが属性ベースのアクセス制御された部屋にアクセスできます。属性によって部屋へのアクセスが決まります。" } \ No newline at end of file diff --git a/app/i18n/locales/nl.json b/app/i18n/locales/nl.json index b4f0bbb4c89..f8894669c1f 100644 --- a/app/i18n/locales/nl.json +++ b/app/i18n/locales/nl.json @@ -775,5 +775,8 @@ "Your_invite_link_will_never_expire": "Je uitnodigingslink zal nooit verlopen.", "Your_password_is": "Jouw wachtwoord is", "Your_Password_Must_Have": "Uw wachtwoord moet hebben:", - "Your_workspace": "Jouw werkruimte" + "Your_workspace": "Jouw werkruimte", + "ABAC_room_attributes": "Kamerattributen", + "ABAC_managed": "ABAC beheerd", + "ABAC_managed_description": "Alleen conforme gebruikers hebben toegang tot op attributen gebaseerde toegangsgecontroleerde kamers. Attributen bepalen de toegang tot de kamer." } \ No newline at end of file diff --git a/app/i18n/locales/nn.json b/app/i18n/locales/nn.json index f89f7c77d64..f002c7843a0 100644 --- a/app/i18n/locales/nn.json +++ b/app/i18n/locales/nn.json @@ -396,5 +396,8 @@ "You_will_not_be_able_to_recover_this_message": "Du vil ikke kunne gjenopprette denne meldingen!", "Your_invite_link_will_expire_after__usesLeft__uses": "Invitasjonslenken din utløper etter {{usesLeft}} anvendelser.", "Your_invite_link_will_expire_on__date__": "Invitasjonslenken din utløper {{date}}.", - "Your_invite_link_will_expire_on__date__or_after__usesLeft__uses": "Invitasjonskoblingen din utløper {{date}} eller etter {{usesLeft}} anvendelser." + "Your_invite_link_will_expire_on__date__or_after__usesLeft__uses": "Invitasjonskoblingen din utløper {{date}} eller etter {{usesLeft}} anvendelser.", + "ABAC_room_attributes": "Romattributt", + "ABAC_managed": "ABAC-administrert", + "ABAC_managed_description": "Berre kompatible brukarar har tilgang til attributtbaserte tilgangskontrollerte rom. Attributta bestemmer romtilgangen." } \ No newline at end of file diff --git a/app/i18n/locales/no.json b/app/i18n/locales/no.json index 6ba497f838c..790b58006e5 100644 --- a/app/i18n/locales/no.json +++ b/app/i18n/locales/no.json @@ -941,5 +941,9 @@ "Your_invite_link_will_never_expire": "Invitasjonslenken din vil aldri utløpe.", "Your_password_is": "Passordet ditt er", "Your_Password_Must_Have": "Passordet ditt må inneholde:", - "Your_push_was_sent_to_s_devices": "Din push ble sendt til {{s}} enheter" + "Your_push_was_sent_to_s_devices": "Din push ble sendt til {{s}} enheter", + "Your_workspace": "Arbeidsområdet ditt", + "ABAC_room_attributes": "Romattributter", + "ABAC_managed": "ABAC-administrert", + "ABAC_managed_description": "Kun kompatible brukere har tilgang til attributtbaserte tilgangskontrollerte rom. Attributter bestemmer romtilgang." } \ No newline at end of file diff --git a/app/i18n/locales/pt-BR.json b/app/i18n/locales/pt-BR.json index 541bfa95f2b..8d8a6a89831 100644 --- a/app/i18n/locales/pt-BR.json +++ b/app/i18n/locales/pt-BR.json @@ -979,5 +979,8 @@ "Your_password_is": "Sua senha é", "Your_Password_Must_Have": "Sua senha deve conter:", "Your_push_was_sent_to_s_devices": "A sua notificação foi enviada para {{s}} dispositivos", - "Your_workspace": "Sua workspace" + "Your_workspace": "Sua workspace", + "ABAC_room_attributes": "Atributos da sala", + "ABAC_managed": "Gerenciado por ABAC", + "ABAC_managed_description": "Apenas usuários compatíveis têm acesso a salas controladas por acesso baseado em atributos. Atributos determinam o acesso à sala." } \ No newline at end of file diff --git a/app/i18n/locales/pt-PT.json b/app/i18n/locales/pt-PT.json index c6200efc916..f4ed4adfe28 100644 --- a/app/i18n/locales/pt-PT.json +++ b/app/i18n/locales/pt-PT.json @@ -509,5 +509,8 @@ "You_dont_have_account": "Não tem uma conta?", "you_were_mentioned": "você foi mencionado", "You_will_not_be_able_to_recover_this_message": "Você será incapaz de recuperar esta mensagem!", - "Your_Password_Must_Have": "Sua senha deve ter:" + "Your_Password_Must_Have": "Sua senha deve ter:", + "ABAC_room_attributes": "Atributos da sala", + "ABAC_managed": "Gerido por ABAC", + "ABAC_managed_description": "Apenas utilizadores compatíveis têm acesso a salas controladas por acesso baseado em atributos. Atributos determinam o acesso à sala." } \ No newline at end of file diff --git a/app/i18n/locales/ru.json b/app/i18n/locales/ru.json index 9f19d89f889..513ba20f47d 100644 --- a/app/i18n/locales/ru.json +++ b/app/i18n/locales/ru.json @@ -822,5 +822,8 @@ "Your_invite_link_will_never_expire": "Ваша ссылка-приглашение никогда не будет просроченной.", "Your_password_is": "Ваш пароль", "Your_Password_Must_Have": "Ваш пароль должен иметь:", - "Your_workspace": "Ваш сервер" + "Your_workspace": "Ваш сервер", + "ABAC_room_attributes": "Атрибуты комнаты", + "ABAC_managed": "Управляется ABAC", + "ABAC_managed_description": "Только соответствующие пользователи имеют доступ к комнатам с атрибутивным контролем доступа. Атрибуты определяют доступ к комнате." } \ No newline at end of file diff --git a/app/i18n/locales/sl-SI.json b/app/i18n/locales/sl-SI.json index 31781d2b207..8fa0e871f0a 100644 --- a/app/i18n/locales/sl-SI.json +++ b/app/i18n/locales/sl-SI.json @@ -790,5 +790,8 @@ "Your_invite_link_will_never_expire": "Vaša povezava za povabilo ne bo nikoli potekala.", "Your_password_is": "Vaše geslo je", "Your_Password_Must_Have": "Vaše geslo mora imeti:", - "Your_workspace": "Vaš delovni prostor" + "Your_workspace": "Vaš delovni prostor", + "ABAC_room_attributes": "Atributi sobe", + "ABAC_managed": "ABAC upravljano", + "ABAC_managed_description": "Samo skladni uporabniki imajo dostop do sob z nadzorom dostopa na podlagi atributov. Atributi določajo dostop do sobe." } \ No newline at end of file diff --git a/app/i18n/locales/sv.json b/app/i18n/locales/sv.json index 21c289591b7..7dad8a4dab0 100644 --- a/app/i18n/locales/sv.json +++ b/app/i18n/locales/sv.json @@ -852,5 +852,8 @@ "Your_invite_link_will_never_expire": "Inbjudningslänken upphör aldrig att gälla.", "Your_password_is": "Ditt lösenord är", "Your_Password_Must_Have": "Ditt lösenord måste ha:", - "Your_workspace": "Din arbetsyta" + "Your_workspace": "Din arbetsyta", + "ABAC_room_attributes": "Rumsattribut", + "ABAC_managed": "ABAC-hanterat", + "ABAC_managed_description": "Endast kompatibla användare har åtkomst till attributbaserat åtkomstskyddade rum. Attributen avgör tillgången till rummet." } \ No newline at end of file diff --git a/app/i18n/locales/ta-IN.json b/app/i18n/locales/ta-IN.json index b97024effdc..d3fdaf2466c 100644 --- a/app/i18n/locales/ta-IN.json +++ b/app/i18n/locales/ta-IN.json @@ -892,5 +892,8 @@ "Your_invite_link_will_never_expire": "உங்கள் அழைத்துக்கொள்ளும் இணைய கணக்கு எப்போதும் காலாவதியாகின்றதுமில்லை.", "Your_password_is": "உங்கள் கடவுச்சொல் உள்ளது", "Your_Password_Must_Have": "உங்கள் கடவுச்சொல் இருக்க வேண்டும்:", - "Your_workspace": "உங்கள் பணிகள்" + "Your_workspace": "உங்கள் பணிகள்", + "ABAC_room_attributes": "அறை பண்புகள்", + "ABAC_managed": "ABAC நிர்வகிக்கப்பட்டது", + "ABAC_managed_description": "இணக்கமான பயனர்கள் மட்டுமே பண்பு அடிப்படையிலான அணுகல் கட்டுப்படுத்தப்பட்ட அறைகளுக்கு அணுகல் கொண்டுள்ளனர். பண்புகள் அறை அணுகலை தீர்மானிக்கின்றன." } \ No newline at end of file diff --git a/app/i18n/locales/te-IN.json b/app/i18n/locales/te-IN.json index 682d2fa665c..a616d637e80 100644 --- a/app/i18n/locales/te-IN.json +++ b/app/i18n/locales/te-IN.json @@ -891,5 +891,8 @@ "Your_invite_link_will_never_expire": "మీ ఆహ్వాన లింక్ ఎప్పుడూ కనబడదు.", "Your_password_is": "మీ సంకేతపదం", "Your_Password_Must_Have": "మీ పాస్‌వర్డ్ తప్పనిసరిగా ఉండాలి:", - "Your_workspace": "మీ వర్క్‌స్పేస్" + "Your_workspace": "మీ వర్క్‌స్పేస్", + "ABAC_room_attributes": "గది లక్షణాలు", + "ABAC_managed": "ABAC నిర్వహించబడింది", + "ABAC_managed_description": "అట్రిబ్యూట్ ఆధారిత యాక్సెస్ నియంత్రిత గదులకు అనుకూలమైన వినియోగదారులు మాత్రమే ప్రాప్యతను కలిగి ఉంటారు. లక్షణాలు గది ప్రాప్యతను నిర్ణయిస్తాయి." } \ No newline at end of file diff --git a/app/i18n/locales/tr.json b/app/i18n/locales/tr.json index 54bdecd83be..0422225c5b7 100644 --- a/app/i18n/locales/tr.json +++ b/app/i18n/locales/tr.json @@ -661,5 +661,8 @@ "Your_invite_link_will_never_expire": "Davet bağlantınızın geçerlilik süresi asla dolmayacak.", "Your_password_is": "Şifreniz", "Your_Password_Must_Have": "Şifreniz:", - "Your_workspace": "Çalışma alanınız" + "Your_workspace": "Çalışma alanınız", + "ABAC_room_attributes": "Oda özellikleri", + "ABAC_managed": "ABAC tarafından yönetilir", + "ABAC_managed_description": "Yalnızca uyumlu kullanıcılar, öznitelik tabanlı erişim kontrollü odalara erişebilir. Öznitelikler, oda erişimini belirler." } \ No newline at end of file diff --git a/app/i18n/locales/zh-CN.json b/app/i18n/locales/zh-CN.json index 987c8fc7eff..e26cc2024e4 100644 --- a/app/i18n/locales/zh-CN.json +++ b/app/i18n/locales/zh-CN.json @@ -621,5 +621,8 @@ "Your_invite_link_will_never_expire": "您的邀请链接永久有效。", "Your_password_is": "您的密码", "Your_Password_Must_Have": "您的密码必须具有:", - "Your_workspace": "您的工作区" + "Your_workspace": "您的工作区", + "ABAC_room_attributes": "房间属性", + "ABAC_managed": "ABAC 管理", + "ABAC_managed_description": "只有符合条件的用户才能访问基于属性的访问控制房间。属性决定房间访问权限。" } \ No newline at end of file diff --git a/app/i18n/locales/zh-TW.json b/app/i18n/locales/zh-TW.json index bc818601579..8179b0b38db 100644 --- a/app/i18n/locales/zh-TW.json +++ b/app/i18n/locales/zh-TW.json @@ -650,5 +650,8 @@ "Your_invite_link_will_never_expire": "您的邀請連結永久有效。", "Your_password_is": "您的密碼", "Your_Password_Must_Have": "您的密碼必須具有:", - "Your_workspace": "您的工作區" + "Your_workspace": "您的工作區", + "ABAC_room_attributes": "房間屬性", + "ABAC_managed": "ABAC 管理", + "ABAC_managed_description": "只有符合條件的使用者才能存取基於屬性的存取控制房間。屬性決定房間存取權限。" } \ No newline at end of file From a4f8a944fbfe75f36e2938682ec859afdf232bbc Mon Sep 17 00:00:00 2001 From: Diego Mello <diegolmello@gmail.com> Date: Wed, 5 Nov 2025 16:45:10 -0300 Subject: [PATCH 7/9] Add team icon on abac managed tag --- .../RoomHeader/RoomHeader.stories.tsx | 17 +++++++++++++++-- app/containers/RoomItem/RoomItem.stories.tsx | 4 ++-- .../RoomTypeIcon/RoomTypeIcon.stories.tsx | 4 ++-- app/views/RoomInfoView/Channel.tsx | 2 +- .../components/RoomInfoABAC.stories.tsx | 2 +- .../RoomInfoView/components/RoomInfoABAC.tsx | 10 ++++++++-- .../__snapshots__/RoomInfoABAC.test.tsx.snap | 6 +++--- 7 files changed, 32 insertions(+), 13 deletions(-) diff --git a/app/containers/RoomHeader/RoomHeader.stories.tsx b/app/containers/RoomHeader/RoomHeader.stories.tsx index 3187cb4f0b6..2372e1bd305 100644 --- a/app/containers/RoomHeader/RoomHeader.stories.tsx +++ b/app/containers/RoomHeader/RoomHeader.stories.tsx @@ -55,8 +55,21 @@ export const Icons = () => ( <HeaderExample title={() => <RoomHeader title='busy dm' type='d' status='busy' />} /> <HeaderExample title={() => <RoomHeader title='loading dm' type='d' status='loading' />} /> <HeaderExample title={() => <RoomHeader title='offline dm' type='d' />} /> - <HeaderExample title={() => <RoomHeader title='classified' type='p' abacAttributes={['Classified']} />} /> - <HeaderExample title={() => <RoomHeader title='classified' type='p' abacAttributes={['Classified']} teamMain />} /> + <HeaderExample + title={() => ( + <RoomHeader title='classified' type='p' abacAttributes={[{ name: 'Attribute', values: ['Value 1', 'Value 2'] }]} /> + )} + /> + <HeaderExample + title={() => ( + <RoomHeader + title='classified' + type='p' + abacAttributes={[{ name: 'Attribute', values: ['Value 1', 'Value 2'] }]} + teamMain + /> + )} + /> </> ); diff --git a/app/containers/RoomItem/RoomItem.stories.tsx b/app/containers/RoomItem/RoomItem.stories.tsx index ccfcf93893b..074ede08b2c 100644 --- a/app/containers/RoomItem/RoomItem.stories.tsx +++ b/app/containers/RoomItem/RoomItem.stories.tsx @@ -71,8 +71,8 @@ export const Type = () => ( <RoomItem type='l' /> <RoomItem type='discussion' /> <RoomItem type='d' isGroupChat /> - <RoomItem type='p' abacAttributes={['Classified']} /> - <RoomItem type='p' abacAttributes={['Classified']} teamMain /> + <RoomItem type='p' abacAttributes={[{ name: 'Attribute', values: ['Value 1', 'Value 2'] }]} /> + <RoomItem type='p' abacAttributes={[{ name: 'Attribute', values: ['Value 1', 'Value 2'] }]} teamMain /> <RoomItem type='&' /> </> ); diff --git a/app/containers/RoomTypeIcon/RoomTypeIcon.stories.tsx b/app/containers/RoomTypeIcon/RoomTypeIcon.stories.tsx index 9181c98fc57..3e731182bab 100644 --- a/app/containers/RoomTypeIcon/RoomTypeIcon.stories.tsx +++ b/app/containers/RoomTypeIcon/RoomTypeIcon.stories.tsx @@ -18,8 +18,8 @@ export const All = () => ( <RoomTypeIcon size={30} type='p' teamMain /> <RoomTypeIcon size={30} type='discussion' /> <RoomTypeIcon size={30} type='l' status='away' sourceType={{ type: OmnichannelSourceType.SMS }} /> - <RoomTypeIcon size={30} type='p' abacAttributes={['Classified']} /> - <RoomTypeIcon size={30} type='p' abacAttributes={['Classified']} teamMain /> + <RoomTypeIcon size={30} type='p' abacAttributes={[{ name: 'Attribute', values: ['Value 1', 'Value 2'] }]} /> + <RoomTypeIcon size={30} type='p' abacAttributes={[{ name: 'Attribute', values: ['Value 1', 'Value 2'] }]} teamMain /> <RoomTypeIcon size={30} type='p' style={{ margin: 10 }} /> </> ); diff --git a/app/views/RoomInfoView/Channel.tsx b/app/views/RoomInfoView/Channel.tsx index a8615c1ab55..af7f5f4d149 100644 --- a/app/views/RoomInfoView/Channel.tsx +++ b/app/views/RoomInfoView/Channel.tsx @@ -16,7 +16,7 @@ const Channel = ({ room }: { room?: ISubscription }): React.ReactElement => { <Item label={I18n.t('Topic')} content={topic} testID='room-info-view-topic' /> <Item label={I18n.t('Announcement')} content={announcement} testID='room-info-view-announcement' /> <Item label={I18n.t('Broadcast')} content={broadcast} testID='room-info-view-broadcast' /> - <RoomInfoABAC abacAttributes={room?.abacAttributes} /> + <RoomInfoABAC abacAttributes={room?.abacAttributes} teamMain={room?.teamMain} /> </> ); }; diff --git a/app/views/RoomInfoView/components/RoomInfoABAC.stories.tsx b/app/views/RoomInfoView/components/RoomInfoABAC.stories.tsx index 236b05091b3..2acc6adfe4c 100644 --- a/app/views/RoomInfoView/components/RoomInfoABAC.stories.tsx +++ b/app/views/RoomInfoView/components/RoomInfoABAC.stories.tsx @@ -20,7 +20,7 @@ export default { const Story = () => ( <> - <RoomInfoABAC abacAttributes={[{ name: 'Chat sensitivity', values: ['Classified', 'Top Secret'] }]} /> + <RoomInfoABAC abacAttributes={[{ name: 'Chat sensitivity', values: ['Classified', 'Top Secret'] }]} teamMain /> <RoomInfoABAC abacAttributes={[ { name: 'Attribute', values: Array.from({ length: 10 }, (_, index) => `Value ${index + 1}`) }, diff --git a/app/views/RoomInfoView/components/RoomInfoABAC.tsx b/app/views/RoomInfoView/components/RoomInfoABAC.tsx index f5ba348a75e..cecf68696a9 100644 --- a/app/views/RoomInfoView/components/RoomInfoABAC.tsx +++ b/app/views/RoomInfoView/components/RoomInfoABAC.tsx @@ -8,7 +8,13 @@ import { ItemLabel } from './ItemLabel'; import { useTheme } from '../../../theme'; import I18n from '../../../i18n'; -export const RoomInfoABAC = ({ abacAttributes }: { abacAttributes?: ISubscription['abacAttributes'] }) => { +export const RoomInfoABAC = ({ + abacAttributes, + teamMain +}: { + abacAttributes?: ISubscription['abacAttributes']; + teamMain?: boolean; +}) => { const { colors } = useTheme(); if (!abacAttributes?.length) { @@ -20,7 +26,7 @@ export const RoomInfoABAC = ({ abacAttributes }: { abacAttributes?: ISubscriptio <List.Separator style={{ marginBottom: 20 }} /> <View style={{ gap: 16 }}> <RoomInfoTagContainer> - <RoomInfoTag name={I18n.t('ABAC_managed')} icon='hash-shield' /> + <RoomInfoTag name={I18n.t('ABAC_managed')} icon={teamMain ? 'team-shield' : 'hash-shield'} /> </RoomInfoTagContainer> <Text style={[styles.abacDescription, { color: colors.fontSecondaryInfo }]}>{I18n.t('ABAC_managed_description')}</Text> diff --git a/app/views/RoomInfoView/components/__snapshots__/RoomInfoABAC.test.tsx.snap b/app/views/RoomInfoView/components/__snapshots__/RoomInfoABAC.test.tsx.snap index cde5b132df6..50b4c7d7237 100644 --- a/app/views/RoomInfoView/components/__snapshots__/RoomInfoABAC.test.tsx.snap +++ b/app/views/RoomInfoView/components/__snapshots__/RoomInfoABAC.test.tsx.snap @@ -91,7 +91,7 @@ exports[`Story Snapshots: Black should match snapshot 1`] = ` ] } > -  +  </Text> <Text style={ @@ -1009,7 +1009,7 @@ exports[`Story Snapshots: Dark should match snapshot 1`] = ` ] } > -  +  </Text> <Text style={ @@ -1927,7 +1927,7 @@ exports[`Story Snapshots: Light should match snapshot 1`] = ` ] } > -  +  </Text> <Text style={ From 866c506e05450d934b436c1ba71c348d7857b39e Mon Sep 17 00:00:00 2001 From: Diego Mello <diegolmello@gmail.com> Date: Wed, 3 Dec 2025 14:39:24 -0300 Subject: [PATCH 8/9] feat(ABAC): Disable message actions (#6767) --- app/containers/ActionSheet/Item.tsx | 2 +- app/containers/ActionSheet/Provider.tsx | 1 + app/containers/MessageActions/index.tsx | 14 ++++++++++---- app/i18n/locales/ar.json | 9 +++++---- app/i18n/locales/bn-IN.json | 9 +++++---- app/i18n/locales/cs.json | 9 +++++---- app/i18n/locales/de.json | 9 +++++---- app/i18n/locales/en.json | 9 +++++---- app/i18n/locales/es.json | 9 +++++---- app/i18n/locales/fi.json | 9 +++++---- app/i18n/locales/fr.json | 9 +++++---- app/i18n/locales/hi-IN.json | 9 +++++---- app/i18n/locales/hu.json | 9 +++++---- app/i18n/locales/it.json | 9 +++++---- app/i18n/locales/ja.json | 9 +++++---- app/i18n/locales/nl.json | 9 +++++---- app/i18n/locales/nn.json | 9 +++++---- app/i18n/locales/no.json | 9 +++++---- app/i18n/locales/pt-BR.json | 9 +++++---- app/i18n/locales/pt-PT.json | 9 +++++---- app/i18n/locales/ru.json | 9 +++++---- app/i18n/locales/sl-SI.json | 9 +++++---- app/i18n/locales/sv.json | 9 +++++---- app/i18n/locales/ta-IN.json | 9 +++++---- app/i18n/locales/te-IN.json | 9 +++++---- app/i18n/locales/tr.json | 9 +++++---- app/i18n/locales/zh-CN.json | 9 +++++---- app/i18n/locales/zh-TW.json | 9 +++++---- 28 files changed, 137 insertions(+), 105 deletions(-) diff --git a/app/containers/ActionSheet/Item.tsx b/app/containers/ActionSheet/Item.tsx index 33e2d3bb476..0716b430eea 100644 --- a/app/containers/ActionSheet/Item.tsx +++ b/app/containers/ActionSheet/Item.tsx @@ -26,7 +26,7 @@ export const Item = React.memo(({ item, hide }: IActionSheetItem) => { hide(); item?.onPress(); } else { - EventEmitter.emit(LISTENER, { message: I18n.t('You_dont_have_permission_to_perform_this_action') }); + EventEmitter.emit(LISTENER, { message: item?.disabledReason || I18n.t('You_dont_have_permission_to_perform_this_action') }); } }; diff --git a/app/containers/ActionSheet/Provider.tsx b/app/containers/ActionSheet/Provider.tsx index 833dde87fd3..6de0804a344 100644 --- a/app/containers/ActionSheet/Provider.tsx +++ b/app/containers/ActionSheet/Provider.tsx @@ -14,6 +14,7 @@ export type TActionSheetOptionsItem = { onPress: () => void; right?: () => React.ReactElement; enabled?: boolean; + disabledReason?: string; }; export type TActionSheetOptions = { diff --git a/app/containers/MessageActions/index.tsx b/app/containers/MessageActions/index.tsx index 90a516ce0c0..8bee2970bd8 100644 --- a/app/containers/MessageActions/index.tsx +++ b/app/containers/MessageActions/index.tsx @@ -442,7 +442,8 @@ const MessageActions = React.memo( title: I18n.t('Reply_in_direct_message'), icon: 'arrow-back', onPress: () => handleReplyInDM(message), - enabled: permissions.hasCreateDirectMessagePermission + enabled: permissions.hasCreateDirectMessagePermission && !room.abacAttributes, + disabledReason: room.abacAttributes && I18n.t('ABAC_disabled_action_reason') }); } @@ -454,19 +455,24 @@ const MessageActions = React.memo( enabled: permissions.hasCreateDiscussionOtherUserPermission }); + // Forward if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '6.2.0') && !videoConfBlock) { options.push({ title: I18n.t('Forward'), icon: 'arrow-forward', - onPress: () => handleShareMessage(message) + onPress: () => handleShareMessage(message), + enabled: !room.abacAttributes, + disabledReason: room.abacAttributes && I18n.t('ABAC_disabled_action_reason') }); } - // Permalink + // Get link options.push({ title: I18n.t('Get_link'), icon: 'link', - onPress: () => handlePermalink(message) + onPress: () => handlePermalink(message), + enabled: !room.abacAttributes, + disabledReason: room.abacAttributes && I18n.t('ABAC_disabled_action_reason') }); // Copy diff --git a/app/i18n/locales/ar.json b/app/i18n/locales/ar.json index 4c699d91811..9ab21ac7c1d 100644 --- a/app/i18n/locales/ar.json +++ b/app/i18n/locales/ar.json @@ -8,6 +8,10 @@ "A11y_in_app_notification": "رسالة جديدة من {{name}}: {{message}}", "A11y_incoming_call_dismiss": "تجاهل", "A11y_incoming_call_swipe_down_to_view_options": "اسحب لأسفل لعرض الخيارات", + "ABAC_disabled_action_reason": "غير متاح في الغرف المدارة بواسطة ABAC", + "ABAC_managed": "مدار بواسطة ABAC", + "ABAC_managed_description": "فقط المستخدمون المتوافقون لديهم حق الوصول إلى الغرف التي يتم التحكم فيها بالوصول المستند إلى السمات. تحدد السمات الوصول إلى الغرفة.", + "ABAC_room_attributes": "سمات الغرفة", "Accessibility": "إمكانية الوصول", "Accessibility_and_Appearance": "إمكانية الوصول والمظهر", "Accessibility_statement": "بيان الوصول", @@ -629,8 +633,5 @@ "Your_invite_link_will_never_expire": "لن تنتهي صلاحية رابط الدعوة الخاص بك", "Your_password_is": "كلمة المرور الخاصة بك هي", "Your_Password_Must_Have": "يجب أن تحتوي كلمة المرور الخاصة بك على:", - "Your_workspace": "مساحة عملك", - "ABAC_room_attributes": "سمات الغرفة", - "ABAC_managed": "مدار بواسطة ABAC", - "ABAC_managed_description": "فقط المستخدمون المتوافقون لديهم حق الوصول إلى الغرف التي يتم التحكم فيها بالوصول المستند إلى السمات. تحدد السمات الوصول إلى الغرفة." + "Your_workspace": "مساحة عملك" } \ No newline at end of file diff --git a/app/i18n/locales/bn-IN.json b/app/i18n/locales/bn-IN.json index 8cf520405ad..948811c898e 100644 --- a/app/i18n/locales/bn-IN.json +++ b/app/i18n/locales/bn-IN.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "{{name}} থেকে নতুন বার্তা: {{message}}", "A11y_incoming_call_dismiss": "বন্ধ করুন", "A11y_incoming_call_swipe_down_to_view_options": "নির্বাচনগুলি দেখতে নিচে সোয়াইপ করুন", + "ABAC_disabled_action_reason": "ABAC-পরিচালিত রুমগুলিতে উপলব্ধ নয়", + "ABAC_managed": "ABAC দ্বারা পরিচালিত", + "ABAC_managed_description": "শুধুমাত্র অনুগত ব্যবহারকারীদের অ্যাট্রিবিউট-ভিত্তিক অ্যাক্সেস নিয়ন্ত্রিত রুমগুলিতে অ্যাক্সেস আছে। অ্যাট্রিবিউটগুলি রুমের অ্যাক্সেস নির্ধারণ করে।", + "ABAC_room_attributes": "রুমের বৈশিষ্ট্য", "accept": "গ্রহণ করুন", "Accessibility": "অ্যাক্সেসিবিলিটি", "Accessibility_and_Appearance": "অ্যাক্সেসিবিলিটি ও চেহারা", @@ -892,8 +896,5 @@ "Your_invite_link_will_never_expire": "আপনার আমন্ত্রণ লিঙ্কটি কখনও মেয়াদ শেষ হবে না।", "Your_password_is": "আপনার পাসওয়ার্ড হল", "Your_Password_Must_Have": "আপনার পাসওয়ার্ড থাকতে হবে:", - "Your_workspace": "আপনার ওয়ার্কস্পেস", - "ABAC_room_attributes": "রুমের বৈশিষ্ট্য", - "ABAC_managed": "ABAC দ্বারা পরিচালিত", - "ABAC_managed_description": "শুধুমাত্র অনুগত ব্যবহারকারীদের অ্যাট্রিবিউট-ভিত্তিক অ্যাক্সেস নিয়ন্ত্রিত রুমগুলিতে অ্যাক্সেস আছে। অ্যাট্রিবিউটগুলি রুমের অ্যাক্সেস নির্ধারণ করে।" + "Your_workspace": "আপনার ওয়ার্কস্পেস" } \ No newline at end of file diff --git a/app/i18n/locales/cs.json b/app/i18n/locales/cs.json index db37000f5ee..3f63a2f0586 100644 --- a/app/i18n/locales/cs.json +++ b/app/i18n/locales/cs.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "Nová zpráva od {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Zavřít", "A11y_incoming_call_swipe_down_to_view_options": "Přejetím dolů zobrazíte možnosti", + "ABAC_disabled_action_reason": "Není k dispozici v místnostech spravovaných systémem ABAC", + "ABAC_managed": "Spravováno ABAC", + "ABAC_managed_description": "Pouze vyhovující uživatelé mají přístup k místnostem řízeným přístupem na základě atributů. Atributy určují přístup k místnosti.", + "ABAC_room_attributes": "Atributy místnosti", "accept": "Akceptovat", "Accessibility": "Přístupnost", "Accessibility_and_Appearance": "Přístupnost a vzhled", @@ -967,8 +971,5 @@ "Your_password_is": "Vaše heslo je", "Your_Password_Must_Have": "Vaše heslo musí mít:", "Your_push_was_sent_to_s_devices": "Vaše push byla odeslána do {{s}} zařízení", - "Your_workspace": "Váš pracovní prostor", - "ABAC_room_attributes": "Atributy místnosti", - "ABAC_managed": "Spravováno ABAC", - "ABAC_managed_description": "Pouze vyhovující uživatelé mají přístup k místnostem řízeným přístupem na základě atributů. Atributy určují přístup k místnosti." + "Your_workspace": "Váš pracovní prostor" } \ No newline at end of file diff --git a/app/i18n/locales/de.json b/app/i18n/locales/de.json index c813b5d7de0..cb6225146db 100644 --- a/app/i18n/locales/de.json +++ b/app/i18n/locales/de.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "Neue Nachricht von {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Verwerfen", "A11y_incoming_call_swipe_down_to_view_options": "Nach unten wischen, um Optionen anzuzeigen", + "ABAC_disabled_action_reason": "Nicht verfügbar in ABAC-verwalteten Räumen", + "ABAC_managed": "ABAC verwaltet", + "ABAC_managed_description": "Nur konforme Benutzer haben Zugriff auf attributbasierte zugriffsgesteuerte Räume. Attribute bestimmen den Raumzugriff.", + "ABAC_room_attributes": "Raumattribute", "accept": "Annehmen", "Accessibility": "Barrierefreiheit", "Accessibility_and_Appearance": "Barrierefreiheit & Erscheinungsbild", @@ -882,8 +886,5 @@ "Your_invite_link_will_never_expire": "Ihr Einladungs-Link wird niemals ablaufen.", "Your_password_is": "Ihr Passwort lautet", "Your_Password_Must_Have": "Ihr Passwort muss:", - "Your_workspace": "Ihr Arbeitsbereich", - "ABAC_room_attributes": "Raumattribute", - "ABAC_managed": "ABAC verwaltet", - "ABAC_managed_description": "Nur konforme Benutzer haben Zugriff auf attributbasierte zugriffsgesteuerte Räume. Attribute bestimmen den Raumzugriff." + "Your_workspace": "Ihr Arbeitsbereich" } \ No newline at end of file diff --git a/app/i18n/locales/en.json b/app/i18n/locales/en.json index 60dccaf9a20..6d3dfff52f9 100644 --- a/app/i18n/locales/en.json +++ b/app/i18n/locales/en.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "New message from {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Dismiss", "A11y_incoming_call_swipe_down_to_view_options": "Swipe down to view options", + "ABAC_disabled_action_reason": "Not available in ABAC-managed rooms", + "ABAC_managed": "ABAC managed", + "ABAC_managed_description": "Only compliant users have access to attribute-based access controlled rooms. Attributes determine room access.", + "ABAC_room_attributes": "Room attributes", "accept": "Accept", "Accessibility": "Accessibility", "Accessibility_and_Appearance": "Accessibility & appearance", @@ -995,8 +999,5 @@ "Your_invite_link_will_never_expire": "Your invite link will never expire.", "Your_password_is": "Your password is", "Your_Password_Must_Have": "Your password must have:", - "Your_push_was_sent_to_s_devices": "Your push was sent to {{s}} devices", - "ABAC_room_attributes": "Room attributes", - "ABAC_managed": "ABAC managed", - "ABAC_managed_description": "Only compliant users have access to attribute-based access controlled rooms. Attributes determine room access." + "Your_push_was_sent_to_s_devices": "Your push was sent to {{s}} devices" } \ No newline at end of file diff --git a/app/i18n/locales/es.json b/app/i18n/locales/es.json index 11b63245287..d685d7fa56b 100644 --- a/app/i18n/locales/es.json +++ b/app/i18n/locales/es.json @@ -8,6 +8,10 @@ "A11y_in_app_notification": "Nuevo mensaje de {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Descartar", "A11y_incoming_call_swipe_down_to_view_options": "Desliza hacia abajo para ver opciones", + "ABAC_disabled_action_reason": "No disponible en salas gestionadas por ABAC", + "ABAC_managed": "Gestionado por ABAC", + "ABAC_managed_description": "Solo los usuarios compatibles tienen acceso a las salas controladas por acceso basado en atributos. Los atributos determinan el acceso a la sala.", + "ABAC_room_attributes": "Atributos de la sala", "Accessibility": "Accesibilidad", "Accessibility_and_Appearance": "Accesibilidad y apariencia", "Accessibility_statement": "Declaración de accesibilidad", @@ -448,8 +452,5 @@ "you_were_mentioned": "has sido mencionado", "You_will_not_be_able_to_recover_this_message": "¡No podrás recuperar este mensaje!", "Your_certificate": "Tu certificado", - "Your_Password_Must_Have": "Su contraseña debe tener:", - "ABAC_room_attributes": "Atributos de la sala", - "ABAC_managed": "Gestionado por ABAC", - "ABAC_managed_description": "Solo los usuarios compatibles tienen acceso a las salas controladas por acceso basado en atributos. Los atributos determinan el acceso a la sala." + "Your_Password_Must_Have": "Su contraseña debe tener:" } \ No newline at end of file diff --git a/app/i18n/locales/fi.json b/app/i18n/locales/fi.json index 21d7df5216f..b6c4dce8162 100644 --- a/app/i18n/locales/fi.json +++ b/app/i18n/locales/fi.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "Uusi viesti {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Hylkää", "A11y_incoming_call_swipe_down_to_view_options": "Pyyhkäise alas nähdäksesi vaihtoehdot", + "ABAC_disabled_action_reason": "Ei saatavilla ABAC-hallituissa huoneissa", + "ABAC_managed": "ABAC-hallittu", + "ABAC_managed_description": "Vain yhteensopivilla käyttäjillä on pääsy attribuuttipohjaisesti hallittuihin huoneisiin. Attribuutit määrittävät huoneen pääsyn.", + "ABAC_room_attributes": "Huoneen attribuutit", "Accessibility": "Saavutettavuus", "Accessibility_and_Appearance": "Saavutettavuus ja ulkonäkö", "Accessibility_statement": "Saavutettavuusilmoitus", @@ -854,8 +858,5 @@ "Your_invite_link_will_never_expire": "Kutsulinkkisi ei vanhene.", "Your_password_is": "Salasanasi on", "Your_Password_Must_Have": "Salasanasi on oltava:", - "Your_workspace": "Työtilasi", - "ABAC_room_attributes": "Huoneen attribuutit", - "ABAC_managed": "ABAC-hallittu", - "ABAC_managed_description": "Vain yhteensopivilla käyttäjillä on pääsy attribuuttipohjaisesti hallittuihin huoneisiin. Attribuutit määrittävät huoneen pääsyn." + "Your_workspace": "Työtilasi" } \ No newline at end of file diff --git a/app/i18n/locales/fr.json b/app/i18n/locales/fr.json index 5db54e6cad5..2e4889b8199 100644 --- a/app/i18n/locales/fr.json +++ b/app/i18n/locales/fr.json @@ -8,6 +8,10 @@ "A11y_in_app_notification": "Nouveau message de {{name}} : {{message}}", "A11y_incoming_call_dismiss": "Ignorer", "A11y_incoming_call_swipe_down_to_view_options": "Faites glisser vers le bas pour voir les options", + "ABAC_disabled_action_reason": "Non disponible dans les salles gérées par ABAC", + "ABAC_managed": "Géré par ABAC", + "ABAC_managed_description": "Seuls les utilisateurs conformes ont accès aux salles contrôlées par accès basé sur les attributs. Les attributs déterminent l'accès à la salle.", + "ABAC_room_attributes": "Attributs de la salle", "Accessibility": "Accessibilité", "Accessibility_and_Appearance": "Accessibilité et apparence", "Accessibility_statement": "Déclaration d'accessibilité", @@ -775,8 +779,5 @@ "Your_invite_link_will_never_expire": "Votre lien d'invitation n'expirera jamais.", "Your_password_is": "Votre mot de passe est", "Your_Password_Must_Have": "Votre mot de passe doit avoir:", - "Your_workspace": "Votre espace de travail", - "ABAC_room_attributes": "Attributs de la salle", - "ABAC_managed": "Géré par ABAC", - "ABAC_managed_description": "Seuls les utilisateurs conformes ont accès aux salles contrôlées par accès basé sur les attributs. Les attributs déterminent l'accès à la salle." + "Your_workspace": "Votre espace de travail" } \ No newline at end of file diff --git a/app/i18n/locales/hi-IN.json b/app/i18n/locales/hi-IN.json index f3e4e6f04ee..a43f41f628e 100644 --- a/app/i18n/locales/hi-IN.json +++ b/app/i18n/locales/hi-IN.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "{{name}} से नया संदेश: {{message}}", "A11y_incoming_call_dismiss": "खारिज करें", "A11y_incoming_call_swipe_down_to_view_options": "विकल्प देखने के लिए नीचे स्वाइप करें", + "ABAC_disabled_action_reason": "ABAC-प्रबंधित कमरों में उपलब्ध नहीं है", + "ABAC_managed": "ABAC प्रबंधित", + "ABAC_managed_description": "केवल संगत उपयोगकर्ताओं के पास विशेषता-आधारित पहुँच नियंत्रित कमरों तक पहुँच है। विशेषताएँ कमरे तक पहुँच निर्धारित करती हैं।", + "ABAC_room_attributes": "कमरे के गुण", "accept": "स्वीकार करें", "Accessibility": "प्रवेशयोग्यता", "Accessibility_and_Appearance": "प्रवेशयोग्यता और दृश्यता", @@ -892,8 +896,5 @@ "Your_invite_link_will_never_expire": "आपका आमंत्रण लिंक कभी समाप्त नहीं होगा।", "Your_password_is": "आपका पासवर्ड है", "Your_Password_Must_Have": "आपका पासवर्ड होना चाहिए:", - "Your_workspace": "आपका कार्यस्थान", - "ABAC_room_attributes": "कमरे के गुण", - "ABAC_managed": "ABAC प्रबंधित", - "ABAC_managed_description": "केवल संगत उपयोगकर्ताओं के पास विशेषता-आधारित पहुँच नियंत्रित कमरों तक पहुँच है। विशेषताएँ कमरे तक पहुँच निर्धारित करती हैं।" + "Your_workspace": "आपका कार्यस्थान" } \ No newline at end of file diff --git a/app/i18n/locales/hu.json b/app/i18n/locales/hu.json index ad52babd41e..1022ced3e7e 100644 --- a/app/i18n/locales/hu.json +++ b/app/i18n/locales/hu.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "Új üzenet érkezett {{name}}-tól: {{message}}", "A11y_incoming_call_dismiss": "Elutasítás", "A11y_incoming_call_swipe_down_to_view_options": "Húzza lefelé az opciók megtekintéséhez", + "ABAC_disabled_action_reason": "Nem érhető el ABAC által kezelt szobákban", + "ABAC_managed": "ABAC által kezelt", + "ABAC_managed_description": "Csak a megfelelő felhasználók férhetnek hozzá az attribútum alapú hozzáférés-vezérelt szobákhoz. Az attribútumok határozzák meg a szoba hozzáférését.", + "ABAC_room_attributes": "Szoba attribútumok", "accept": "Elfogadom", "Accessibility": "Akadálymentesség", "Accessibility_and_Appearance": "Hozzáférhetőség és megjelenés", @@ -895,8 +899,5 @@ "Your_invite_link_will_never_expire": "A meghívási hivatkozása sosem jár le.", "Your_password_is": "A jelszava a következő", "Your_Password_Must_Have": "A jelszavának rendelkeznie kell:", - "Your_workspace": "Az Ön munkaterülete", - "ABAC_room_attributes": "Szoba attribútumok", - "ABAC_managed": "ABAC által kezelt", - "ABAC_managed_description": "Csak a megfelelő felhasználók férhetnek hozzá az attribútum alapú hozzáférés-vezérelt szobákhoz. Az attribútumok határozzák meg a szoba hozzáférését." + "Your_workspace": "Az Ön munkaterülete" } \ No newline at end of file diff --git a/app/i18n/locales/it.json b/app/i18n/locales/it.json index ece6607a075..1c6922c4844 100644 --- a/app/i18n/locales/it.json +++ b/app/i18n/locales/it.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "Nuovo messaggio da {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Ignora", "A11y_incoming_call_swipe_down_to_view_options": "Scorri verso il basso per visualizzare le opzioni", + "ABAC_disabled_action_reason": "Non disponibile nelle stanze gestite da ABAC", + "ABAC_managed": "Gestito da ABAC", + "ABAC_managed_description": "Solo gli utenti conformi hanno accesso alle stanze controllate da accesso basato su attributi. Gli attributi determinano l'accesso alla stanza.", + "ABAC_room_attributes": "Attributi della stanza", "Accessibility": "Accessibilità", "Accessibility_and_Appearance": "Accessibilità e aspetto", "Accessibility_statement": "Dichiarazione di accessibilità", @@ -678,8 +682,5 @@ "Your_invite_link_will_never_expire": "Il tuo link di invito non scadrà mai.", "Your_password_is": "La tua password è", "Your_Password_Must_Have": "La tua password deve avere:", - "Your_workspace": "Il tuo workspace", - "ABAC_room_attributes": "Attributi della stanza", - "ABAC_managed": "Gestito da ABAC", - "ABAC_managed_description": "Solo gli utenti conformi hanno accesso alle stanze controllate da accesso basato su attributi. Gli attributi determinano l'accesso alla stanza." + "Your_workspace": "Il tuo workspace" } \ No newline at end of file diff --git a/app/i18n/locales/ja.json b/app/i18n/locales/ja.json index 1c4f0659f45..ba4463b1cd8 100644 --- a/app/i18n/locales/ja.json +++ b/app/i18n/locales/ja.json @@ -8,6 +8,10 @@ "A11y_in_app_notification": "{{name}} からの新しいメッセージ: {{message}}", "A11y_incoming_call_dismiss": "閉じる", "A11y_incoming_call_swipe_down_to_view_options": "オプションを見るには下にスワイプしてください", + "ABAC_disabled_action_reason": "ABAC管理の部屋では利用できません", + "ABAC_managed": "ABAC管理", + "ABAC_managed_description": "準拠しているユーザーのみが属性ベースのアクセス制御された部屋にアクセスできます。属性によって部屋へのアクセスが決まります。", + "ABAC_room_attributes": "部屋の属性", "Accessibility": "アクセシビリティ", "Accessibility_and_Appearance": "アクセシビリティと外観", "Accessibility_statement": "アクセシビリティ声明", @@ -548,8 +552,5 @@ "Your_invite_link_will_expire_on__date__": "招待リンクは{{date}}に使用できなくなります。", "Your_invite_link_will_expire_on__date__or_after__usesLeft__uses": "招待リンクは{{date}}までか、あと{{usesLeft}}回で使用できなくなります。", "Your_invite_link_will_never_expire": "招待リンクはずっと有効です。", - "Your_Password_Must_Have": "パスワードには次のことが必要です。", - "ABAC_room_attributes": "部屋の属性", - "ABAC_managed": "ABAC管理", - "ABAC_managed_description": "準拠しているユーザーのみが属性ベースのアクセス制御された部屋にアクセスできます。属性によって部屋へのアクセスが決まります。" + "Your_Password_Must_Have": "パスワードには次のことが必要です。" } \ No newline at end of file diff --git a/app/i18n/locales/nl.json b/app/i18n/locales/nl.json index f8894669c1f..b53278c0972 100644 --- a/app/i18n/locales/nl.json +++ b/app/i18n/locales/nl.json @@ -8,6 +8,10 @@ "A11y_in_app_notification": "Nieuw bericht van {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Afwijzen", "A11y_incoming_call_swipe_down_to_view_options": "Veeg omlaag om opties te bekijken", + "ABAC_disabled_action_reason": "Niet beschikbaar in ABAC-beheerde kamers", + "ABAC_managed": "ABAC beheerd", + "ABAC_managed_description": "Alleen conforme gebruikers hebben toegang tot op attributen gebaseerde toegangsgecontroleerde kamers. Attributen bepalen de toegang tot de kamer.", + "ABAC_room_attributes": "Kamerattributen", "Accessibility": "Toegankelijkheid", "Accessibility_and_Appearance": "Toegankelijkheid & uiterlijk", "Accessibility_statement": "Toegankelijkheidsverklaring", @@ -775,8 +779,5 @@ "Your_invite_link_will_never_expire": "Je uitnodigingslink zal nooit verlopen.", "Your_password_is": "Jouw wachtwoord is", "Your_Password_Must_Have": "Uw wachtwoord moet hebben:", - "Your_workspace": "Jouw werkruimte", - "ABAC_room_attributes": "Kamerattributen", - "ABAC_managed": "ABAC beheerd", - "ABAC_managed_description": "Alleen conforme gebruikers hebben toegang tot op attributen gebaseerde toegangsgecontroleerde kamers. Attributen bepalen de toegang tot de kamer." + "Your_workspace": "Jouw werkruimte" } \ No newline at end of file diff --git a/app/i18n/locales/nn.json b/app/i18n/locales/nn.json index f002c7843a0..7e5abbb49d5 100644 --- a/app/i18n/locales/nn.json +++ b/app/i18n/locales/nn.json @@ -7,6 +7,10 @@ "A11y_in_app_notification": "Ny melding frå {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Avslå", "A11y_incoming_call_swipe_down_to_view_options": "Sveip ned for å sjå alternativa", + "ABAC_disabled_action_reason": "Ikkje tilgjengeleg i ABAC-administrerte rom", + "ABAC_managed": "ABAC-administrert", + "ABAC_managed_description": "Berre kompatible brukarar har tilgang til attributtbaserte tilgangskontrollerte rom. Attributta bestemmer romtilgangen.", + "ABAC_room_attributes": "Romattributt", "accept": "Aksepter", "Accessibility": "Tilgjengelighet", "Accessibility_and_Appearance": "Tilgjengelighet og utseende", @@ -396,8 +400,5 @@ "You_will_not_be_able_to_recover_this_message": "Du vil ikke kunne gjenopprette denne meldingen!", "Your_invite_link_will_expire_after__usesLeft__uses": "Invitasjonslenken din utløper etter {{usesLeft}} anvendelser.", "Your_invite_link_will_expire_on__date__": "Invitasjonslenken din utløper {{date}}.", - "Your_invite_link_will_expire_on__date__or_after__usesLeft__uses": "Invitasjonskoblingen din utløper {{date}} eller etter {{usesLeft}} anvendelser.", - "ABAC_room_attributes": "Romattributt", - "ABAC_managed": "ABAC-administrert", - "ABAC_managed_description": "Berre kompatible brukarar har tilgang til attributtbaserte tilgangskontrollerte rom. Attributta bestemmer romtilgangen." + "Your_invite_link_will_expire_on__date__or_after__usesLeft__uses": "Invitasjonskoblingen din utløper {{date}} eller etter {{usesLeft}} anvendelser." } \ No newline at end of file diff --git a/app/i18n/locales/no.json b/app/i18n/locales/no.json index 790b58006e5..e1d71774516 100644 --- a/app/i18n/locales/no.json +++ b/app/i18n/locales/no.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "Ny melding fra {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Avvis", "A11y_incoming_call_swipe_down_to_view_options": "Dra ned for å se alternativer", + "ABAC_disabled_action_reason": "Ikke tilgjengelig i ABAC-administrerte rom", + "ABAC_managed": "ABAC-administrert", + "ABAC_managed_description": "Kun kompatible brukere har tilgang til attributtbaserte tilgangskontrollerte rom. Attributter bestemmer romtilgang.", + "ABAC_room_attributes": "Romattributter", "accept": "Aksepter", "Accessibility": "Tilgjengelighet", "Accessibility_and_Appearance": "Tilgjengelighet og utseende", @@ -942,8 +946,5 @@ "Your_password_is": "Passordet ditt er", "Your_Password_Must_Have": "Passordet ditt må inneholde:", "Your_push_was_sent_to_s_devices": "Din push ble sendt til {{s}} enheter", - "Your_workspace": "Arbeidsområdet ditt", - "ABAC_room_attributes": "Romattributter", - "ABAC_managed": "ABAC-administrert", - "ABAC_managed_description": "Kun kompatible brukere har tilgang til attributtbaserte tilgangskontrollerte rom. Attributter bestemmer romtilgang." + "Your_workspace": "Arbeidsområdet ditt" } \ No newline at end of file diff --git a/app/i18n/locales/pt-BR.json b/app/i18n/locales/pt-BR.json index 8d8a6a89831..804f372dd29 100644 --- a/app/i18n/locales/pt-BR.json +++ b/app/i18n/locales/pt-BR.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "Nova mensagem de {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Dispensar", "A11y_incoming_call_swipe_down_to_view_options": "Deslize para baixo para ver as opções", + "ABAC_disabled_action_reason": "Não disponível em salas gerenciadas por ABAC", + "ABAC_managed": "Gerenciado por ABAC", + "ABAC_managed_description": "Apenas usuários compatíveis têm acesso a salas controladas por acesso baseado em atributos. Atributos determinam o acesso à sala.", + "ABAC_room_attributes": "Atributos da sala", "accept": "Aceitar", "Accessibility": "Acessibilidade", "Accessibility_and_Appearance": "Acessibilidade e aparência", @@ -979,8 +983,5 @@ "Your_password_is": "Sua senha é", "Your_Password_Must_Have": "Sua senha deve conter:", "Your_push_was_sent_to_s_devices": "A sua notificação foi enviada para {{s}} dispositivos", - "Your_workspace": "Sua workspace", - "ABAC_room_attributes": "Atributos da sala", - "ABAC_managed": "Gerenciado por ABAC", - "ABAC_managed_description": "Apenas usuários compatíveis têm acesso a salas controladas por acesso baseado em atributos. Atributos determinam o acesso à sala." + "Your_workspace": "Sua workspace" } \ No newline at end of file diff --git a/app/i18n/locales/pt-PT.json b/app/i18n/locales/pt-PT.json index f4ed4adfe28..98c729da39e 100644 --- a/app/i18n/locales/pt-PT.json +++ b/app/i18n/locales/pt-PT.json @@ -8,6 +8,10 @@ "A11y_in_app_notification": "Nova mensagem de {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Dispensar", "A11y_incoming_call_swipe_down_to_view_options": "Deslize para baixo para ver as opções.", + "ABAC_disabled_action_reason": "Não disponível em salas geridas por ABAC", + "ABAC_managed": "Gerido por ABAC", + "ABAC_managed_description": "Apenas utilizadores compatíveis têm acesso a salas controladas por acesso baseado em atributos. Atributos determinam o acesso à sala.", + "ABAC_room_attributes": "Atributos da sala", "Accessibility": "Acessibilidade", "Accessibility_and_Appearance": "Acessibilidade e aparência", "Accessibility_statement": "Declaração de acessibilidade", @@ -509,8 +513,5 @@ "You_dont_have_account": "Não tem uma conta?", "you_were_mentioned": "você foi mencionado", "You_will_not_be_able_to_recover_this_message": "Você será incapaz de recuperar esta mensagem!", - "Your_Password_Must_Have": "Sua senha deve ter:", - "ABAC_room_attributes": "Atributos da sala", - "ABAC_managed": "Gerido por ABAC", - "ABAC_managed_description": "Apenas utilizadores compatíveis têm acesso a salas controladas por acesso baseado em atributos. Atributos determinam o acesso à sala." + "Your_Password_Must_Have": "Sua senha deve ter:" } \ No newline at end of file diff --git a/app/i18n/locales/ru.json b/app/i18n/locales/ru.json index 513ba20f47d..ce9a366e807 100644 --- a/app/i18n/locales/ru.json +++ b/app/i18n/locales/ru.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "Новое сообщение от {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Отклонить", "A11y_incoming_call_swipe_down_to_view_options": "Проведите вниз, чтобы просмотреть варианты действий", + "ABAC_disabled_action_reason": "Недоступно в комнатах, управляемых ABAC", + "ABAC_managed": "Управляется ABAC", + "ABAC_managed_description": "Только соответствующие пользователи имеют доступ к комнатам с атрибутивным контролем доступа. Атрибуты определяют доступ к комнате.", + "ABAC_room_attributes": "Атрибуты комнаты", "Accessibility": "Доступность", "Accessibility_and_Appearance": "Доступность и внешний вид", "Accessibility_statement": "Заявление о доступности", @@ -822,8 +826,5 @@ "Your_invite_link_will_never_expire": "Ваша ссылка-приглашение никогда не будет просроченной.", "Your_password_is": "Ваш пароль", "Your_Password_Must_Have": "Ваш пароль должен иметь:", - "Your_workspace": "Ваш сервер", - "ABAC_room_attributes": "Атрибуты комнаты", - "ABAC_managed": "Управляется ABAC", - "ABAC_managed_description": "Только соответствующие пользователи имеют доступ к комнатам с атрибутивным контролем доступа. Атрибуты определяют доступ к комнате." + "Your_workspace": "Ваш сервер" } \ No newline at end of file diff --git a/app/i18n/locales/sl-SI.json b/app/i18n/locales/sl-SI.json index 8fa0e871f0a..5648d7daab6 100644 --- a/app/i18n/locales/sl-SI.json +++ b/app/i18n/locales/sl-SI.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "Novo sporočilo od {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Opusti", "A11y_incoming_call_swipe_down_to_view_options": "Podrsnite navzdol za ogled možnosti", + "ABAC_disabled_action_reason": "Ni na voljo v sobah, ki jih upravlja ABAC", + "ABAC_managed": "ABAC upravljano", + "ABAC_managed_description": "Samo skladni uporabniki imajo dostop do sob z nadzorom dostopa na podlagi atributov. Atributi določajo dostop do sobe.", + "ABAC_room_attributes": "Atributi sobe", "Accessibility": "Dostopnost", "Accessibility_and_Appearance": "Dostopnost in videz", "Accessibility_statement": "Izjava o dostopnosti", @@ -790,8 +794,5 @@ "Your_invite_link_will_never_expire": "Vaša povezava za povabilo ne bo nikoli potekala.", "Your_password_is": "Vaše geslo je", "Your_Password_Must_Have": "Vaše geslo mora imeti:", - "Your_workspace": "Vaš delovni prostor", - "ABAC_room_attributes": "Atributi sobe", - "ABAC_managed": "ABAC upravljano", - "ABAC_managed_description": "Samo skladni uporabniki imajo dostop do sob z nadzorom dostopa na podlagi atributov. Atributi določajo dostop do sobe." + "Your_workspace": "Vaš delovni prostor" } \ No newline at end of file diff --git a/app/i18n/locales/sv.json b/app/i18n/locales/sv.json index 7dad8a4dab0..7c157d2f534 100644 --- a/app/i18n/locales/sv.json +++ b/app/i18n/locales/sv.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "Nytt meddelande från {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Avvisa", "A11y_incoming_call_swipe_down_to_view_options": "Svep nedåt för att se alternativ", + "ABAC_disabled_action_reason": "Inte tillgängligt i ABAC-hanterade rum", + "ABAC_managed": "ABAC-hanterat", + "ABAC_managed_description": "Endast kompatibla användare har åtkomst till attributbaserat åtkomstskyddade rum. Attributen avgör tillgången till rummet.", + "ABAC_room_attributes": "Rumsattribut", "Accessibility": "Tillgänglighet", "Accessibility_and_Appearance": "Tillgänglighet och utseende", "Accessibility_statement": "Tillgänglighetsredogörelse", @@ -852,8 +856,5 @@ "Your_invite_link_will_never_expire": "Inbjudningslänken upphör aldrig att gälla.", "Your_password_is": "Ditt lösenord är", "Your_Password_Must_Have": "Ditt lösenord måste ha:", - "Your_workspace": "Din arbetsyta", - "ABAC_room_attributes": "Rumsattribut", - "ABAC_managed": "ABAC-hanterat", - "ABAC_managed_description": "Endast kompatibla användare har åtkomst till attributbaserat åtkomstskyddade rum. Attributen avgör tillgången till rummet." + "Your_workspace": "Din arbetsyta" } \ No newline at end of file diff --git a/app/i18n/locales/ta-IN.json b/app/i18n/locales/ta-IN.json index d3fdaf2466c..1951d15df55 100644 --- a/app/i18n/locales/ta-IN.json +++ b/app/i18n/locales/ta-IN.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "{{name}}-இருந்து புதிய செய்தி: {{message}}", "A11y_incoming_call_dismiss": "தள்ளு", "A11y_incoming_call_swipe_down_to_view_options": "விருப்பங்களைப் பார்க்க கீழே நகர்த்தவும்", + "ABAC_disabled_action_reason": "ABAC-நிர்வகிக்கப்படும் அறைகளில் கிடைக்காது", + "ABAC_managed": "ABAC நிர்வகிக்கப்பட்டது", + "ABAC_managed_description": "இணக்கமான பயனர்கள் மட்டுமே பண்பு அடிப்படையிலான அணுகல் கட்டுப்படுத்தப்பட்ட அறைகளுக்கு அணுகல் கொண்டுள்ளனர். பண்புகள் அறை அணுகலை தீர்மானிக்கின்றன.", + "ABAC_room_attributes": "அறை பண்புகள்", "accept": "ஏற்றுக்கொள்", "Accessibility": "அணுகல் மேம்பாடு", "Accessibility_and_Appearance": "நுகர்வுத்திறன் மற்றும் தோற்றம்", @@ -892,8 +896,5 @@ "Your_invite_link_will_never_expire": "உங்கள் அழைத்துக்கொள்ளும் இணைய கணக்கு எப்போதும் காலாவதியாகின்றதுமில்லை.", "Your_password_is": "உங்கள் கடவுச்சொல் உள்ளது", "Your_Password_Must_Have": "உங்கள் கடவுச்சொல் இருக்க வேண்டும்:", - "Your_workspace": "உங்கள் பணிகள்", - "ABAC_room_attributes": "அறை பண்புகள்", - "ABAC_managed": "ABAC நிர்வகிக்கப்பட்டது", - "ABAC_managed_description": "இணக்கமான பயனர்கள் மட்டுமே பண்பு அடிப்படையிலான அணுகல் கட்டுப்படுத்தப்பட்ட அறைகளுக்கு அணுகல் கொண்டுள்ளனர். பண்புகள் அறை அணுகலை தீர்மானிக்கின்றன." + "Your_workspace": "உங்கள் பணிகள்" } \ No newline at end of file diff --git a/app/i18n/locales/te-IN.json b/app/i18n/locales/te-IN.json index a616d637e80..16439ab0953 100644 --- a/app/i18n/locales/te-IN.json +++ b/app/i18n/locales/te-IN.json @@ -12,6 +12,10 @@ "A11y_in_app_notification": "{{name}} నుండి కొత్త సందేశం: {{message}}", "A11y_incoming_call_dismiss": "ఖారు చేయండి", "A11y_incoming_call_swipe_down_to_view_options": "క్రిందికి స్వైప్ చేయి, పరామితులను చూడండి", + "ABAC_disabled_action_reason": "ABAC-నిర్వహించబడే గదులలో అందుబాటులో లేదు", + "ABAC_managed": "ABAC నిర్వహించబడింది", + "ABAC_managed_description": "అట్రిబ్యూట్ ఆధారిత యాక్సెస్ నియంత్రిత గదులకు అనుకూలమైన వినియోగదారులు మాత్రమే ప్రాప్యతను కలిగి ఉంటారు. లక్షణాలు గది ప్రాప్యతను నిర్ణయిస్తాయి.", + "ABAC_room_attributes": "గది లక్షణాలు", "accept": "అంగీకరించు", "Accessibility": "एक्सेसिबिलिटी", "Accessibility_and_Appearance": "प्रवेशयोग्यता और रूपरेखा", @@ -891,8 +895,5 @@ "Your_invite_link_will_never_expire": "మీ ఆహ్వాన లింక్ ఎప్పుడూ కనబడదు.", "Your_password_is": "మీ సంకేతపదం", "Your_Password_Must_Have": "మీ పాస్‌వర్డ్ తప్పనిసరిగా ఉండాలి:", - "Your_workspace": "మీ వర్క్‌స్పేస్", - "ABAC_room_attributes": "గది లక్షణాలు", - "ABAC_managed": "ABAC నిర్వహించబడింది", - "ABAC_managed_description": "అట్రిబ్యూట్ ఆధారిత యాక్సెస్ నియంత్రిత గదులకు అనుకూలమైన వినియోగదారులు మాత్రమే ప్రాప్యతను కలిగి ఉంటారు. లక్షణాలు గది ప్రాప్యతను నిర్ణయిస్తాయి." + "Your_workspace": "మీ వర్క్‌స్పేస్" } \ No newline at end of file diff --git a/app/i18n/locales/tr.json b/app/i18n/locales/tr.json index 0422225c5b7..364f24dc343 100644 --- a/app/i18n/locales/tr.json +++ b/app/i18n/locales/tr.json @@ -8,6 +8,10 @@ "A11y_in_app_notification": "Yeni mesaj {{name}}: {{message}}", "A11y_incoming_call_dismiss": "Dismiss et.", "A11y_incoming_call_swipe_down_to_view_options": "Aşağı kaydırarak seçenekleri görüntüle", + "ABAC_disabled_action_reason": "ABAC tarafından yönetilen odalarda mevcut değil", + "ABAC_managed": "ABAC tarafından yönetilir", + "ABAC_managed_description": "Yalnızca uyumlu kullanıcılar, öznitelik tabanlı erişim kontrollü odalara erişebilir. Öznitelikler, oda erişimini belirler.", + "ABAC_room_attributes": "Oda özellikleri", "Accessibility": "Erişilebilirlik", "Accessibility_and_Appearance": "Erişilebilirlik ve görünüm", "Accessibility_statement": "Erişilebilirlik beyanı", @@ -661,8 +665,5 @@ "Your_invite_link_will_never_expire": "Davet bağlantınızın geçerlilik süresi asla dolmayacak.", "Your_password_is": "Şifreniz", "Your_Password_Must_Have": "Şifreniz:", - "Your_workspace": "Çalışma alanınız", - "ABAC_room_attributes": "Oda özellikleri", - "ABAC_managed": "ABAC tarafından yönetilir", - "ABAC_managed_description": "Yalnızca uyumlu kullanıcılar, öznitelik tabanlı erişim kontrollü odalara erişebilir. Öznitelikler, oda erişimini belirler." + "Your_workspace": "Çalışma alanınız" } \ No newline at end of file diff --git a/app/i18n/locales/zh-CN.json b/app/i18n/locales/zh-CN.json index e26cc2024e4..b4b18eb3427 100644 --- a/app/i18n/locales/zh-CN.json +++ b/app/i18n/locales/zh-CN.json @@ -8,6 +8,10 @@ "A11y_in_app_notification": "来自{{name}}的新消息:{{message}}", "A11y_incoming_call_dismiss": "关闭", "A11y_incoming_call_swipe_down_to_view_options": "向下滑动以查看选项", + "ABAC_disabled_action_reason": "在ABAC管理的房间中不可用", + "ABAC_managed": "ABAC 管理", + "ABAC_managed_description": "只有符合条件的用户才能访问基于属性的访问控制房间。属性决定房间访问权限。", + "ABAC_room_attributes": "房间属性", "Accessibility": "无障碍性", "Accessibility_and_Appearance": "辅助功能和外观", "Accessibility_statement": "无障碍声明", @@ -621,8 +625,5 @@ "Your_invite_link_will_never_expire": "您的邀请链接永久有效。", "Your_password_is": "您的密码", "Your_Password_Must_Have": "您的密码必须具有:", - "Your_workspace": "您的工作区", - "ABAC_room_attributes": "房间属性", - "ABAC_managed": "ABAC 管理", - "ABAC_managed_description": "只有符合条件的用户才能访问基于属性的访问控制房间。属性决定房间访问权限。" + "Your_workspace": "您的工作区" } \ No newline at end of file diff --git a/app/i18n/locales/zh-TW.json b/app/i18n/locales/zh-TW.json index 8179b0b38db..4dfb6097126 100644 --- a/app/i18n/locales/zh-TW.json +++ b/app/i18n/locales/zh-TW.json @@ -8,6 +8,10 @@ "A11y_in_app_notification": "來自 {{name}} 的新訊息:{{message}}", "A11y_incoming_call_dismiss": "關閉", "A11y_incoming_call_swipe_down_to_view_options": "向下滑動以查看選項", + "ABAC_disabled_action_reason": "無法在 ABAC 管理的房間中使用", + "ABAC_managed": "ABAC 管理", + "ABAC_managed_description": "只有符合條件的使用者才能存取基於屬性的存取控制房間。屬性決定房間存取權限。", + "ABAC_room_attributes": "房間屬性", "Accessibility": "無障礙設施", "Accessibility_and_Appearance": "無障礙功能與外觀", "Accessibility_statement": "无障碍声明", @@ -650,8 +654,5 @@ "Your_invite_link_will_never_expire": "您的邀請連結永久有效。", "Your_password_is": "您的密碼", "Your_Password_Must_Have": "您的密碼必須具有:", - "Your_workspace": "您的工作區", - "ABAC_room_attributes": "房間屬性", - "ABAC_managed": "ABAC 管理", - "ABAC_managed_description": "只有符合條件的使用者才能存取基於屬性的存取控制房間。屬性決定房間存取權限。" + "Your_workspace": "您的工作區" } \ No newline at end of file From 53be03a42912a4fd9ebf0c62b8835ad82e849354 Mon Sep 17 00:00:00 2001 From: diegolmello <diegolmello@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:45:36 +0000 Subject: [PATCH 9/9] action: organized translations --- app/i18n/locales/ar.json | 2 +- app/i18n/locales/bn-IN.json | 2 +- app/i18n/locales/cs.json | 2 +- app/i18n/locales/de.json | 2 +- app/i18n/locales/en.json | 2 +- app/i18n/locales/es.json | 2 +- app/i18n/locales/fi.json | 2 +- app/i18n/locales/fr.json | 2 +- app/i18n/locales/hi-IN.json | 2 +- app/i18n/locales/hu.json | 2 +- app/i18n/locales/it.json | 2 +- app/i18n/locales/ja.json | 2 +- app/i18n/locales/nl.json | 2 +- app/i18n/locales/nn.json | 2 +- app/i18n/locales/no.json | 2 +- app/i18n/locales/pt-BR.json | 2 +- app/i18n/locales/pt-PT.json | 2 +- app/i18n/locales/ru.json | 2 +- app/i18n/locales/sl-SI.json | 2 +- app/i18n/locales/sv.json | 2 +- app/i18n/locales/ta-IN.json | 2 +- app/i18n/locales/te-IN.json | 2 +- app/i18n/locales/tr.json | 2 +- app/i18n/locales/zh-CN.json | 2 +- app/i18n/locales/zh-TW.json | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/app/i18n/locales/ar.json b/app/i18n/locales/ar.json index a062ceeb735..597fac93b9e 100644 --- a/app/i18n/locales/ar.json +++ b/app/i18n/locales/ar.json @@ -11,8 +11,8 @@ "ABAC_disabled_action_reason": "غير متاح في الغرف المدارة بواسطة ABAC", "ABAC_managed": "مدار بواسطة ABAC", "ABAC_managed_description": "فقط المستخدمون المتوافقون لديهم حق الوصول إلى الغرف التي يتم التحكم فيها بالوصول المستند إلى السمات. تحدد السمات الوصول إلى الغرفة.", - "ABAC_room_attributes": "سمات الغرفة", "abac_removed_user_from_the_room": "تمت إزالته بواسطة ABAC", + "ABAC_room_attributes": "سمات الغرفة", "Accessibility": "إمكانية الوصول", "Accessibility_and_Appearance": "إمكانية الوصول والمظهر", "Accessibility_statement": "بيان الوصول", diff --git a/app/i18n/locales/bn-IN.json b/app/i18n/locales/bn-IN.json index 35ef09fe32c..a58e6274c96 100644 --- a/app/i18n/locales/bn-IN.json +++ b/app/i18n/locales/bn-IN.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "ABAC-পরিচালিত রুমগুলিতে উপলব্ধ নয়", "ABAC_managed": "ABAC দ্বারা পরিচালিত", "ABAC_managed_description": "শুধুমাত্র অনুগত ব্যবহারকারীদের অ্যাট্রিবিউট-ভিত্তিক অ্যাক্সেস নিয়ন্ত্রিত রুমগুলিতে অ্যাক্সেস আছে। অ্যাট্রিবিউটগুলি রুমের অ্যাক্সেস নির্ধারণ করে।", - "ABAC_room_attributes": "রুমের বৈশিষ্ট্য", "abac_removed_user_from_the_room": "ABAC দ্বারা সরানো হয়েছে", + "ABAC_room_attributes": "রুমের বৈশিষ্ট্য", "accept": "গ্রহণ করুন", "Accessibility": "অ্যাক্সেসিবিলিটি", "Accessibility_and_Appearance": "অ্যাক্সেসিবিলিটি ও চেহারা", diff --git a/app/i18n/locales/cs.json b/app/i18n/locales/cs.json index e59f73c0dda..7ac70a24c75 100644 --- a/app/i18n/locales/cs.json +++ b/app/i18n/locales/cs.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "Není k dispozici v místnostech spravovaných systémem ABAC", "ABAC_managed": "Spravováno ABAC", "ABAC_managed_description": "Pouze vyhovující uživatelé mají přístup k místnostem řízeným přístupem na základě atributů. Atributy určují přístup k místnosti.", - "ABAC_room_attributes": "Atributy místnosti", "abac_removed_user_from_the_room": "byl odstraněn pomocí ABAC", + "ABAC_room_attributes": "Atributy místnosti", "accept": "Akceptovat", "Accessibility": "Přístupnost", "Accessibility_and_Appearance": "Přístupnost a vzhled", diff --git a/app/i18n/locales/de.json b/app/i18n/locales/de.json index 133f939143a..b8d56fe32c1 100644 --- a/app/i18n/locales/de.json +++ b/app/i18n/locales/de.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "Nicht verfügbar in ABAC-verwalteten Räumen", "ABAC_managed": "ABAC verwaltet", "ABAC_managed_description": "Nur konforme Benutzer haben Zugriff auf attributbasierte zugriffsgesteuerte Räume. Attribute bestimmen den Raumzugriff.", - "ABAC_room_attributes": "Raumattribute", "abac_removed_user_from_the_room": "wurde durch ABAC entfernt", + "ABAC_room_attributes": "Raumattribute", "accept": "Annehmen", "Accessibility": "Barrierefreiheit", "Accessibility_and_Appearance": "Barrierefreiheit & Erscheinungsbild", diff --git a/app/i18n/locales/en.json b/app/i18n/locales/en.json index 0b9260ae9e5..214c054d46d 100644 --- a/app/i18n/locales/en.json +++ b/app/i18n/locales/en.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "Not available in ABAC-managed rooms", "ABAC_managed": "ABAC managed", "ABAC_managed_description": "Only compliant users have access to attribute-based access controlled rooms. Attributes determine room access.", - "ABAC_room_attributes": "Room attributes", "abac_removed_user_from_the_room": "was removed by ABAC", + "ABAC_room_attributes": "Room attributes", "accept": "Accept", "Accessibility": "Accessibility", "Accessibility_and_Appearance": "Accessibility & appearance", diff --git a/app/i18n/locales/es.json b/app/i18n/locales/es.json index ee4a27b23ce..79762fda7b7 100644 --- a/app/i18n/locales/es.json +++ b/app/i18n/locales/es.json @@ -11,8 +11,8 @@ "ABAC_disabled_action_reason": "No disponible en salas gestionadas por ABAC", "ABAC_managed": "Gestionado por ABAC", "ABAC_managed_description": "Solo los usuarios compatibles tienen acceso a las salas controladas por acceso basado en atributos. Los atributos determinan el acceso a la sala.", - "ABAC_room_attributes": "Atributos de la sala", "abac_removed_user_from_the_room": "fue eliminado por ABAC", + "ABAC_room_attributes": "Atributos de la sala", "Accessibility": "Accesibilidad", "Accessibility_and_Appearance": "Accesibilidad y apariencia", "Accessibility_statement": "Declaración de accesibilidad", diff --git a/app/i18n/locales/fi.json b/app/i18n/locales/fi.json index 6f3f045de9a..97dd32c7340 100644 --- a/app/i18n/locales/fi.json +++ b/app/i18n/locales/fi.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "Ei saatavilla ABAC-hallituissa huoneissa", "ABAC_managed": "ABAC-hallittu", "ABAC_managed_description": "Vain yhteensopivilla käyttäjillä on pääsy attribuuttipohjaisesti hallittuihin huoneisiin. Attribuutit määrittävät huoneen pääsyn.", - "ABAC_room_attributes": "Huoneen attribuutit", "abac_removed_user_from_the_room": "poistettiin ABAC:n toimesta", + "ABAC_room_attributes": "Huoneen attribuutit", "Accessibility": "Saavutettavuus", "Accessibility_and_Appearance": "Saavutettavuus ja ulkonäkö", "Accessibility_statement": "Saavutettavuusilmoitus", diff --git a/app/i18n/locales/fr.json b/app/i18n/locales/fr.json index 776697bd68d..8f1985d3230 100644 --- a/app/i18n/locales/fr.json +++ b/app/i18n/locales/fr.json @@ -11,8 +11,8 @@ "ABAC_disabled_action_reason": "Non disponible dans les salles gérées par ABAC", "ABAC_managed": "Géré par ABAC", "ABAC_managed_description": "Seuls les utilisateurs conformes ont accès aux salles contrôlées par accès basé sur les attributs. Les attributs déterminent l'accès à la salle.", - "ABAC_room_attributes": "Attributs de la salle", "abac_removed_user_from_the_room": "a été supprimé par ABAC", + "ABAC_room_attributes": "Attributs de la salle", "Accessibility": "Accessibilité", "Accessibility_and_Appearance": "Accessibilité et apparence", "Accessibility_statement": "Déclaration d'accessibilité", diff --git a/app/i18n/locales/hi-IN.json b/app/i18n/locales/hi-IN.json index 51c1f58bac2..b1b5be41b74 100644 --- a/app/i18n/locales/hi-IN.json +++ b/app/i18n/locales/hi-IN.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "ABAC-प्रबंधित कमरों में उपलब्ध नहीं है", "ABAC_managed": "ABAC प्रबंधित", "ABAC_managed_description": "केवल संगत उपयोगकर्ताओं के पास विशेषता-आधारित पहुँच नियंत्रित कमरों तक पहुँच है। विशेषताएँ कमरे तक पहुँच निर्धारित करती हैं।", - "ABAC_room_attributes": "कमरे के गुण", "abac_removed_user_from_the_room": "ABAC द्वारा हटाया गया", + "ABAC_room_attributes": "कमरे के गुण", "accept": "स्वीकार करें", "Accessibility": "प्रवेशयोग्यता", "Accessibility_and_Appearance": "प्रवेशयोग्यता और दृश्यता", diff --git a/app/i18n/locales/hu.json b/app/i18n/locales/hu.json index 4981da9781a..ea817617994 100644 --- a/app/i18n/locales/hu.json +++ b/app/i18n/locales/hu.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "Nem érhető el ABAC által kezelt szobákban", "ABAC_managed": "ABAC által kezelt", "ABAC_managed_description": "Csak a megfelelő felhasználók férhetnek hozzá az attribútum alapú hozzáférés-vezérelt szobákhoz. Az attribútumok határozzák meg a szoba hozzáférését.", - "ABAC_room_attributes": "Szoba attribútumok", "abac_removed_user_from_the_room": "eltávolítva az ABAC által", + "ABAC_room_attributes": "Szoba attribútumok", "accept": "Elfogadom", "Accessibility": "Akadálymentesség", "Accessibility_and_Appearance": "Hozzáférhetőség és megjelenés", diff --git a/app/i18n/locales/it.json b/app/i18n/locales/it.json index 9b8e529ac1c..4ebe2e05f98 100644 --- a/app/i18n/locales/it.json +++ b/app/i18n/locales/it.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "Non disponibile nelle stanze gestite da ABAC", "ABAC_managed": "Gestito da ABAC", "ABAC_managed_description": "Solo gli utenti conformi hanno accesso alle stanze controllate da accesso basato su attributi. Gli attributi determinano l'accesso alla stanza.", - "ABAC_room_attributes": "Attributi della stanza", "abac_removed_user_from_the_room": "è stato rimosso da ABAC", + "ABAC_room_attributes": "Attributi della stanza", "Accessibility": "Accessibilità", "Accessibility_and_Appearance": "Accessibilità e aspetto", "Accessibility_statement": "Dichiarazione di accessibilità", diff --git a/app/i18n/locales/ja.json b/app/i18n/locales/ja.json index 2b58e2c1b1d..73fb86882a3 100644 --- a/app/i18n/locales/ja.json +++ b/app/i18n/locales/ja.json @@ -11,8 +11,8 @@ "ABAC_disabled_action_reason": "ABAC管理の部屋では利用できません", "ABAC_managed": "ABAC管理", "ABAC_managed_description": "準拠しているユーザーのみが属性ベースのアクセス制御された部屋にアクセスできます。属性によって部屋へのアクセスが決まります。", - "ABAC_room_attributes": "部屋の属性", "abac_removed_user_from_the_room": "ABACによって削除されました", + "ABAC_room_attributes": "部屋の属性", "Accessibility": "アクセシビリティ", "Accessibility_and_Appearance": "アクセシビリティと外観", "Accessibility_statement": "アクセシビリティ声明", diff --git a/app/i18n/locales/nl.json b/app/i18n/locales/nl.json index a978d99f8c4..1a67d012528 100644 --- a/app/i18n/locales/nl.json +++ b/app/i18n/locales/nl.json @@ -11,8 +11,8 @@ "ABAC_disabled_action_reason": "Niet beschikbaar in ABAC-beheerde kamers", "ABAC_managed": "ABAC beheerd", "ABAC_managed_description": "Alleen conforme gebruikers hebben toegang tot op attributen gebaseerde toegangsgecontroleerde kamers. Attributen bepalen de toegang tot de kamer.", - "ABAC_room_attributes": "Kamerattributen", "abac_removed_user_from_the_room": "werd verwijderd door ABAC", + "ABAC_room_attributes": "Kamerattributen", "Accessibility": "Toegankelijkheid", "Accessibility_and_Appearance": "Toegankelijkheid & uiterlijk", "Accessibility_statement": "Toegankelijkheidsverklaring", diff --git a/app/i18n/locales/nn.json b/app/i18n/locales/nn.json index 434d6b5dbf6..562ecd857f1 100644 --- a/app/i18n/locales/nn.json +++ b/app/i18n/locales/nn.json @@ -10,8 +10,8 @@ "ABAC_disabled_action_reason": "Ikkje tilgjengeleg i ABAC-administrerte rom", "ABAC_managed": "ABAC-administrert", "ABAC_managed_description": "Berre kompatible brukarar har tilgang til attributtbaserte tilgangskontrollerte rom. Attributta bestemmer romtilgangen.", - "ABAC_room_attributes": "Romattributt", "abac_removed_user_from_the_room": "vart fjerna av ABAC", + "ABAC_room_attributes": "Romattributt", "accept": "Aksepter", "Accessibility": "Tilgjengelighet", "Accessibility_and_Appearance": "Tilgjengelighet og utseende", diff --git a/app/i18n/locales/no.json b/app/i18n/locales/no.json index 53d7e3feee3..354d68ad221 100644 --- a/app/i18n/locales/no.json +++ b/app/i18n/locales/no.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "Ikke tilgjengelig i ABAC-administrerte rom", "ABAC_managed": "ABAC-administrert", "ABAC_managed_description": "Kun kompatible brukere har tilgang til attributtbaserte tilgangskontrollerte rom. Attributter bestemmer romtilgang.", - "ABAC_room_attributes": "Romattributter", "abac_removed_user_from_the_room": "ble fjernet av ABAC", + "ABAC_room_attributes": "Romattributter", "accept": "Aksepter", "Accessibility": "Tilgjengelighet", "Accessibility_and_Appearance": "Tilgjengelighet og utseende", diff --git a/app/i18n/locales/pt-BR.json b/app/i18n/locales/pt-BR.json index 897ec7712c0..ac68077fe5f 100644 --- a/app/i18n/locales/pt-BR.json +++ b/app/i18n/locales/pt-BR.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "Não disponível em salas gerenciadas por ABAC", "ABAC_managed": "Gerenciado por ABAC", "ABAC_managed_description": "Apenas usuários compatíveis têm acesso a salas controladas por acesso baseado em atributos. Atributos determinam o acesso à sala.", - "ABAC_room_attributes": "Atributos da sala", "abac_removed_user_from_the_room": "foi removido pelo ABAC", + "ABAC_room_attributes": "Atributos da sala", "accept": "Aceitar", "Accessibility": "Acessibilidade", "Accessibility_and_Appearance": "Acessibilidade e aparência", diff --git a/app/i18n/locales/pt-PT.json b/app/i18n/locales/pt-PT.json index 41924ade249..53ed358d6a7 100644 --- a/app/i18n/locales/pt-PT.json +++ b/app/i18n/locales/pt-PT.json @@ -11,8 +11,8 @@ "ABAC_disabled_action_reason": "Não disponível em salas geridas por ABAC", "ABAC_managed": "Gerido por ABAC", "ABAC_managed_description": "Apenas utilizadores compatíveis têm acesso a salas controladas por acesso baseado em atributos. Atributos determinam o acesso à sala.", - "ABAC_room_attributes": "Atributos da sala", "abac_removed_user_from_the_room": "foi removido pelo ABAC", + "ABAC_room_attributes": "Atributos da sala", "Accessibility": "Acessibilidade", "Accessibility_and_Appearance": "Acessibilidade e aparência", "Accessibility_statement": "Declaração de acessibilidade", diff --git a/app/i18n/locales/ru.json b/app/i18n/locales/ru.json index 09bb7843190..972fb82f230 100644 --- a/app/i18n/locales/ru.json +++ b/app/i18n/locales/ru.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "Недоступно в комнатах, управляемых ABAC", "ABAC_managed": "Управляется ABAC", "ABAC_managed_description": "Только соответствующие пользователи имеют доступ к комнатам с атрибутивным контролем доступа. Атрибуты определяют доступ к комнате.", - "ABAC_room_attributes": "Атрибуты комнаты", "abac_removed_user_from_the_room": "был удалён ABAC'ом", + "ABAC_room_attributes": "Атрибуты комнаты", "Accessibility": "Доступность", "Accessibility_and_Appearance": "Доступность и внешний вид", "Accessibility_statement": "Заявление о доступности", diff --git a/app/i18n/locales/sl-SI.json b/app/i18n/locales/sl-SI.json index 69758eed226..a466b3943a4 100644 --- a/app/i18n/locales/sl-SI.json +++ b/app/i18n/locales/sl-SI.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "Ni na voljo v sobah, ki jih upravlja ABAC", "ABAC_managed": "ABAC upravljano", "ABAC_managed_description": "Samo skladni uporabniki imajo dostop do sob z nadzorom dostopa na podlagi atributov. Atributi določajo dostop do sobe.", - "ABAC_room_attributes": "Atributi sobe", "abac_removed_user_from_the_room": "je bil odstranjen s strani ABAC", + "ABAC_room_attributes": "Atributi sobe", "Accessibility": "Dostopnost", "Accessibility_and_Appearance": "Dostopnost in videz", "Accessibility_statement": "Izjava o dostopnosti", diff --git a/app/i18n/locales/sv.json b/app/i18n/locales/sv.json index fc82f02f314..f7363d8516e 100644 --- a/app/i18n/locales/sv.json +++ b/app/i18n/locales/sv.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "Inte tillgängligt i ABAC-hanterade rum", "ABAC_managed": "ABAC-hanterat", "ABAC_managed_description": "Endast kompatibla användare har åtkomst till attributbaserat åtkomstskyddade rum. Attributen avgör tillgången till rummet.", - "ABAC_room_attributes": "Rumsattribut", "abac_removed_user_from_the_room": "togs bort av ABAC", + "ABAC_room_attributes": "Rumsattribut", "Accessibility": "Tillgänglighet", "Accessibility_and_Appearance": "Tillgänglighet och utseende", "Accessibility_statement": "Tillgänglighetsredogörelse", diff --git a/app/i18n/locales/ta-IN.json b/app/i18n/locales/ta-IN.json index 83f57ee18c1..006cf7d6c6d 100644 --- a/app/i18n/locales/ta-IN.json +++ b/app/i18n/locales/ta-IN.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "ABAC-நிர்வகிக்கப்படும் அறைகளில் கிடைக்காது", "ABAC_managed": "ABAC நிர்வகிக்கப்பட்டது", "ABAC_managed_description": "இணக்கமான பயனர்கள் மட்டுமே பண்பு அடிப்படையிலான அணுகல் கட்டுப்படுத்தப்பட்ட அறைகளுக்கு அணுகல் கொண்டுள்ளனர். பண்புகள் அறை அணுகலை தீர்மானிக்கின்றன.", - "ABAC_room_attributes": "அறை பண்புகள்", "abac_removed_user_from_the_room": "ABAC மூலம் அகற்றப்பட்டது", + "ABAC_room_attributes": "அறை பண்புகள்", "accept": "ஏற்றுக்கொள்", "Accessibility": "அணுகல் மேம்பாடு", "Accessibility_and_Appearance": "நுகர்வுத்திறன் மற்றும் தோற்றம்", diff --git a/app/i18n/locales/te-IN.json b/app/i18n/locales/te-IN.json index ebc0bfe4398..1275b8352d6 100644 --- a/app/i18n/locales/te-IN.json +++ b/app/i18n/locales/te-IN.json @@ -15,8 +15,8 @@ "ABAC_disabled_action_reason": "ABAC-నిర్వహించబడే గదులలో అందుబాటులో లేదు", "ABAC_managed": "ABAC నిర్వహించబడింది", "ABAC_managed_description": "అట్రిబ్యూట్ ఆధారిత యాక్సెస్ నియంత్రిత గదులకు అనుకూలమైన వినియోగదారులు మాత్రమే ప్రాప్యతను కలిగి ఉంటారు. లక్షణాలు గది ప్రాప్యతను నిర్ణయిస్తాయి.", - "ABAC_room_attributes": "గది లక్షణాలు", "abac_removed_user_from_the_room": "ABAC ద్వారా తొలగించబడింది", + "ABAC_room_attributes": "గది లక్షణాలు", "accept": "అంగీకరించు", "Accessibility": "एक्सेसिबिलिटी", "Accessibility_and_Appearance": "प्रवेशयोग्यता और रूपरेखा", diff --git a/app/i18n/locales/tr.json b/app/i18n/locales/tr.json index 134b3bc052b..92312fa9e3c 100644 --- a/app/i18n/locales/tr.json +++ b/app/i18n/locales/tr.json @@ -11,8 +11,8 @@ "ABAC_disabled_action_reason": "ABAC tarafından yönetilen odalarda mevcut değil", "ABAC_managed": "ABAC tarafından yönetilir", "ABAC_managed_description": "Yalnızca uyumlu kullanıcılar, öznitelik tabanlı erişim kontrollü odalara erişebilir. Öznitelikler, oda erişimini belirler.", - "ABAC_room_attributes": "Oda özellikleri", "abac_removed_user_from_the_room": "ABAC tarafından kaldırıldı", + "ABAC_room_attributes": "Oda özellikleri", "Accessibility": "Erişilebilirlik", "Accessibility_and_Appearance": "Erişilebilirlik ve görünüm", "Accessibility_statement": "Erişilebilirlik beyanı", diff --git a/app/i18n/locales/zh-CN.json b/app/i18n/locales/zh-CN.json index 6064a701986..0f251b54a41 100644 --- a/app/i18n/locales/zh-CN.json +++ b/app/i18n/locales/zh-CN.json @@ -11,8 +11,8 @@ "ABAC_disabled_action_reason": "在ABAC管理的房间中不可用", "ABAC_managed": "ABAC 管理", "ABAC_managed_description": "只有符合条件的用户才能访问基于属性的访问控制房间。属性决定房间访问权限。", - "ABAC_room_attributes": "房间属性", "abac_removed_user_from_the_room": "被ABAC删除", + "ABAC_room_attributes": "房间属性", "Accessibility": "无障碍性", "Accessibility_and_Appearance": "辅助功能和外观", "Accessibility_statement": "无障碍声明", diff --git a/app/i18n/locales/zh-TW.json b/app/i18n/locales/zh-TW.json index 494196cd815..490c728f28e 100644 --- a/app/i18n/locales/zh-TW.json +++ b/app/i18n/locales/zh-TW.json @@ -11,8 +11,8 @@ "ABAC_disabled_action_reason": "無法在 ABAC 管理的房間中使用", "ABAC_managed": "ABAC 管理", "ABAC_managed_description": "只有符合條件的使用者才能存取基於屬性的存取控制房間。屬性決定房間存取權限。", - "ABAC_room_attributes": "房間屬性", "abac_removed_user_from_the_room": "被ABAC刪除", + "ABAC_room_attributes": "房間屬性", "Accessibility": "無障礙設施", "Accessibility_and_Appearance": "無障礙功能與外觀", "Accessibility_statement": "无障碍声明",