diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index adb45066..8b4e8a34 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -37,9 +37,9 @@ android {
else -> 0
}
- val vCode = 256
+ val vCode = 259
versionCode = vCode - singleAbiNum
- versionName = "1.2.41"
+ versionName = "1.2.42"
ndk {
//noinspection ChromeOsAbiSupport
@@ -152,8 +152,8 @@ dependencies {
val apollo = "3.2.1"
val kgraphql = "0.19.0"
val ktor = "3.0.0-beta-1"
- val media3 = "1.2.1"
- val compose = "1.6.1"
+ val media3 = "1.3.0"
+ val compose = "1.6.3"
implementation(platform("androidx.compose:compose-bom:2024.01.00"))
@@ -163,7 +163,7 @@ dependencies {
implementation("androidx.compose.ui:ui:$compose")
implementation("androidx.compose.foundation:foundation:$compose")
implementation("androidx.compose.foundation:foundation-layout:$compose")
- implementation("androidx.compose.material3:material3:1.2.0")
+ implementation("androidx.compose.material3:material3:1.2.1")
implementation("androidx.compose.material:material-icons-extended:$compose")
implementation("com.google.accompanist:accompanist-drawablepainter:0.34.0")
// implementation("androidx.constraintlayout:constraintlayout-compose:1.1.0-alpha12")
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 407c6cb6..a4b9008a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -174,6 +174,16 @@
+
+
+
+
+
+
+
() {
override val key = booleanPreferencesKey("keep_screen_on")
}
+object KeepAwakePreference : BasePreference() {
+ override val default = false
+ override val key = booleanPreferencesKey("keep_awake")
+}
+
object SystemScreenTimeoutPreference : BasePreference() {
override val default = 0
override val key = intPreferencesKey("system_screen_timeout")
diff --git a/app/src/main/java/com/ismartcoding/plain/data/preference/WebSettings.kt b/app/src/main/java/com/ismartcoding/plain/data/preference/WebSettings.kt
index 0f3a2874..b6313b94 100644
--- a/app/src/main/java/com/ismartcoding/plain/data/preference/WebSettings.kt
+++ b/app/src/main/java/com/ismartcoding/plain/data/preference/WebSettings.kt
@@ -13,6 +13,7 @@ data class WebSettings(
val password: String,
val authTwoFactor: Boolean,
val authDevToken: String,
+ val keepAwake: Boolean,
val apiPermissions: Set,
)
@@ -21,6 +22,7 @@ val LocalPassword = compositionLocalOf { PasswordPreference.default }
val LocalAuthTwoFactor = compositionLocalOf { AuthTwoFactorPreference.default }
val LocalApiPermissions = compositionLocalOf { ApiPermissionsPreference.default }
val LocalAuthDevToken = compositionLocalOf { AuthDevTokenPreference.default }
+val LocalKeepAwake = compositionLocalOf { KeepAwakePreference.default }
@Composable
fun WebSettingsProvider(content: @Composable () -> Unit) {
@@ -31,6 +33,7 @@ fun WebSettingsProvider(content: @Composable () -> Unit) {
password = PasswordPreference.default,
authTwoFactor = AuthTwoFactorPreference.default,
authDevToken = AuthDevTokenPreference.default,
+ keepAwake = KeepAwakePreference.default,
apiPermissions = ApiPermissionsPreference.default,
)
val settings =
@@ -41,6 +44,7 @@ fun WebSettingsProvider(content: @Composable () -> Unit) {
password = PasswordPreference.get(it),
authTwoFactor = AuthTwoFactorPreference.get(it),
authDevToken = AuthDevTokenPreference.get(it),
+ keepAwake = KeepAwakePreference.get(it),
apiPermissions = ApiPermissionsPreference.get(it),
)
}
@@ -53,6 +57,7 @@ fun WebSettingsProvider(content: @Composable () -> Unit) {
LocalPassword provides settings.password,
LocalAuthTwoFactor provides settings.authTwoFactor,
LocalAuthDevToken provides settings.authDevToken,
+ LocalKeepAwake provides settings.keepAwake,
LocalApiPermissions provides settings.apiPermissions,
) {
content()
diff --git a/app/src/main/java/com/ismartcoding/plain/features/AppEvents.kt b/app/src/main/java/com/ismartcoding/plain/features/AppEvents.kt
index 5ca5e0f4..c4d538b5 100644
--- a/app/src/main/java/com/ismartcoding/plain/features/AppEvents.kt
+++ b/app/src/main/java/com/ismartcoding/plain/features/AppEvents.kt
@@ -3,6 +3,7 @@ package com.ismartcoding.plain.features
import android.content.Intent
import android.media.MediaPlayer
import android.net.Uri
+import android.os.PowerManager
import com.aallam.openai.api.BetaOpenAI
import com.aallam.openai.api.chat.ChatCompletionRequest
import com.aallam.openai.api.chat.ChatMessage
@@ -17,6 +18,7 @@ import com.ismartcoding.lib.helpers.CoroutinesHelper.coIO
import com.ismartcoding.lib.helpers.JsonHelper.jsonEncode
import com.ismartcoding.lib.helpers.SslHelper
import com.ismartcoding.lib.logcat.LogCat
+import com.ismartcoding.plain.BuildConfig
import com.ismartcoding.plain.MainApp
import com.ismartcoding.plain.data.enums.*
import com.ismartcoding.plain.data.preference.ChatGPTApiKeyPreference
@@ -25,6 +27,7 @@ import com.ismartcoding.plain.features.aichat.AIChatHelper
import com.ismartcoding.plain.features.audio.AudioAction
import com.ismartcoding.plain.features.audio.AudioPlayer
import com.ismartcoding.plain.features.feed.FeedWorkerStatus
+import com.ismartcoding.plain.powerManager
import com.ismartcoding.plain.services.HttpServerService
import com.ismartcoding.plain.web.AuthRequest
import com.ismartcoding.plain.web.websocket.EventType
@@ -89,6 +92,8 @@ class ActionEvent(val source: ActionSourceType, val action: ActionType, val ids:
class AudioActionEvent(val action: AudioAction)
class IgnoreBatteryOptimizationEvent
+class AcquireWakeLockEvent
+class ReleaseWakeLockEvent
class IgnoreBatteryOptimizationResultEvent
@@ -107,6 +112,7 @@ class AIChatCreatedEvent(val item: DAIChat)
object AppEvents {
private lateinit var mediaPlayer: MediaPlayer
private var mediaPlayingUri: Uri? = null
+ private val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "${BuildConfig.APPLICATION_ID}:http_server")
@OptIn(BetaOpenAI::class)
fun register() {
@@ -145,6 +151,22 @@ object AppEvents {
}
}
+ receiveEventHandler {
+ coIO {
+ LogCat.d("AcquireWakeLockEvent")
+ if (!wakeLock.isHeld) {
+ wakeLock.acquire()
+ }
+ }
+ }
+
+ receiveEventHandler {
+ coIO {
+ LogCat.d("ReleaseWakeLockEvent")
+ wakeLock.release()
+ }
+ }
+
receiveEventHandler { event ->
if (event.map.containsKey(Permission.POST_NOTIFICATIONS.toSysPermission())) {
if (AudioPlayer.isPlaying()) {
diff --git a/app/src/main/java/com/ismartcoding/plain/features/file/FileSystemHelper.kt b/app/src/main/java/com/ismartcoding/plain/features/file/FileSystemHelper.kt
index 5441299f..2a306027 100644
--- a/app/src/main/java/com/ismartcoding/plain/features/file/FileSystemHelper.kt
+++ b/app/src/main/java/com/ismartcoding/plain/features/file/FileSystemHelper.kt
@@ -73,27 +73,31 @@ object FileSystemHelper {
fun getInternalStoragePath(): String {
return (
- if (isRPlus()) {
- storageManager.primaryStorageVolume.directory?.path
- } else {
- null
- }
- ) ?: Environment.getExternalStorageDirectory()?.absolutePath?.trimEnd('/') ?: ""
+ if (isRPlus()) {
+ storageManager.primaryStorageVolume.directory?.path
+ } else {
+ null
+ }
+ ) ?: Environment.getExternalStorageDirectory()?.absolutePath?.trimEnd('/') ?: ""
}
fun getInternalStorageName(context: Context): String {
return storageManager.primaryStorageVolume.getDescription(context) ?: getString(R.string.internal_storage)
}
+ fun getExternalFilesDirPath(context: Context): String {
+ return context.getExternalFilesDir(null)!!.absolutePath
+ }
+
fun getSDCardPath(context: Context): String {
val internalPath = getInternalStoragePath()
val directories =
getStorageDirectories(context).filter {
it != internalPath &&
- !it.equals(
- "/storage/emulated/0",
- true,
- )
+ !it.equals(
+ "/storage/emulated/0",
+ true,
+ )
}
val fullSDPattern = Pattern.compile("^/storage/[A-Za-z0-9]{4}-[A-Za-z0-9]{4}$")
diff --git a/app/src/main/java/com/ismartcoding/plain/receivers/PlugInControlReceiver.kt b/app/src/main/java/com/ismartcoding/plain/receivers/PlugInControlReceiver.kt
index de46a99f..1b05a27a 100644
--- a/app/src/main/java/com/ismartcoding/plain/receivers/PlugInControlReceiver.kt
+++ b/app/src/main/java/com/ismartcoding/plain/receivers/PlugInControlReceiver.kt
@@ -1,22 +1,47 @@
package com.ismartcoding.plain.receivers
+import android.content.BroadcastReceiver
import android.content.Context
+import android.content.Intent
import android.content.IntentFilter
+import com.ismartcoding.lib.channel.sendEvent
+import com.ismartcoding.lib.helpers.CoroutinesHelper.coIO
import com.ismartcoding.lib.isTPlus
+import com.ismartcoding.lib.logcat.LogCat
+import com.ismartcoding.plain.data.preference.KeepAwakePreference
+import com.ismartcoding.plain.features.AcquireWakeLockEvent
+import com.ismartcoding.plain.features.ReleaseWakeLockEvent
-object PlugInControlReceiver {
- private const val ACTION_USB_STATE = "android.hardware.usb.action.USB_STATE"
+class PlugInControlReceiver : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ val action = intent.action
+ if (action == Intent.ACTION_POWER_CONNECTED) {
+ LogCat.d("ACTION_POWER_CONNECTED")
+ sendEvent(AcquireWakeLockEvent())
+ } else if (action == Intent.ACTION_POWER_DISCONNECTED) {
+ LogCat.d("ACTION_POWER_DISCONNECTED")
+ coIO {
+ val keepAwake = KeepAwakePreference.getAsync(context)
+ if (!keepAwake) {
+ sendEvent(ReleaseWakeLockEvent())
+ }
+ }
+ }
+ }
- fun isUSBConnected(context: Context): Boolean {
- val intent = if (isTPlus()) {
- context.registerReceiver(
- null,
- IntentFilter(ACTION_USB_STATE),
- Context.RECEIVER_NOT_EXPORTED,
- )
- } else {
- context.registerReceiver(null, IntentFilter(ACTION_USB_STATE))
+ companion object {
+ private const val ACTION_USB_STATE = "android.hardware.usb.action.USB_STATE"
+ fun isUSBConnected(context: Context): Boolean {
+ val intent = if (isTPlus()) {
+ context.registerReceiver(
+ null,
+ IntentFilter(ACTION_USB_STATE),
+ Context.RECEIVER_NOT_EXPORTED,
+ )
+ } else {
+ context.registerReceiver(null, IntentFilter(ACTION_USB_STATE))
+ }
+ return intent?.extras?.getBoolean("connected") == true
}
- return intent?.extras?.getBoolean("connected") == true
}
}
diff --git a/app/src/main/java/com/ismartcoding/plain/services/NotificationListenerMonitorService.kt b/app/src/main/java/com/ismartcoding/plain/services/NotificationListenerMonitorService.kt
index 00b11d87..622c2149 100644
--- a/app/src/main/java/com/ismartcoding/plain/services/NotificationListenerMonitorService.kt
+++ b/app/src/main/java/com/ismartcoding/plain/services/NotificationListenerMonitorService.kt
@@ -12,7 +12,7 @@ import com.ismartcoding.lib.logcat.LogCat
class NotificationListenerMonitorService : Service() {
override fun onCreate() {
super.onCreate()
- LogCat.d("onCreate() called")
+ LogCat.d("NotificationListenerMonitorService.onCreate() called")
ensureCollectorRunning()
}
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/ActionButtons.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/ActionButtons.kt
index ecc8139f..b5e4536f 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/ActionButtons.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/ActionButtons.kt
@@ -2,6 +2,7 @@ package com.ismartcoding.plain.ui.base
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.MoreVert
+import androidx.compose.material.icons.outlined.Search
import androidx.compose.material.icons.outlined.Settings
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
@@ -27,3 +28,13 @@ fun ActionButtonSettings(onClick: () -> Unit) {
onClick = onClick,
)
}
+
+@Composable
+fun ActionButtonSearch(onClick: () -> Unit) {
+ PIconButton(
+ imageVector = Icons.Outlined.Search,
+ contentDescription = stringResource(R.string.search),
+ tint = MaterialTheme.colorScheme.onSurface,
+ onClick = onClick,
+ )
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/Alert.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/Alert.kt
index 1fd7c62c..d7781801 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/Alert.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/Alert.kt
@@ -21,6 +21,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -54,9 +55,11 @@ fun Alert(
HorizontalSpace(dp = 8.dp)
Text(
text = title,
- style = MaterialTheme.typography.titleMedium,
+ style = MaterialTheme.typography.titleMedium.copy(
+ color = MaterialTheme.colorScheme.onSurface,
+ fontWeight = FontWeight.SemiBold
+ ),
textAlign = TextAlign.Start,
- color = MaterialTheme.colorScheme.onSurface,
)
}
Text(
@@ -64,8 +67,7 @@ fun Alert(
.padding(16.dp, 0.dp, 16.dp, 16.dp)
.fillMaxWidth(),
text = description,
- style = MaterialTheme.typography.bodyMedium,
- color = MaterialTheme.colorScheme.onSurface,
+ style = MaterialTheme.typography.bodyLarge.copy(color = MaterialTheme.colorScheme.onSurface),
)
if (actions != null) {
Row(
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/NoDataColumn.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/NoDataColumn.kt
index 9a5db18d..ef09740b 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/NoDataColumn.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/NoDataColumn.kt
@@ -13,7 +13,7 @@ import androidx.compose.ui.res.stringResource
import com.ismartcoding.plain.R
@Composable
-fun NoDataColumn(loading: Boolean = false) {
+fun NoDataColumn(loading: Boolean = false, search: Boolean = false) {
LazyColumn(
Modifier
.fillMaxWidth()
@@ -22,8 +22,13 @@ fun NoDataColumn(loading: Boolean = false) {
horizontalAlignment = Alignment.CenterHorizontally,
) {
item {
+ val text = if (search) {
+ if (loading) R.string.searching else R.string.no_results_found
+ } else {
+ if (loading) R.string.loading else R.string.no_data
+ }
Text(
- text = stringResource(id = if (loading) R.string.loading else R.string.no_data),
+ text = stringResource(id = text),
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/PListItem.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/PListItem.kt
index f8e3a9a5..40456b01 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/PListItem.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/PListItem.kt
@@ -54,7 +54,8 @@ fun PListItem(
modifier =
modifier
.combinedClickable(
- onClick = onClick,
+ enabled = enable,
+ onClick = onClick,
onLongClick = onLongClick,
)
.alpha(if (enable) 1f else 0.5f),
@@ -64,7 +65,7 @@ fun PListItem(
modifier =
Modifier
.fillMaxWidth()
- .padding(16.dp, 4.dp, 8.dp, 4.dp),
+ .padding(16.dp, 8.dp, 8.dp, 8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
if (icon != null) {
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/PScaffold.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/PScaffold.kt
index 11ea43eb..b8e2e7c6 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/PScaffold.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/PScaffold.kt
@@ -1,12 +1,23 @@
package com.ismartcoding.plain.ui.base
-import androidx.compose.foundation.layout.*
-import androidx.compose.material3.*
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.navigationBarsPadding
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
+import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
-import com.ismartcoding.plain.ui.extensions.*
import com.ismartcoding.plain.ui.theme.canvas
@OptIn(ExperimentalMaterial3Api::class)
@@ -28,13 +39,14 @@ fun PScaffold(
topBar = {
if (navigationIcon != null || actions != null) {
TopAppBar(
- title = { Text(topBarTitle) },
+ title = { Text(topBarTitle, maxLines = 2, overflow = TextOverflow.Ellipsis) },
navigationIcon = { navigationIcon?.invoke() },
actions = { actions?.invoke(this) },
+ modifier = Modifier.padding(horizontal = 8.dp),
colors =
- TopAppBarDefaults.topAppBarColors(
- containerColor = Color.Transparent,
- ),
+ TopAppBarDefaults.topAppBarColors(
+ containerColor = Color.Transparent,
+ ),
)
}
},
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/Tips.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/Tips.kt
index c1e82b5b..d989d8b5 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/Tips.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/Tips.kt
@@ -12,7 +12,7 @@ import androidx.compose.ui.unit.dp
@Composable
fun Tips(
text: String,
- modifier: Modifier = Modifier.padding(start = 24.dp, end = 24.dp, top = 8.dp),
+ modifier: Modifier = Modifier.padding(start = 32.dp, end = 24.dp, top = 8.dp),
) {
SelectionContainer {
Text(
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/LoadMoreRefreshContent.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/LoadMoreRefreshContent.kt
index 83bb3e5a..a85b2415 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/LoadMoreRefreshContent.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/LoadMoreRefreshContent.kt
@@ -1,15 +1,9 @@
package com.ismartcoding.plain.ui.base.pullrefresh
-import androidx.compose.animation.core.LinearEasing
-import androidx.compose.animation.core.RepeatMode
-import androidx.compose.animation.core.animateFloat
-import androidx.compose.animation.core.infiniteRepeatable
-import androidx.compose.animation.core.rememberInfiniteTransition
-import androidx.compose.animation.core.tween
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -21,34 +15,18 @@ import androidx.compose.ui.unit.sp
import com.ismartcoding.plain.R
@Composable
-fun RefreshLayoutState.LoadMoreRefreshContent(bottomNoMoreData: Boolean = false) {
- val rotate =
- if (bottomNoMoreData || getRefreshContentOffset() == 0f) {
- 0f
- } else {
- val infiniteTransition = rememberInfiniteTransition()
- infiniteTransition.animateFloat(
- initialValue = 0f,
- targetValue = 360f,
- animationSpec =
- infiniteRepeatable(
- animation = tween(durationMillis = 1000, easing = LinearEasing),
- repeatMode = RepeatMode.Restart,
- ),
- label = "",
- ).value
- }
+fun LoadMoreRefreshContent(isLoadFinish: Boolean = false) {
Row(
modifier =
- Modifier
- .fillMaxWidth()
- .height(30.dp),
+ Modifier
+ .fillMaxWidth()
+ .padding(16.dp),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text =
- if (bottomNoMoreData) {
+ if (isLoadFinish) {
stringResource(id = R.string.load_no_more)
} else {
stringResource(id = R.string.loading)
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/PullToRefreshContent.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/PullToRefreshContent.kt
index 51cd0e4e..369a70fe 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/PullToRefreshContent.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/PullToRefreshContent.kt
@@ -22,7 +22,7 @@ fun RefreshLayoutState.PullToRefreshContent() {
Row(
Modifier
.fillMaxWidth()
- .height(35.dp),
+ .padding(16.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center,
) {
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayout.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayout.kt
index b416e9e2..3e00fa72 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayout.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayout.kt
@@ -20,75 +20,58 @@ fun RefreshLayout(
modifier: Modifier = Modifier,
refreshContentThreshold: Dp? = null,
composePosition: ComposePosition = ComposePosition.Top,
- contentIsMove: Boolean = true,
dragEfficiency: Float = 0.5f,
- isSupportCanNotScrollCompose: Boolean = false,
userEnable: Boolean = true,
+ refreshingCanScroll: Boolean = false,
content: @Composable () -> Unit,
) {
val density = LocalDensity.current
val coroutineScope = rememberCoroutineScope()
- val orientationIsHorizontal =
- remember(
- refreshLayoutState,
- composePosition,
- refreshContentThreshold,
- coroutineScope,
- ) {
- refreshLayoutState.composePositionState.value = composePosition
- refreshLayoutState.coroutineScope = coroutineScope
- if (refreshContentThreshold != null) {
- refreshLayoutState.refreshContentThresholdState.value =
- with(density) { refreshContentThreshold.toPx() }
- }
- composePosition.isHorizontal()
- }
- val nestedScrollState =
- rememberRefreshLayoutNestedScrollConnection(
- composePosition,
- refreshLayoutState,
- dragEfficiency,
- orientationIsHorizontal,
+ //更新状态
+ val orientationIsHorizontal = remember(
+ refreshLayoutState,
+ composePosition,
+ refreshContentThreshold,
+ coroutineScope,
+ density,
+ ) {
+ refreshLayoutState.composePositionState.value = composePosition
+ refreshLayoutState.coroutineScope = coroutineScope
+ if (refreshContentThreshold != null)
+ refreshLayoutState.refreshContentThresholdState.value =
+ with(density) { refreshContentThreshold.toPx() }
+ composePosition.isHorizontal()
+ }
+ val nestedScrollState = remember(composePosition) {
+ RefreshLayoutNestedScrollConnection(
+ composePosition, refreshLayoutState, dragEfficiency, orientationIsHorizontal, refreshingCanScroll
)
+ }
Layout(
content = {
- if (isSupportCanNotScrollCompose) {
- Box(
- if (orientationIsHorizontal) {
- Modifier.horizontalScroll(rememberScrollState())
- } else {
- Modifier.verticalScroll(rememberScrollState())
- },
- ) {
- content()
- }
- } else {
- content()
- }
+ content()
refreshLayoutState.refreshContent()
},
- modifier =
- modifier
- .let {
- if (userEnable) {
- it.nestedScroll(nestedScrollState)
- } else {
- it
- }
+ modifier = modifier
+ .let {
+ if (userEnable) {
+ it.nestedScroll(nestedScrollState)
+ } else {
+ it
}
- .clipScrollableContainer(composePosition.orientation),
+ }
+ .clipScrollableContainer(composePosition.orientation)
) { measurableList, constraints ->
val contentPlaceable =
measurableList[0].measure(constraints.copy(minWidth = 0, minHeight = 0))
- // 宽或高不能超过content(根据方向来定)
- val refreshContentPlaceable =
- measurableList[1].measure(
- Constraints(
- maxWidth = if (orientationIsHorizontal) Constraints.Infinity else contentPlaceable.width,
- maxHeight = if (orientationIsHorizontal) contentPlaceable.height else Constraints.Infinity,
- ),
+ //宽或高不能超过content(根据方向来定)
+ val refreshContentPlaceable = measurableList[1].measure(
+ Constraints(
+ maxWidth = if (orientationIsHorizontal) Constraints.Infinity else contentPlaceable.width,
+ maxHeight = if (orientationIsHorizontal) contentPlaceable.height else Constraints.Infinity,
)
+ )
if (refreshContentThreshold == null && refreshLayoutState.refreshContentThresholdState.value == 0f) {
refreshLayoutState.refreshContentThresholdState.value =
if (orientationIsHorizontal) {
@@ -102,31 +85,34 @@ fun RefreshLayout(
val offset = refreshLayoutState.refreshContentOffsetState.value.roundToInt()
when (composePosition) {
ComposePosition.Start -> {
- contentPlaceable.placeRelative(if (contentIsMove) offset else 0, 0)
+ contentPlaceable.placeRelative(offset, 0)
refreshContentPlaceable.placeRelative(
(-refreshContentPlaceable.width) + offset,
- 0,
+ 0
)
}
+
ComposePosition.End -> {
- contentPlaceable.placeRelative(if (contentIsMove) offset else 0, 0)
+ contentPlaceable.placeRelative(offset, 0)
refreshContentPlaceable.placeRelative(
contentPlaceable.width + offset,
- 0,
+ 0
)
}
+
ComposePosition.Top -> {
- contentPlaceable.placeRelative(0, if (contentIsMove) offset else 0)
+ contentPlaceable.placeRelative(0, offset)
refreshContentPlaceable.placeRelative(
0,
- (-refreshContentPlaceable.height) + offset,
+ (-refreshContentPlaceable.height) + offset
)
}
+
ComposePosition.Bottom -> {
- contentPlaceable.placeRelative(0, if (contentIsMove) offset else 0)
+ contentPlaceable.placeRelative(0, offset)
refreshContentPlaceable.placeRelative(
0,
- contentPlaceable.height + offset,
+ contentPlaceable.height + offset
)
}
}
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayoutNestedScrollConnection.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayoutNestedScrollConnection.kt
index 175701ee..b4980995 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayoutNestedScrollConnection.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayoutNestedScrollConnection.kt
@@ -1,58 +1,56 @@
package com.ismartcoding.plain.ui.base.pullrefresh
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.unit.Velocity
+import com.ismartcoding.lib.logcat.LogCat
internal class RefreshLayoutNestedScrollConnection(
private val composePosition: ComposePosition,
private val refreshLayoutState: RefreshLayoutState,
private val dragEfficiency: Float,
private val orientationIsHorizontal: Boolean,
+ private val refreshingCanScroll: Boolean = false,
) : NestedScrollConnection {
+ //处理子组件用不完的手势,返回消费的手势
override fun onPostScroll(
consumed: Offset,
available: Offset,
- source: NestedScrollSource,
+ source: NestedScrollSource
): Offset {
if (source == NestedScrollSource.Drag) {
when (composePosition) {
ComposePosition.Start -> {
val value = available.x
if (value > 0) {
- if (value > 0.01f) {
+ //过滤误差值(系统bug?)
+ if (value > 0.01f)
refreshLayoutState.offset(value * dragEfficiency)
- }
return Offset(value, 0f)
}
}
ComposePosition.End -> {
val value = available.x
if (value < 0) {
- if (value < -0.01f) {
+ if (value < -0.01f)
refreshLayoutState.offset(value * dragEfficiency)
- }
return Offset(value, 0f)
}
}
ComposePosition.Top -> {
val value = available.y
if (value > 0) {
- if (value > 0.01f) {
+ if (value > 0.01f)
refreshLayoutState.offset(value * dragEfficiency)
- }
return Offset(0f, value)
}
}
ComposePosition.Bottom -> {
val value = available.y
if (value < 0) {
- if (value < -0.01f) {
+ if (value < -0.01f)
refreshLayoutState.offset(value * dragEfficiency)
- }
return Offset(0f, value)
}
}
@@ -61,23 +59,21 @@ internal class RefreshLayoutNestedScrollConnection(
return Offset.Zero
}
- // 预先处理手势,返回消费的手势
- override fun onPreScroll(
- available: Offset,
- source: NestedScrollSource,
- ): Offset {
- if (refreshLayoutState.refreshContentState.value == RefreshContentState.Refreshing) {
- return if (orientationIsHorizontal) {
+ //预先处理手势,返回消费的手势
+ override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+ //如果是刷新中状态,并且刷新中不允许滚动,就拒绝对刷新区域和上下区域滚动
+ if (!refreshingCanScroll && refreshLayoutState.refreshContentState.value == RefreshContentState.Refreshing) {
+ return if (orientationIsHorizontal)
Offset(available.x, 0f)
- } else {
+ else
Offset(0f, available.y)
- }
}
val refreshOffset = refreshLayoutState.refreshContentOffsetState.value
if (source == NestedScrollSource.Drag) {
when (composePosition) {
ComposePosition.Start -> {
if (available.x < 0 && refreshOffset > 0) {
+ //消费的手势
var consumptive = available.x
if (-available.x > refreshOffset) {
consumptive = available.x - refreshOffset
@@ -88,6 +84,7 @@ internal class RefreshLayoutNestedScrollConnection(
}
ComposePosition.End -> {
if (available.x > 0 && refreshOffset < 0) {
+ //消费的手势
var consumptive = available.x
if (-available.x > refreshOffset) {
consumptive = available.x - refreshOffset
@@ -97,7 +94,9 @@ internal class RefreshLayoutNestedScrollConnection(
}
}
ComposePosition.Top -> {
+ LogCat.d("ComposePosition.Top: ${available.y} ${refreshOffset}")
if (available.y < 0 && refreshOffset > 0) {
+ //消费的手势
var consumptive = available.y
if (-available.y > refreshOffset) {
consumptive = available.y - refreshOffset
@@ -107,8 +106,9 @@ internal class RefreshLayoutNestedScrollConnection(
}
}
ComposePosition.Bottom -> {
+ LogCat.d("ComposePosition.Bottom: ${available.y} ${refreshOffset}")
if (available.y > 0 && refreshOffset < 0) {
- // 消费的手势
+ //消费的手势
var consumptive = available.y
if (-available.y < refreshOffset) {
consumptive = available.y - refreshOffset
@@ -122,8 +122,10 @@ internal class RefreshLayoutNestedScrollConnection(
return Offset.Zero
}
+ //手势惯性滑动前回调,返回消费的速度,可以当做action_up
override suspend fun onPreFling(available: Velocity): Velocity {
- if (refreshLayoutState.refreshContentState.value == RefreshContentState.Refreshing) {
+ //如果是刷新中状态,并且刷新中不允许滚动,就拒绝对刷新区域和上下区域滚动
+ if (!refreshingCanScroll && refreshLayoutState.refreshContentState.value == RefreshContentState.Refreshing) {
return available
}
if (refreshLayoutState.refreshContentOffsetState.value != 0f) {
@@ -133,18 +135,3 @@ internal class RefreshLayoutNestedScrollConnection(
return Velocity.Zero
}
}
-
-@Composable
-internal fun rememberRefreshLayoutNestedScrollConnection(
- composePosition: ComposePosition,
- refreshLayoutState: RefreshLayoutState,
- dragEfficiency: Float,
- orientationIsHorizontal: Boolean,
-) = remember(composePosition) {
- RefreshLayoutNestedScrollConnection(
- composePosition,
- refreshLayoutState,
- dragEfficiency,
- orientationIsHorizontal,
- )
-}
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayoutState.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayoutState.kt
index 832f300a..aea2ed47 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayoutState.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/RefreshLayoutState.kt
@@ -10,65 +10,104 @@ import kotlin.math.abs
@Stable
class RefreshLayoutState(
- internal val onRefreshListener: RefreshLayoutState.() -> Unit,
+ internal val onRefreshListener: RefreshLayoutState.() -> Unit
) {
+ //刷新布局内容区域的组件状态
internal val refreshContentState = mutableStateOf(RefreshContentState.Stop)
+ //刷新布局内容区域的Offset(位移)的状态和子内容区域的Offset(位移)的状态,如果contentIsMove==false,则一直为0,单位px
internal val refreshContentOffsetState = Animatable(0f)
+ //composePosition的状态,参考[RefreshLayout]的参数
internal val composePositionState = mutableStateOf(ComposePosition.Top)
+ //刷新布局拖动的阈值,单位px
internal val refreshContentThresholdState = mutableFloatStateOf(0f)
+ //协程作用域
internal lateinit var coroutineScope: CoroutineScope
- fun getRefreshContentState(): State = refreshContentState
+ //是否可以触发[onRefreshListener]
+ var canCallRefreshListener = true
- fun createRefreshContentOffsetFlow(): Flow = snapshotFlow { refreshContentOffsetState.value }
+ /**
+ * 获取刷新布局内容区域的组件状态
+ * Get the [State] of the refresh content
+ */
+ fun getRefreshContentState(): State = refreshContentState
+ /**
+ * 创建刷新布局内容区域的Offset(位移)的flow
+ * Create the [Flow] of the offset
+ */
+ fun createRefreshContentOffsetFlow(): Flow =
+ snapshotFlow { refreshContentOffsetState.value }
+
+ /**
+ * 获取composePosition的状态,参考[RefreshLayout]的参数
+ * Get the [State] of the [ComposePosition]
+ */
fun getComposePositionState(): State = composePositionState
+ /**
+ * 获取刷新布局拖动的阈值,单位px
+ * Get threshold of the refresh content
+ */
fun getRefreshContentThreshold(): Float = refreshContentThresholdState.value
+ /**
+ * 刷新布局内容区域的Offset的值,单位px
+ * Get the offset of content area
+ */
fun getRefreshContentOffset(): Float = refreshContentOffsetState.value
+ /**
+ * 设置刷新布局的状态
+ * Set the state of refresh content
+ */
fun setRefreshState(state: RefreshContentState) {
when (state) {
RefreshContentState.Stop -> {
- if (refreshContentState.value == RefreshContentState.Stop) {
+ if (refreshContentState.value == RefreshContentState.Stop)
return
- }
- if (!this::coroutineScope.isInitialized) {
+ if (!this::coroutineScope.isInitialized)
throw IllegalStateException("[RefreshLayoutState]还未初始化完成,请在[LaunchedEffect]中或composable至少组合一次后使用此方法")
- }
coroutineScope.launch {
refreshContentState.value = RefreshContentState.Stop
delay(300)
refreshContentOffsetState.animateTo(0f)
}
}
+
RefreshContentState.Refreshing -> {
- if (refreshContentState.value == RefreshContentState.Refreshing) {
+ if (refreshContentState.value == RefreshContentState.Refreshing)
return
- }
- if (!this::coroutineScope.isInitialized) {
+ if (!this::coroutineScope.isInitialized)
throw IllegalStateException("[RefreshLayoutState]还未初始化完成,请在[LaunchedEffect]中或composable至少组合一次后使用此方法")
- }
coroutineScope.launch {
refreshContentState.value = RefreshContentState.Refreshing
- onRefreshListener()
+ if (canCallRefreshListener)
+ onRefreshListener()
+ else
+ setRefreshState(RefreshContentState.Stop)
animateToThreshold()
}
}
- RefreshContentState.Dragging -> throw IllegalStateException("设置为[RefreshContentStateEnum.Dragging]无意义")
+
+ RefreshContentState.Dragging -> throw IllegalStateException("设置为[RefreshContentState.Dragging]无意义")
}
}
+ //偏移量归位,并检查是否超过了刷新阈值,如果超过了执行刷新逻辑
internal fun offsetHoming() {
coroutineScope.launch {
+ //检查是否进入了刷新状态
if (abs(refreshContentOffsetState.value) >= refreshContentThresholdState.value) {
refreshContentState.value = RefreshContentState.Refreshing
- onRefreshListener()
+ if (canCallRefreshListener)
+ onRefreshListener()
+ else
+ setRefreshState(RefreshContentState.Stop)
animateToThreshold()
} else {
refreshContentOffsetState.animateTo(0f)
@@ -77,15 +116,16 @@ class RefreshLayoutState(
}
}
+ //动画滑动至阈值处
private suspend fun animateToThreshold() {
val composePosition = composePositionState.value
- if (composePosition == ComposePosition.Start || composePosition == ComposePosition.Top) {
+ if (composePosition == ComposePosition.Start || composePosition == ComposePosition.Top)
refreshContentOffsetState.animateTo(refreshContentThresholdState.value)
- } else {
+ else
refreshContentOffsetState.animateTo(-refreshContentThresholdState.value)
- }
}
+ //增加偏移量
internal fun offset(refreshContentOffset: Float) {
coroutineScope.launch {
val targetValue = refreshContentOffsetState.value + refreshContentOffset
@@ -98,4 +138,5 @@ class RefreshLayoutState(
}
@Composable
-fun rememberRefreshLayoutState(onRefreshListener: RefreshLayoutState.() -> Unit) = remember { RefreshLayoutState(onRefreshListener) }
+fun rememberRefreshLayoutState(onRefreshListener: RefreshLayoutState.() -> Unit) =
+ remember { RefreshLayoutState(onRefreshListener) }
\ No newline at end of file
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/VerticalRefreshableLayout.kt b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/VerticalRefreshableLayout.kt
index bdfc86d5..105633ea 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/VerticalRefreshableLayout.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/base/pullrefresh/VerticalRefreshableLayout.kt
@@ -2,6 +2,7 @@ package com.ismartcoding.plain.ui.base.pullrefresh
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
@@ -10,19 +11,20 @@ fun VerticalRefreshableLayout(
topRefreshLayoutState: RefreshLayoutState,
bottomRefreshLayoutState: RefreshLayoutState,
modifier: Modifier = Modifier,
- topRefreshContent: @Composable RefreshLayoutState.() -> Unit =
- remember {
- { PullToRefreshContent() }
- },
- bottomNoMore: Boolean = false,
- bottomRefreshContent: @Composable RefreshLayoutState.() -> Unit =
- remember(bottomNoMore) {
- { LoadMoreRefreshContent(bottomNoMore) }
- },
+ topRefreshContent: @Composable RefreshLayoutState.() -> Unit = remember {
+ { PullToRefreshContent() }
+ },
+ bottomIsLoadFinish: Boolean = false,
+ bottomRefreshContent: @Composable RefreshLayoutState.() -> Unit = remember(bottomIsLoadFinish) {
+ { LoadMoreRefreshContent(bottomIsLoadFinish) }
+ },
topUserEnable: Boolean = true,
bottomUserEnable: Boolean = true,
- content: @Composable () -> Unit,
+ content: @Composable () -> Unit
) {
+ LaunchedEffect(bottomIsLoadFinish) {
+ bottomRefreshLayoutState.canCallRefreshListener = !bottomIsLoadFinish
+ }
RefreshLayout(
modifier = modifier,
refreshContent = topRefreshContent,
@@ -35,7 +37,9 @@ fun VerticalRefreshableLayout(
refreshLayoutState = bottomRefreshLayoutState,
composePosition = ComposePosition.Bottom,
userEnable = bottomUserEnable,
- content = content,
+ refreshingCanScroll = true,
+ content = content
)
}
}
+
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/components/PackageListItem.kt b/app/src/main/java/com/ismartcoding/plain/ui/components/PackageListItem.kt
index 67b04843..232abc9f 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/components/PackageListItem.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/components/PackageListItem.kt
@@ -3,26 +3,18 @@ package com.ismartcoding.plain.ui.components
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.combinedClickable
-import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.text.selection.SelectionContainer
-import androidx.compose.material3.HorizontalDivider
-import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.painter.Painter
-import androidx.compose.ui.graphics.vector.ImageVector
-import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -33,18 +25,17 @@ import com.ismartcoding.plain.extensions.formatDateTime
import com.ismartcoding.plain.features.locale.LocaleHelper
import com.ismartcoding.plain.ui.base.VerticalSpace
import com.ismartcoding.plain.ui.models.VPackage
-import com.ismartcoding.plain.ui.theme.palette.LocalTonalPalettes
-import com.ismartcoding.plain.ui.theme.palette.onDark
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun PackageListItem(
item: VPackage,
+ modifier: Modifier = Modifier,
onClick: () -> Unit = { },
onLongClick: (() -> Unit)? = null,
) {
Surface(
- modifier = Modifier
+ modifier = modifier
.combinedClickable(
onClick = onClick,
onLongClick = onLongClick,
@@ -73,7 +64,7 @@ fun PackageListItem(
) {
Text(
text = item.name + " (${item.version})",
- style = MaterialTheme.typography.titleLarge.copy(fontSize = 18.sp),
+ style = MaterialTheme.typography.titleLarge.copy(fontSize = 18.sp, color = MaterialTheme.colorScheme.onSurface),
)
VerticalSpace(dp = 4.dp)
Text(
@@ -84,14 +75,12 @@ fun PackageListItem(
VerticalSpace(dp = 4.dp)
Text(
text = stringResource(id = LocaleHelper.getStringIdentifier("app_type_" + item.type)) + " " + FormatHelper.formatBytes(item.size),
- color = MaterialTheme.colorScheme.onSurfaceVariant,
- style = MaterialTheme.typography.bodyMedium,
+ style = MaterialTheme.typography.bodyMedium.copy(color = MaterialTheme.colorScheme.onSurfaceVariant),
)
VerticalSpace(dp = 4.dp)
Text(
text = stringResource(id = R.string.updated_at) + " " + item.updatedAt.formatDateTime(),
- color = MaterialTheme.colorScheme.onSurfaceVariant,
- style = MaterialTheme.typography.bodyMedium,
+ style = MaterialTheme.typography.bodyMedium.copy(color = MaterialTheme.colorScheme.onSurfaceVariant),
)
}
}
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatFiles.kt b/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatFiles.kt
index f0a661ef..0d69addd 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatFiles.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatFiles.kt
@@ -42,6 +42,7 @@ import com.ismartcoding.plain.ui.PdfViewerDialog
import com.ismartcoding.plain.ui.TextEditorDialog
import com.ismartcoding.plain.ui.audio.AudioPlayerDialog
import com.ismartcoding.plain.ui.base.PAsyncImage
+import com.ismartcoding.plain.ui.base.PCard
import com.ismartcoding.plain.ui.helpers.DialogHelper
import com.ismartcoding.plain.ui.models.VChat
import com.ismartcoding.plain.ui.page.RouteName
@@ -56,94 +57,81 @@ fun ChatFiles(
m: VChat,
) {
val fileItems = (m.value as DMessageFiles).items
- Column(
- modifier =
+ fileItems.forEachIndexed { index, item ->
+ val path = item.uri.getFinalPath(context)
+ Box(
+ modifier =
Modifier
.fillMaxWidth()
- .padding(horizontal = 16.dp, vertical = 8.dp)
- .clip(RoundedCornerShape(8.dp))
- .border(
- width = 1.dp,
- color = MaterialTheme.colorScheme.onSurface,
- shape = RoundedCornerShape(8.dp, 8.dp, 8.dp, 8.dp),
- ),
- ) {
- fileItems.forEachIndexed { index, item ->
- val path = item.uri.getFinalPath(context)
- Box(
+ .clickable {
+ if (path.isImageFast() || path.isVideoFast()) {
+ val items =
+ fileItems
+ .filter { it.uri.isVideoFast() || it.uri.isImageFast() }
+ PreviewDialog().show(
+ items =
+ items.mapIndexed {
+ i,
+ s,
+ ->
+ val p = s.uri.getFinalPath(context)
+ PreviewItem(m.id + "|" + i, p.pathToUri(), p)
+ },
+ initKey = m.id + "|" + items.indexOf(item),
+ )
+ } else if (path.isAudioFast()) {
+ AudioPlayerDialog().show()
+ Permissions.checkNotification(context, R.string.audio_notification_prompt) {
+ AudioPlayer.play(context, DPlaylistAudio.fromPath(context, path))
+ }
+ } else if (path.isTextFile()) {
+ if (item.size <= Constants.MAX_READABLE_TEXT_FILE_SIZE) {
+ TextEditorDialog(Uri.fromFile(File(path))).show()
+ } else {
+ DialogHelper.showMessage(R.string.text_file_size_limit)
+ }
+ } else if (path.isPdfFile()) {
+ PdfViewerDialog(Uri.fromFile(File(path))).show()
+ } else {
+ navController.navigate("${RouteName.OTHER_FILE.name}?path=${path}")
+ }
+ },
+ ) {
+ Row(
modifier =
- Modifier
- .fillMaxWidth()
- .clickable {
- if (path.isImageFast() || path.isVideoFast()) {
- val items =
- fileItems
- .filter { it.uri.isVideoFast() || it.uri.isImageFast() }
- PreviewDialog().show(
- items =
- items.mapIndexed {
- i,
- s,
- ->
- val p = s.uri.getFinalPath(context)
- PreviewItem(m.id + "|" + i, p.pathToUri(), p)
- },
- initKey = m.id + "|" + items.indexOf(item),
- )
- } else if (path.isAudioFast()) {
- AudioPlayerDialog().show()
- Permissions.checkNotification(context, R.string.audio_notification_prompt) {
- AudioPlayer.play(context, DPlaylistAudio.fromPath(context, path))
- }
- } else if (path.isTextFile()) {
- if (item.size <= Constants.MAX_READABLE_TEXT_FILE_SIZE) {
- TextEditorDialog(Uri.fromFile(File(path))).show()
- } else {
- DialogHelper.showMessage(R.string.text_file_size_limit)
- }
- } else if (path.isPdfFile()) {
- PdfViewerDialog(Uri.fromFile(File(path))).show()
- } else {
- navController.navigate("${RouteName.OTHER_FILE.name}?path=${path}")
- }
- },
+ Modifier
+ .fillMaxWidth()
+ .padding(top = if (index == 0) 16.dp else 6.dp, bottom = 16.dp, start = 16.dp, end = 16.dp),
) {
- Row(
- modifier =
+ Column(modifier = Modifier.weight(1f)) {
+ Text(
+ modifier =
Modifier
.fillMaxWidth()
- .padding(top = if (index == 0) 12.dp else 6.dp, bottom = 12.dp, start = 12.dp, end = 12.dp),
- ) {
- Column(modifier = Modifier.weight(1f)) {
- Text(
- modifier =
- Modifier
- .fillMaxWidth()
- .padding(bottom = 8.dp, end = 8.dp),
- text = path.getFilenameFromPath(),
- style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Normal),
- )
- Text(
- modifier =
- Modifier
- .fillMaxWidth()
- .padding(end = 8.dp),
- text = FormatHelper.formatBytes(item.size) + if (item.duration > 0) " / ${FormatHelper.formatDuration(item.duration)}" else "",
- color = MaterialTheme.colorScheme.secondary,
- style = MaterialTheme.typography.titleSmall.copy(fontWeight = FontWeight.Normal),
- )
- }
- if (path.isImageFast() || path.isVideoFast()) {
- PAsyncImage(
- modifier =
- Modifier
- .size(48.dp)
- .clip(RoundedCornerShape(4.dp)),
- data = path,
- size = Size(context.dp2px(48), context.dp2px(48)),
- contentScale = ContentScale.Crop,
- )
- }
+ .padding(bottom = 8.dp, end = 8.dp),
+ text = path.getFilenameFromPath(),
+ style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Normal),
+ )
+ Text(
+ modifier =
+ Modifier
+ .fillMaxWidth()
+ .padding(end = 8.dp),
+ text = FormatHelper.formatBytes(item.size) + if (item.duration > 0) " / ${FormatHelper.formatDuration(item.duration)}" else "",
+ color = MaterialTheme.colorScheme.secondary,
+ style = MaterialTheme.typography.titleSmall.copy(fontWeight = FontWeight.Normal),
+ )
+ }
+ if (path.isImageFast() || path.isVideoFast()) {
+ PAsyncImage(
+ modifier =
+ Modifier
+ .size(48.dp)
+ .clip(RoundedCornerShape(4.dp)),
+ data = path,
+ size = Size(context.dp2px(48), context.dp2px(48)),
+ contentScale = ContentScale.Crop,
+ )
}
}
}
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatImages.kt b/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatImages.kt
index a036d92e..b624de12 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatImages.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatImages.kt
@@ -10,11 +10,13 @@ import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.font.FontWeight
@@ -31,6 +33,7 @@ import com.ismartcoding.plain.ui.models.SharedViewModel
import com.ismartcoding.plain.ui.models.VChat
import com.ismartcoding.plain.ui.preview.PreviewDialog
import com.ismartcoding.plain.ui.preview.PreviewItem
+import com.ismartcoding.plain.ui.theme.PlainTheme
@OptIn(ExperimentalLayoutApi::class)
@Composable
@@ -46,10 +49,10 @@ fun ChatImages(
modifier =
Modifier
.fillMaxWidth()
- .padding(horizontal = 16.dp, vertical = 8.dp),
+ .padding(16.dp),
maxItemsInEachRow = 3,
- horizontalArrangement = Arrangement.spacedBy(1.dp, Alignment.Start),
- verticalArrangement = Arrangement.spacedBy(1.dp, Alignment.Top),
+ horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.Start),
+ verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.Top),
content = {
val imageItems = (m.value as DMessageImages).items
imageItems.forEachIndexed { index, item ->
@@ -72,7 +75,9 @@ fun ChatImages(
},
) {
PAsyncImage(
- modifier = Modifier.size(imageWidthDp),
+ modifier = Modifier
+ .size(imageWidthDp)
+ .clip(RoundedCornerShape(6.dp)),
data = path,
size = Size(imageWidthPx, imageWidthPx),
contentScale = ContentScale.Crop,
@@ -81,6 +86,7 @@ fun ChatImages(
modifier =
Modifier
.align(Alignment.BottomEnd)
+ .clip(RoundedCornerShape(bottomEnd = 6.dp))
.background(Color.Black.copy(alpha = 0.4f)),
) {
Text(
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatText.kt b/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatText.kt
index 1812850d..4a70db29 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatText.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/components/chat/ChatText.kt
@@ -7,10 +7,9 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusManager
-import androidx.compose.ui.text.SpanStyle
-import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.dp
import com.ismartcoding.plain.db.DMessageText
+import com.ismartcoding.plain.ui.base.PCard
import com.ismartcoding.plain.ui.base.PClickableText
import com.ismartcoding.plain.ui.base.linkify
import com.ismartcoding.plain.ui.base.urlAt
@@ -23,13 +22,13 @@ fun ChatText(
m: VChat,
onDoubleClick: () -> Unit,
onLongClick: () -> Unit,
- ) {
+) {
val text = (m.value as DMessageText).text.linkify()
PClickableText(
text = text,
style = MaterialTheme.typography.bodyLarge.copy(color = MaterialTheme.colorScheme.onSurface),
modifier = Modifier
- .padding(horizontal = 16.dp, vertical = 8.dp)
+ .padding(16.dp)
.fillMaxWidth(),
onClick = { position ->
focusManager.clearFocus()
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/extensions/RecyclerView.kt b/app/src/main/java/com/ismartcoding/plain/ui/extensions/RecyclerView.kt
index 71f675ef..bca84671 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/extensions/RecyclerView.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/extensions/RecyclerView.kt
@@ -242,9 +242,9 @@ suspend fun RecyclerView.updateDrawerMenuAsync(viewModel: FilesViewModel) {
}
}
groups.add(
- MenuItemModel(context.getExternalFilesDir(null)!!.absolutePath).apply {
+ MenuItemModel(FileSystemHelper.getExternalFilesDirPath(context)).apply {
isChecked = viewModel.type == FilesType.APP
- title = getString(R.string.app_name)
+ title = getString(R.string.file_transfer_assistant)
iconId = R.drawable.ic_app_icon
},
)
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/file/FilesDialog.kt b/app/src/main/java/com/ismartcoding/plain/ui/file/FilesDialog.kt
index b244113a..30c87fb7 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/file/FilesDialog.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/file/FilesDialog.kt
@@ -29,6 +29,7 @@ import com.ismartcoding.lib.helpers.FormatHelper
import com.ismartcoding.plain.Constants
import com.ismartcoding.plain.R
import com.ismartcoding.plain.data.enums.ActionSourceType
+import com.ismartcoding.plain.data.enums.ExportFileType
import com.ismartcoding.plain.data.preference.FileSortByPreference
import com.ismartcoding.plain.data.preference.ShowHiddenFilesPreference
import com.ismartcoding.plain.databinding.DialogFilesBinding
@@ -73,7 +74,7 @@ import java.io.File
import kotlin.io.path.Path
import kotlin.io.path.moveTo
-class FilesDialog : BaseDialog() {
+class FilesDialog(val fileType: FilesType = FilesType.INTERNAL_STORAGE) : BaseDialog() {
val viewModel: FilesViewModel by viewModels()
override fun onViewCreated(
@@ -81,7 +82,13 @@ class FilesDialog : BaseDialog() {
savedInstanceState: Bundle?,
) {
super.onViewCreated(view, savedInstanceState)
-
+ if (fileType == FilesType.APP) {
+ viewModel.root = FileSystemHelper.getExternalFilesDirPath(requireContext())
+ viewModel.breadcrumbs.clear()
+ viewModel.breadcrumbs.add(BreadcrumbItem(LocaleHelper.getString(R.string.file_transfer_assistant), viewModel.root))
+ viewModel.path = viewModel.root
+ viewModel.type = FilesType.APP
+ }
updatePasteAction()
binding.bottomAction.run {
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/models/AppsViewModel.kt b/app/src/main/java/com/ismartcoding/plain/ui/models/AppsViewModel.kt
index 35f76e0c..a4f8997e 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/models/AppsViewModel.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/models/AppsViewModel.kt
@@ -7,10 +7,13 @@ import androidx.compose.runtime.toMutableStateList
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.ismartcoding.plain.features.pkg.PackageHelper
+import com.ismartcoding.plain.ui.theme.PlainTheme
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
+import kotlin.system.measureTimeMillis
class AppsViewModel : ViewModel() {
private val _itemsFlow = MutableStateFlow(mutableStateListOf())
@@ -20,23 +23,19 @@ class AppsViewModel : ViewModel() {
var limit = mutableIntStateOf(50)
var noMore = mutableStateOf(false)
- fun loadMore() {
- viewModelScope.launch(Dispatchers.IO) {
- offset.value += limit.value
- val items = PackageHelper.search("", limit.value, offset.value).map { VPackage.from(it) }
- _itemsFlow.value.addAll(items)
- showLoading.value = false
- noMore.value = items.size < limit.value
- }
+ fun moreAsync(query: String = "") {
+ offset.value += limit.value
+ val items = PackageHelper.search(query, limit.value, offset.value).map { VPackage.from(it) }
+ _itemsFlow.value.addAll(items)
+ showLoading.value = false
+ noMore.value = items.size < limit.value
}
- fun load() {
- viewModelScope.launch(Dispatchers.IO) {
- offset.value = 0
- _itemsFlow.value = PackageHelper.search("", limit.value, 0).map { VPackage.from(it) }.toMutableStateList()
- showLoading.value = false
- noMore.value = _itemsFlow.value.size < limit.value
- }
+ suspend fun loadAsync(query: String = "") {
+ offset.value = 0
+ _itemsFlow.value = PackageHelper.search(query, limit.value, 0).map { VPackage.from(it) }.toMutableStateList()
+ noMore.value = _itemsFlow.value.size < limit.value
+ showLoading.value = false
}
fun uninstall(id: String) {
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/models/WebConsoleViewModel.kt b/app/src/main/java/com/ismartcoding/plain/ui/models/WebConsoleViewModel.kt
index be2082f1..92a4eebc 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/models/WebConsoleViewModel.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/models/WebConsoleViewModel.kt
@@ -8,11 +8,16 @@ import com.ismartcoding.lib.channel.sendEvent
import com.ismartcoding.lib.helpers.CoroutinesHelper.withIO
import com.ismartcoding.plain.BuildConfig
import com.ismartcoding.plain.R
+import com.ismartcoding.plain.data.preference.KeepAwakePreference
+import com.ismartcoding.plain.features.AcquireWakeLockEvent
import com.ismartcoding.plain.features.IgnoreBatteryOptimizationEvent
+import com.ismartcoding.plain.features.ReleaseWakeLockEvent
import com.ismartcoding.plain.helpers.AppHelper
import com.ismartcoding.plain.powerManager
+import com.ismartcoding.plain.receivers.PlugInControlReceiver
import com.ismartcoding.plain.ui.helpers.DialogHelper
import com.ismartcoding.plain.web.HttpServerManager
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class WebConsoleViewModel : ViewModel() {
@@ -47,4 +52,15 @@ class WebConsoleViewModel : ViewModel() {
sendEvent(IgnoreBatteryOptimizationEvent())
}
}
+
+ fun enableKeepAwake(context: Context, enable: Boolean) {
+ viewModelScope.launch(Dispatchers.IO) {
+ KeepAwakePreference.putAsync(context, enable)
+ if (enable) {
+ sendEvent(AcquireWakeLockEvent())
+ } else if (!PlugInControlReceiver.isUSBConnected(context)) {
+ sendEvent(ReleaseWakeLockEvent())
+ }
+ }
+ }
}
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/page/ChatPage.kt b/app/src/main/java/com/ismartcoding/plain/ui/page/ChatPage.kt
index d0d2efc0..5fa9c42c 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/page/ChatPage.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/page/ChatPage.kt
@@ -19,8 +19,11 @@ import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.outlined.Folder
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
@@ -70,8 +73,11 @@ import com.ismartcoding.plain.features.PickFileResultEvent
import com.ismartcoding.plain.features.chat.ChatHelper
import com.ismartcoding.plain.features.locale.LocaleHelper
import com.ismartcoding.plain.helpers.FileHelper
+import com.ismartcoding.plain.ui.base.PCard
import com.ismartcoding.plain.ui.base.PDropdownMenu
+import com.ismartcoding.plain.ui.base.PIconButton
import com.ismartcoding.plain.ui.base.PScaffold
+import com.ismartcoding.plain.ui.base.VerticalSpace
import com.ismartcoding.plain.ui.base.pullrefresh.PullToRefresh
import com.ismartcoding.plain.ui.base.pullrefresh.RefreshContentState
import com.ismartcoding.plain.ui.base.pullrefresh.rememberRefreshLayoutState
@@ -82,10 +88,13 @@ import com.ismartcoding.plain.ui.components.chat.ChatInput
import com.ismartcoding.plain.ui.components.chat.ChatName
import com.ismartcoding.plain.ui.components.chat.ChatText
import com.ismartcoding.plain.ui.extensions.navigate
+import com.ismartcoding.plain.ui.file.FilesDialog
+import com.ismartcoding.plain.ui.file.FilesType
import com.ismartcoding.plain.ui.helpers.DialogHelper
import com.ismartcoding.plain.ui.models.ChatViewModel
import com.ismartcoding.plain.ui.models.SharedViewModel
import com.ismartcoding.plain.ui.models.VChat
+import com.ismartcoding.plain.ui.views.BreadcrumbItem
import com.ismartcoding.plain.web.HttpServerEvents
import com.ismartcoding.plain.web.models.toModel
import com.ismartcoding.plain.web.websocket.EventType
@@ -110,7 +119,7 @@ fun ChatPage(
var inputValue by remember { mutableStateOf("") }
val configuration = LocalConfiguration.current
val density = LocalDensity.current
- val imageWidthDp = (configuration.screenWidthDp.dp - 34.dp) / 3
+ val imageWidthDp = (configuration.screenWidthDp.dp - 74.dp) / 3
val imageWidthPx = with(density) { imageWidthDp.toPx().toInt() }
val refreshState =
rememberRefreshLayoutState {
@@ -244,6 +253,16 @@ fun ChatPage(
PScaffold(
navController,
topBarTitle = stringResource(id = R.string.file_transfer_assistant),
+ actions = {
+ PIconButton(
+ imageVector = Icons.Outlined.Folder,
+ contentDescription = stringResource(R.string.folder),
+ tint = MaterialTheme.colorScheme.onSurface,
+ onClick = {
+ FilesDialog(FilesType.APP).show()
+ },
+ )
+ },
content = {
Column(
Modifier
@@ -289,26 +308,29 @@ fun ChatPage(
),
) {
ChatName(m)
- when (m.type) {
- DMessageType.IMAGES.value -> {
- ChatImages(context, navController, sharedViewModel, m, imageWidthDp, imageWidthPx)
- }
+ PCard {
+ when (m.type) {
+ DMessageType.IMAGES.value -> {
+ ChatImages(context, navController, sharedViewModel, m, imageWidthDp, imageWidthPx)
+ }
- DMessageType.FILES.value -> {
- ChatFiles(context, navController, m)
- }
+ DMessageType.FILES.value -> {
+ ChatFiles(context, navController, m)
+ }
- DMessageType.TEXT.value -> {
- ChatText(context, focusManager, m, onDoubleClick = {
- val content = (m.value as DMessageText).text
- sharedViewModel.chatContent.value = content
- navController.navigate(RouteName.CHAT_TEXT)
- }, onLongClick = {
- selectedItem = m
- showContextMenu.value = true
- })
+ DMessageType.TEXT.value -> {
+ ChatText(context, focusManager, m, onDoubleClick = {
+ val content = (m.value as DMessageText).text
+ sharedViewModel.chatContent.value = content
+ navController.navigate(RouteName.CHAT_TEXT)
+ }, onLongClick = {
+ selectedItem = m
+ showContextMenu.value = true
+ })
+ }
}
}
+ VerticalSpace(dp = 8.dp)
}
Box(
modifier =
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/page/HomePage.kt b/app/src/main/java/com/ismartcoding/plain/ui/page/HomePage.kt
index 4ab11e58..148b8970 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/page/HomePage.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/page/HomePage.kt
@@ -24,7 +24,6 @@ import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
-import androidx.lifecycle.Lifecycle
import androidx.navigation.NavHostController
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.ismartcoding.lib.channel.receiveEventHandler
@@ -37,10 +36,10 @@ import com.ismartcoding.plain.data.preference.HttpPortPreference
import com.ismartcoding.plain.data.preference.HttpsPortPreference
import com.ismartcoding.plain.data.preference.LocalKeepScreenOn
import com.ismartcoding.plain.data.preference.LocalWeb
-import com.ismartcoding.plain.data.preference.WebSettingsProvider
import com.ismartcoding.plain.features.Permission
import com.ismartcoding.plain.features.PermissionsResultEvent
import com.ismartcoding.plain.features.RequestPermissionsEvent
+import com.ismartcoding.plain.features.WindowFocusChangedEvent
import com.ismartcoding.plain.helpers.AppHelper
import com.ismartcoding.plain.helpers.ScreenHelper
import com.ismartcoding.plain.ui.base.ActionButtonMore
@@ -53,7 +52,6 @@ import com.ismartcoding.plain.ui.base.PDropdownMenu
import com.ismartcoding.plain.ui.base.PScaffold
import com.ismartcoding.plain.ui.base.TopSpace
import com.ismartcoding.plain.ui.base.VerticalSpace
-import com.ismartcoding.plain.ui.base.rememberLifecycleEvent
import com.ismartcoding.plain.ui.components.home.HomeFeatures
import com.ismartcoding.plain.ui.components.home.HomeWeb
import com.ismartcoding.plain.ui.extensions.navigate
@@ -69,161 +67,158 @@ fun HomePage(
navController: NavHostController,
viewModel: MainViewModel,
) {
- WebSettingsProvider {
- val context = LocalContext.current
- val scope = rememberCoroutineScope()
- var isMenuOpen by remember { mutableStateOf(false) }
- val keepScreenOn = LocalKeepScreenOn.current
- val configuration = LocalConfiguration.current
- val itemWidth = (configuration.screenWidthDp.dp - 96.dp) / 3
- val events by remember { mutableStateOf>(arrayListOf()) }
- val webEnabled = LocalWeb.current
- var systemAlertWindow by remember { mutableStateOf(Permission.SYSTEM_ALERT_WINDOW.can(context)) }
- var isVPNConnected by remember { mutableStateOf(NetworkHelper.isVPNConnected(context)) }
+ val context = LocalContext.current
+ val scope = rememberCoroutineScope()
+ var isMenuOpen by remember { mutableStateOf(false) }
+ val keepScreenOn = LocalKeepScreenOn.current
+ val configuration = LocalConfiguration.current
+ val itemWidth = (configuration.screenWidthDp.dp - 96.dp) / 3
+ val events by remember { mutableStateOf>(arrayListOf()) }
+ val webEnabled = LocalWeb.current
+ var systemAlertWindow by remember { mutableStateOf(Permission.SYSTEM_ALERT_WINDOW.can(context)) }
+ var isVPNConnected by remember { mutableStateOf(NetworkHelper.isVPNConnected(context)) }
- val lifecycleEvent = rememberLifecycleEvent()
- LaunchedEffect(lifecycleEvent) {
- if (lifecycleEvent == Lifecycle.Event.ON_RESUME) {
+ LaunchedEffect(Unit) {
+ events.add(
+ receiveEventHandler {
+ systemAlertWindow = Permission.SYSTEM_ALERT_WINDOW.can(context)
+ }
+ )
+ events.add(
+ receiveEventHandler {
isVPNConnected = NetworkHelper.isVPNConnected(context)
}
- }
+ )
+ }
- LaunchedEffect(Unit) {
- events.add(
- receiveEventHandler {
- systemAlertWindow = Permission.SYSTEM_ALERT_WINDOW.can(context)
- }
- )
+ DisposableEffect(Unit) {
+ onDispose {
+ events.forEach { it.cancel() }
}
+ }
- DisposableEffect(Unit) {
- onDispose {
- events.forEach { it.cancel() }
+ PScaffold(
+ navController,
+ topBarTitle = stringResource(id = R.string.app_name),
+ navigationIcon = {
+ ActionButtonSettings {
+ navController.navigate(RouteName.SETTINGS)
}
- }
-
- PScaffold(
- navController,
- navigationIcon = {
- ActionButtonSettings {
- navController.navigate(RouteName.SETTINGS)
- }
- },
- actions = {
- ActionButtonMore {
- isMenuOpen = !isMenuOpen
- }
- PDropdownMenu(expanded = isMenuOpen, onDismissRequest = { isMenuOpen = false }, content = {
- DropdownMenuItem(onClick = {
- isMenuOpen = false
- scope.launch(Dispatchers.IO) {
- ScreenHelper.keepScreenOnAsync(context, !keepScreenOn)
- }
- }, text = {
- Row {
- Text(
- text = stringResource(R.string.keep_screen_on),
- modifier = Modifier.padding(top = 14.dp),
- )
- Checkbox(checked = keepScreenOn, onCheckedChange = {
- isMenuOpen = false
- scope.launch(Dispatchers.IO) {
- ScreenHelper.keepScreenOnAsync(context, it)
- }
- })
- }
- })
- DropdownMenuItem(onClick = {
- isMenuOpen = false
- navController.navigate(RouteName.SCAN)
- }, text = {
- Text(text = stringResource(R.string.scan_qrcode))
- })
+ },
+ actions = {
+ ActionButtonMore {
+ isMenuOpen = !isMenuOpen
+ }
+ PDropdownMenu(expanded = isMenuOpen, onDismissRequest = { isMenuOpen = false }, content = {
+ DropdownMenuItem(onClick = {
+ isMenuOpen = false
+ scope.launch(Dispatchers.IO) {
+ ScreenHelper.keepScreenOnAsync(context, !keepScreenOn)
+ }
+ }, text = {
+ Row {
+ Text(
+ text = stringResource(R.string.keep_screen_on),
+ modifier = Modifier.padding(top = 14.dp),
+ )
+ Checkbox(checked = keepScreenOn, onCheckedChange = {
+ isMenuOpen = false
+ scope.launch(Dispatchers.IO) {
+ ScreenHelper.keepScreenOnAsync(context, it)
+ }
+ })
+ }
})
- },
- floatingActionButton = {
- FloatingActionButton(
- modifier =
- Modifier
- .padding(bottom = 32.dp),
- onClick = {
- navController.navigate(RouteName.CHAT)
- },
- ) {
- Icon(
- Icons.AutoMirrored.Outlined.Chat,
- stringResource(R.string.file_transfer_assistant),
- )
- }
- },
- ) {
- LazyColumn {
- item {
- TopSpace()
- if (webEnabled) {
- if (viewModel.httpServerError.value.isNotEmpty()) {
- Alert(title = stringResource(id = R.string.error), description = viewModel.httpServerError.value, AlertType.ERROR) {
- if (HttpServerManager.portsInUse.isNotEmpty()) {
- MiniOutlineButton(
- text = stringResource(R.string.change_port),
- onClick = {
- scope.launch(Dispatchers.IO) {
- if (HttpServerManager.portsInUse.contains(TempData.httpPort)) {
- HttpPortPreference.putAsync(context, HttpServerManager.httpPorts.filter { it != TempData.httpPort }.random())
- }
- if (HttpServerManager.portsInUse.contains(TempData.httpsPort)) {
- HttpsPortPreference.putAsync(context, HttpServerManager.httpsPorts.filter { it != TempData.httpsPort }.random())
- }
- coMain {
- MaterialAlertDialogBuilder(context)
- .setTitle(R.string.restart_app_title)
- .setMessage(R.string.restart_app_message)
- .setPositiveButton(R.string.relaunch_app) { _, _ ->
- AppHelper.relaunch(context)
- }
- .setCancelable(false)
- .create()
- .show()
- }
- }
- },
- )
- }
+ DropdownMenuItem(onClick = {
+ isMenuOpen = false
+ navController.navigate(RouteName.SCAN)
+ }, text = {
+ Text(text = stringResource(R.string.scan_qrcode))
+ })
+ })
+ },
+ floatingActionButton = {
+ FloatingActionButton(
+ modifier =
+ Modifier
+ .padding(bottom = 32.dp),
+ onClick = {
+ navController.navigate(RouteName.CHAT)
+ },
+ ) {
+ Icon(
+ Icons.AutoMirrored.Outlined.Chat,
+ stringResource(R.string.file_transfer_assistant),
+ )
+ }
+ },
+ ) {
+ LazyColumn {
+ item {
+ TopSpace()
+ if (webEnabled) {
+ if (viewModel.httpServerError.value.isNotEmpty()) {
+ Alert(title = stringResource(id = R.string.error), description = viewModel.httpServerError.value, AlertType.ERROR) {
+ if (HttpServerManager.portsInUse.isNotEmpty()) {
MiniOutlineButton(
- text = stringResource(R.string.relaunch_app),
- modifier = Modifier.padding(start = 16.dp),
+ text = stringResource(R.string.change_port),
onClick = {
- AppHelper.relaunch(context)
+ scope.launch(Dispatchers.IO) {
+ if (HttpServerManager.portsInUse.contains(TempData.httpPort)) {
+ HttpPortPreference.putAsync(context, HttpServerManager.httpPorts.filter { it != TempData.httpPort }.random())
+ }
+ if (HttpServerManager.portsInUse.contains(TempData.httpsPort)) {
+ HttpsPortPreference.putAsync(context, HttpServerManager.httpsPorts.filter { it != TempData.httpsPort }.random())
+ }
+ coMain {
+ MaterialAlertDialogBuilder(context)
+ .setTitle(R.string.restart_app_title)
+ .setMessage(R.string.restart_app_message)
+ .setPositiveButton(R.string.relaunch_app) { _, _ ->
+ AppHelper.relaunch(context)
+ }
+ .setCancelable(false)
+ .create()
+ .show()
+ }
+ }
},
)
}
- } else {
- if (isVPNConnected) {
- Alert(title = stringResource(id = R.string.warning), description = stringResource(id = R.string.vpn_web_conflict_warning), AlertType.WARNING)
- }
- if (!systemAlertWindow) {
- Alert(title = stringResource(id = R.string.warning), description = stringResource(id = R.string.system_alert_window_warning), AlertType.WARNING) {
- MiniOutlineButton(
- text = stringResource(R.string.grant_permission),
- onClick = {
- sendEvent(RequestPermissionsEvent(Permission.SYSTEM_ALERT_WINDOW))
- },
- )
- }
+ MiniOutlineButton(
+ text = stringResource(R.string.relaunch_app),
+ modifier = Modifier.padding(start = 16.dp),
+ onClick = {
+ AppHelper.relaunch(context)
+ },
+ )
+ }
+ } else {
+ if (isVPNConnected) {
+ Alert(title = stringResource(id = R.string.attention), description = stringResource(id = R.string.vpn_web_conflict_warning), AlertType.WARNING)
+ }
+ if (!systemAlertWindow) {
+ Alert(title = stringResource(id = R.string.attention), description = stringResource(id = R.string.system_alert_window_warning), AlertType.WARNING) {
+ MiniOutlineButton(
+ text = stringResource(R.string.grant_permission),
+ onClick = {
+ sendEvent(RequestPermissionsEvent(Permission.SYSTEM_ALERT_WINDOW))
+ },
+ )
}
}
}
}
- item {
- HomeWeb(context, navController, viewModel, webEnabled)
- VerticalSpace(dp = 16.dp)
- }
- item {
- HomeFeatures(navController, itemWidth)
- }
- item {
- BottomSpace()
- }
+ }
+ item {
+ HomeWeb(context, navController, viewModel, webEnabled)
+ VerticalSpace(dp = 16.dp)
+ }
+ item {
+ HomeFeatures(navController, itemWidth)
+ }
+ item {
+ BottomSpace()
}
}
}
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/page/Main.kt b/app/src/main/java/com/ismartcoding/plain/ui/page/Main.kt
index 3c672fbd..d2136eb8 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/page/Main.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/page/Main.kt
@@ -48,6 +48,7 @@ import com.ismartcoding.plain.ui.models.MainViewModel
import com.ismartcoding.plain.ui.models.SharedViewModel
import com.ismartcoding.plain.ui.page.apps.AppPage
import com.ismartcoding.plain.ui.page.apps.AppsPage
+import com.ismartcoding.plain.ui.page.apps.AppsSearchPage
import com.ismartcoding.plain.ui.page.scan.ScanHistoryPage
import com.ismartcoding.plain.ui.page.scan.ScanPage
import com.ismartcoding.plain.ui.page.settings.AboutPage
@@ -68,6 +69,7 @@ import com.ismartcoding.plain.ui.page.web.WebSecurityPage
import com.ismartcoding.plain.ui.preview.PreviewDialog
import com.ismartcoding.plain.ui.preview.PreviewItem
import com.ismartcoding.plain.ui.theme.AppTheme
+import com.ismartcoding.plain.ui.theme.PlainTheme
import com.ismartcoding.plain.ui.theme.canvas
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
@@ -174,6 +176,13 @@ fun Main(viewModel: MainViewModel) {
}
}
+ slideHorizontallyComposable(
+ "${RouteName.APPS.name}/search?q={q}",
+ arguments = listOf(navArgument("q") { type = NavType.StringType }),
+ ) {
+ AppsSearchPage(navController)
+ }
+
slideHorizontallyComposable(
"${RouteName.APPS.name}/{id}",
arguments = listOf(navArgument("id") { type = NavType.StringType }),
@@ -209,25 +218,25 @@ fun NavGraphBuilder.slideHorizontallyComposable(
enterTransition = {
slideIntoContainer(
towards = AnimatedContentTransitionScope.SlideDirection.Companion.Left,
- animationSpec = tween(400),
+ animationSpec = tween(PlainTheme.ANIMATION_DURATION),
)
},
exitTransition = {
slideOutOfContainer(
towards = AnimatedContentTransitionScope.SlideDirection.Companion.Left,
- animationSpec = tween(400),
+ animationSpec = tween(PlainTheme.ANIMATION_DURATION),
)
},
popEnterTransition = {
slideIntoContainer(
towards = AnimatedContentTransitionScope.SlideDirection.Companion.Right,
- animationSpec = tween(400),
+ animationSpec = tween(PlainTheme.ANIMATION_DURATION),
)
},
popExitTransition = {
slideOutOfContainer(
towards = AnimatedContentTransitionScope.SlideDirection.Companion.Right,
- animationSpec = tween(400),
+ animationSpec = tween(PlainTheme.ANIMATION_DURATION),
)
},
) {
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/page/apps/AppPage.kt b/app/src/main/java/com/ismartcoding/plain/ui/page/apps/AppPage.kt
index 6550f27f..316bc8a3 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/page/apps/AppPage.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/page/apps/AppPage.kt
@@ -215,34 +215,42 @@ fun AppPage(
Subtitle(
text = stringResource(R.string.paths_directories),
)
- PListItem(
- title = stringResource(R.string.source_directory),
- desc = item?.appInfo?.sourceDir ?: "",
- )
- PListItem(
- title = stringResource(R.string.data_directory),
- desc = item?.appInfo?.dataDir ?: "",
- )
+
+ PCard {
+ PListItem(
+ title = stringResource(R.string.source_directory),
+ desc = item?.appInfo?.sourceDir ?: "",
+ )
+ PListItem(
+ title = stringResource(R.string.data_directory),
+ desc = item?.appInfo?.dataDir ?: "",
+ )
+ }
+
VerticalSpace(dp = 16.dp)
+
Subtitle(
text = stringResource(R.string.more_info),
)
- PListItem(
- title = stringResource(R.string.app_size),
- desc = FormatHelper.formatBytes(item?.size ?: 0),
- )
- PListItem(
- title = "SDK",
- desc = LocaleHelper.getStringF(R.string.sdk, "target", item?.appInfo?.targetSdkVersion ?: "", "min", item?.appInfo?.minSdkVersion ?: ""),
- )
- PListItem(
- title = stringResource(R.string.installed_at),
- desc = item?.installedAt?.formatDateTime(),
- )
- PListItem(
- title = stringResource(R.string.updated_at),
- desc = item?.updatedAt?.formatDateTime(),
- )
+
+ PCard {
+ PListItem(
+ title = stringResource(R.string.app_size),
+ desc = FormatHelper.formatBytes(item?.size ?: 0),
+ )
+ PListItem(
+ title = "SDK",
+ desc = LocaleHelper.getStringF(R.string.sdk, "target", item?.appInfo?.targetSdkVersion ?: "", "min", item?.appInfo?.minSdkVersion ?: ""),
+ )
+ PListItem(
+ title = stringResource(R.string.installed_at),
+ desc = item?.installedAt?.formatDateTime(),
+ )
+ PListItem(
+ title = stringResource(R.string.updated_at),
+ desc = item?.updatedAt?.formatDateTime(),
+ )
+ }
}
}
}
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/page/apps/AppsPage.kt b/app/src/main/java/com/ismartcoding/plain/ui/page/apps/AppsPage.kt
index f532351f..26d85d81 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/page/apps/AppsPage.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/page/apps/AppsPage.kt
@@ -1,27 +1,39 @@
package com.ismartcoding.plain.ui.page.apps
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.lazy.LazyColumn
-import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
+import com.ismartcoding.lib.helpers.CoroutinesHelper.withIO
import com.ismartcoding.plain.R
+import com.ismartcoding.plain.ui.base.ActionButtonSearch
import com.ismartcoding.plain.ui.base.NoDataColumn
import com.ismartcoding.plain.ui.base.PScaffold
+import com.ismartcoding.plain.ui.base.TopSpace
+import com.ismartcoding.plain.ui.base.pullrefresh.LoadMoreRefreshContent
+import com.ismartcoding.plain.ui.base.pullrefresh.PullToRefresh
import com.ismartcoding.plain.ui.base.pullrefresh.RefreshContentState
-import com.ismartcoding.plain.ui.base.pullrefresh.VerticalRefreshableLayout
import com.ismartcoding.plain.ui.base.pullrefresh.rememberRefreshLayoutState
import com.ismartcoding.plain.ui.components.PackageListItem
import com.ismartcoding.plain.ui.models.AppsViewModel
import com.ismartcoding.plain.ui.page.RouteName
+import com.ismartcoding.plain.ui.theme.PlainTheme
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -30,31 +42,38 @@ fun AppsPage(
viewModel: AppsViewModel = viewModel(),
) {
val itemsState by viewModel.itemsFlow.collectAsState()
+ val scope = rememberCoroutineScope()
val topRefreshLayoutState =
rememberRefreshLayoutState {
- viewModel.load()
- setRefreshState(RefreshContentState.Stop)
- }
-
- val bottomRefreshLayoutState =
- rememberRefreshLayoutState {
- viewModel.loadMore()
- setRefreshState(RefreshContentState.Stop)
+ scope.launch {
+ withIO { viewModel.loadAsync() }
+ setRefreshState(RefreshContentState.Stop)
+ }
}
LaunchedEffect(Unit) {
- viewModel.load()
+ scope.launch(Dispatchers.IO) {
+ viewModel.loadAsync()
+ }
}
PScaffold(
navController,
topBarTitle = stringResource(id = R.string.apps),
- content = {
- VerticalRefreshableLayout(
- topRefreshLayoutState = topRefreshLayoutState,
- bottomRefreshLayoutState = bottomRefreshLayoutState,
- bottomNoMore = viewModel.noMore.value
+ actions = {
+ ActionButtonSearch {
+ navController.navigate("${RouteName.APPS.name}/search?q=")
+ }
+ }
+ ) {
+ PullToRefresh(
+ refreshLayoutState = topRefreshLayoutState,
+ ) {
+ AnimatedVisibility(
+ visible = true,
+ enter = fadeIn(),
+ exit = fadeOut()
) {
if (itemsState.isNotEmpty()) {
LazyColumn(
@@ -62,21 +81,35 @@ fun AppsPage(
.fillMaxWidth()
.fillMaxHeight(),
) {
- items(itemsState) { m ->
+ item {
+ TopSpace()
+ }
+ itemsIndexed(itemsState) { index, m ->
PackageListItem(
item = m,
+ modifier = PlainTheme.getCardModifier(index = index, size = itemsState.size),
onClick = {
navController.navigate("${RouteName.APPS.name}/${m.id}")
}
)
}
+ item {
+ if (itemsState.isNotEmpty() && !viewModel.noMore.value) {
+ LaunchedEffect(Unit) {
+ scope.launch(Dispatchers.IO) {
+ withIO { viewModel.moreAsync() }
+ }
+ }
+ }
+ LoadMoreRefreshContent(viewModel.noMore.value)
+ }
}
} else {
NoDataColumn(loading = viewModel.showLoading.value)
}
}
- },
- )
+ }
+ }
}
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/page/apps/AppsSearchPage.kt b/app/src/main/java/com/ismartcoding/plain/ui/page/apps/AppsSearchPage.kt
new file mode 100644
index 00000000..1d10b852
--- /dev/null
+++ b/app/src/main/java/com/ismartcoding/plain/ui/page/apps/AppsSearchPage.kt
@@ -0,0 +1,180 @@
+package com.ismartcoding.plain.ui.page.apps
+
+import android.annotation.SuppressLint
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.itemsIndexed
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.rounded.ArrowBack
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.SearchBar
+import androidx.compose.material3.SearchBarDefaults
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.viewmodel.compose.viewModel
+import androidx.navigation.NavHostController
+import com.ismartcoding.lib.helpers.CoroutinesHelper.withIO
+import com.ismartcoding.plain.R
+import com.ismartcoding.plain.ui.base.BottomSpace
+import com.ismartcoding.plain.ui.base.NoDataColumn
+import com.ismartcoding.plain.ui.base.PIconButton
+import com.ismartcoding.plain.ui.base.TopSpace
+import com.ismartcoding.plain.ui.base.pullrefresh.LoadMoreRefreshContent
+import com.ismartcoding.plain.ui.base.pullrefresh.PullToRefresh
+import com.ismartcoding.plain.ui.base.pullrefresh.RefreshContentState
+import com.ismartcoding.plain.ui.base.pullrefresh.rememberRefreshLayoutState
+import com.ismartcoding.plain.ui.components.PackageListItem
+import com.ismartcoding.plain.ui.models.AppsViewModel
+import com.ismartcoding.plain.ui.page.RouteName
+import com.ismartcoding.plain.ui.theme.PlainTheme
+import com.ismartcoding.plain.ui.theme.canvas
+import com.ismartcoding.plain.ui.theme.cardBack
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
+@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun AppsSearchPage(
+ navController: NavHostController,
+ viewModel: AppsViewModel = viewModel(),
+) {
+ val itemsState by viewModel.itemsFlow.collectAsState()
+ val scope = rememberCoroutineScope()
+ var q by rememberSaveable { mutableStateOf(navController.currentBackStackEntry?.arguments?.getString("q") ?: "") }
+ var active by rememberSaveable {
+ mutableStateOf(true)
+ }
+ val topRefreshLayoutState =
+ rememberRefreshLayoutState {
+ scope.launch {
+ withIO { viewModel.loadAsync(q) }
+ setRefreshState(RefreshContentState.Stop)
+ }
+ }
+ val focusRequester = remember { FocusRequester() }
+ LaunchedEffect(Unit) {
+ if (active) {
+ focusRequester.requestFocus()
+ }
+ }
+
+ LaunchedEffect(q) {
+ if (q.isNotEmpty()) {
+ scope.launch(Dispatchers.IO) {
+ viewModel.loadAsync(q)
+ }
+ }
+ }
+
+ Column(
+ Modifier
+ .fillMaxSize()
+ .background(MaterialTheme.colorScheme.canvas()),
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ SearchBar(
+ modifier = Modifier
+ .focusRequester(focusRequester),
+ query = q,
+ onQueryChange = {
+ q = it
+ },
+ onSearch = {
+ if (q.isNotEmpty()) {
+ active = false
+ viewModel.showLoading.value = true
+ }
+ },
+ active = active,
+ onActiveChange = {
+ active = it
+ if (!active && q.isEmpty()) {
+ navController.popBackStack()
+ }
+ },
+ placeholder = { Text(stringResource(id = R.string.search)) },
+ leadingIcon = {
+ PIconButton(
+ imageVector = Icons.AutoMirrored.Rounded.ArrowBack,
+ contentDescription = stringResource(R.string.back),
+ tint = MaterialTheme.colorScheme.onSurface,
+ ) {
+ if (!active || q.isEmpty()) {
+ navController.popBackStack()
+ } else {
+ active = false
+ }
+ }
+ },
+ colors = SearchBarDefaults.colors(containerColor = MaterialTheme.colorScheme.cardBack()),
+ ) {
+ }
+ TopSpace()
+ PullToRefresh(
+ refreshLayoutState = topRefreshLayoutState,
+ ) {
+ AnimatedVisibility(
+ visible = true,
+ enter = fadeIn(),
+ exit = fadeOut()
+ ) {
+ if (itemsState.isNotEmpty()) {
+ LazyColumn(
+ Modifier
+ .fillMaxWidth()
+ .fillMaxHeight(),
+ ) {
+ item {
+ TopSpace()
+ }
+ itemsIndexed(itemsState) { index, m ->
+ PackageListItem(
+ item = m,
+ modifier = PlainTheme.getCardModifier(index = index, size = itemsState.size),
+ onClick = {
+ navController.navigate("${RouteName.APPS.name}/${m.id}")
+ }
+ )
+ }
+ item {
+ if (itemsState.isNotEmpty() && !viewModel.noMore.value) {
+ LaunchedEffect(Unit) {
+ scope.launch(Dispatchers.IO) {
+ withIO { viewModel.moreAsync() }
+ }
+ }
+ }
+ LoadMoreRefreshContent(viewModel.noMore.value)
+ BottomSpace()
+ }
+ }
+ } else {
+ NoDataColumn(loading = viewModel.showLoading.value, search = true)
+ }
+ }
+ }
+ }
+}
+
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/page/web/WebLearnMorePage.kt b/app/src/main/java/com/ismartcoding/plain/ui/page/web/WebLearnMorePage.kt
index 0cf8d137..74b88da6 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/page/web/WebLearnMorePage.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/page/web/WebLearnMorePage.kt
@@ -40,6 +40,17 @@ fun WebLearnMorePage(navController: NavHostController) {
}
VerticalSpace(dp = 16.dp)
}
+ item{
+ Subtitle(text = stringResource(id = R.string.recommendation))
+ PCard {
+ Text(
+ stringResource(id = R.string.usb_connect_recommendation),
+ modifier = Modifier.padding(16.dp),
+ style = MaterialTheme.typography.bodyLarge,
+ )
+ }
+ VerticalSpace(dp = 16.dp)
+ }
item {
Subtitle(text = stringResource(id = R.string.troubleshoot))
PCard {
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/page/web/WebSettingsPage.kt b/app/src/main/java/com/ismartcoding/plain/ui/page/web/WebSettingsPage.kt
index a1ad0a89..8522869c 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/page/web/WebSettingsPage.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/page/web/WebSettingsPage.kt
@@ -24,7 +24,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
-import androidx.lifecycle.Lifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
import com.google.android.material.dialog.MaterialAlertDialogBuilder
@@ -42,6 +41,7 @@ import com.ismartcoding.plain.data.preference.ApiPermissionsPreference
import com.ismartcoding.plain.data.preference.HttpPortPreference
import com.ismartcoding.plain.data.preference.HttpsPortPreference
import com.ismartcoding.plain.data.preference.LocalApiPermissions
+import com.ismartcoding.plain.data.preference.LocalKeepAwake
import com.ismartcoding.plain.data.preference.LocalWeb
import com.ismartcoding.plain.data.preference.WebSettingsProvider
import com.ismartcoding.plain.features.IgnoreBatteryOptimizationResultEvent
@@ -49,6 +49,7 @@ import com.ismartcoding.plain.features.Permission
import com.ismartcoding.plain.features.Permissions
import com.ismartcoding.plain.features.PermissionsResultEvent
import com.ismartcoding.plain.features.RequestPermissionsEvent
+import com.ismartcoding.plain.features.WindowFocusChangedEvent
import com.ismartcoding.plain.helpers.AppHelper
import com.ismartcoding.plain.packageManager
import com.ismartcoding.plain.powerManager
@@ -65,9 +66,9 @@ import com.ismartcoding.plain.ui.base.PMainSwitch
import com.ismartcoding.plain.ui.base.PScaffold
import com.ismartcoding.plain.ui.base.PSwitch
import com.ismartcoding.plain.ui.base.Subtitle
+import com.ismartcoding.plain.ui.base.Tips
import com.ismartcoding.plain.ui.base.TopSpace
import com.ismartcoding.plain.ui.base.VerticalSpace
-import com.ismartcoding.plain.ui.base.rememberLifecycleEvent
import com.ismartcoding.plain.ui.components.WebAddress
import com.ismartcoding.plain.ui.extensions.navigate
import com.ismartcoding.plain.ui.helpers.DialogHelper
@@ -92,11 +93,12 @@ fun WebSettingsPage(
WebSettingsProvider {
val context = LocalContext.current
val webConsole = LocalWeb.current
+ val keepAwake = LocalKeepAwake.current
val scope = rememberCoroutineScope()
var isMenuOpen by remember { mutableStateOf(false) }
val enabledPermissions = LocalApiPermissions.current
var permissionList by remember { mutableStateOf(Permissions.getWebList(context)) }
- var showIgnoreOptimizeWarning by remember { mutableStateOf(!powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)) }
+ var shouldIgnoreOptimize by remember { mutableStateOf(!powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)) }
var systemAlertWindow by remember { mutableStateOf(Permission.SYSTEM_ALERT_WINDOW.can(context)) }
var isVPNConnected by remember { mutableStateOf(NetworkHelper.isVPNConnected(context)) }
val events by remember { mutableStateOf>(arrayListOf()) }
@@ -104,14 +106,6 @@ fun WebSettingsPage(
val learnMore = stringResource(id = R.string.learn_more)
val fullText = (stringResource(id = R.string.web_console_desc) + " " + learnMore)
- val lifecycleEvent = rememberLifecycleEvent()
- LaunchedEffect(lifecycleEvent) {
- if (lifecycleEvent == Lifecycle.Event.ON_RESUME) {
- showIgnoreOptimizeWarning = !powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)
- isVPNConnected = NetworkHelper.isVPNConnected(context)
- }
- }
-
LaunchedEffect(Unit) {
events.add(
receiveEventHandler {
@@ -120,6 +114,13 @@ fun WebSettingsPage(
}
)
+ events.add(
+ receiveEventHandler {
+ shouldIgnoreOptimize = !powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)
+ isVPNConnected = NetworkHelper.isVPNConnected(context)
+ }
+ )
+
events.add(
receiveEventHandler {
permissionList = Permissions.getWebList(context)
@@ -131,7 +132,7 @@ fun WebSettingsPage(
DialogHelper.showLoading()
delay(1000) // MIUI 12 test 1 second to get the final correct result.
DialogHelper.hideLoading()
- showIgnoreOptimizeWarning = !powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)
+ shouldIgnoreOptimize = !powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID)
}
})
}
@@ -215,10 +216,10 @@ fun WebSettingsPage(
}
} else {
if (isVPNConnected) {
- Alert(title = stringResource(id = R.string.warning), description = stringResource(id = R.string.vpn_web_conflict_warning), AlertType.WARNING)
+ Alert(title = stringResource(id = R.string.attention), description = stringResource(id = R.string.vpn_web_conflict_warning), AlertType.WARNING)
}
if (!systemAlertWindow) {
- Alert(title = stringResource(id = R.string.warning), description = stringResource(id = R.string.system_alert_window_warning), AlertType.WARNING) {
+ Alert(title = stringResource(id = R.string.attention), description = stringResource(id = R.string.system_alert_window_warning), AlertType.WARNING) {
MiniOutlineButton(
text = stringResource(R.string.grant_permission),
onClick = {
@@ -227,16 +228,6 @@ fun WebSettingsPage(
)
}
}
-// if (showIgnoreOptimizeWarning) {
-// Alert(title = stringResource(id = R.string.warning), description = stringResource(id = R.string.optimized_batter_usage_warning), AlertType.WARNING) {
-// MiniOutlineButton(
-// text = stringResource(R.string.fix),
-// onClick = {
-// viewModel.requestIgnoreBatteryOptimization()
-// },
-// )
-// }
-// }
}
}
PClickableText(
@@ -248,7 +239,7 @@ fun WebSettingsPage(
),
modifier = Modifier
.fillMaxWidth()
- .padding(start = 16.dp, end = 16.dp, bottom = 16.dp),
+ .padding(start = 24.dp, end = 24.dp, bottom = 16.dp),
style = MaterialTheme.typography.bodyLarge.copy(color = MaterialTheme.colorScheme.onSurfaceVariant),
)
}
@@ -323,15 +314,13 @@ fun WebSettingsPage(
}
},
) {
- if (permission != Permission.SYSTEM_ALERT_WINDOW) {
- PSwitch(activated = enabledPermissions.contains(permission.name)) { enable ->
- scope.launch {
- withIO { ApiPermissionsPreference.putAsync(context, permission, enable) }
- if (enable) {
- val ps = m.permissions.filter { !it.can(context) }
- if (ps.isNotEmpty()) {
- sendEvent(RequestPermissionsEvent(*ps.toTypedArray()))
- }
+ PSwitch(activated = enabledPermissions.contains(permission.name)) { enable ->
+ scope.launch {
+ withIO { ApiPermissionsPreference.putAsync(context, permission, enable) }
+ if (enable) {
+ val ps = m.permissions.filter { !it.can(context) }
+ if (ps.isNotEmpty()) {
+ sendEvent(RequestPermissionsEvent(*ps.toTypedArray()))
}
}
}
@@ -339,6 +328,36 @@ fun WebSettingsPage(
}
}
}
+ item {
+ VerticalSpace(dp = 16.dp)
+ Subtitle(
+ text = stringResource(id = R.string.performance),
+ )
+ PCard {
+ PListItem(title = stringResource(id = R.string.keep_awake), onClick = {
+ viewModel.enableKeepAwake(context, !keepAwake)
+ }) {
+ PSwitch(activated = keepAwake) { enable ->
+ viewModel.enableKeepAwake(context, enable)
+ }
+ }
+ }
+ Tips(stringResource(id = R.string.keep_awake_tips))
+ VerticalSpace(dp = 16.dp)
+ PCard {
+ PListItem(title = stringResource(id = if (shouldIgnoreOptimize) R.string.disable_battery_optimization else R.string.battery_optimization_disabled),
+ showMore = true,
+ onClick = {
+ if (shouldIgnoreOptimize) {
+ viewModel.requestIgnoreBatteryOptimization()
+ } else {
+ val intent = Intent()
+ intent.action = Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
+ context.startActivity(intent)
+ }
+ })
+ }
+ }
item {
BottomSpace()
}
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/preview/PreviewDialog.kt b/app/src/main/java/com/ismartcoding/plain/ui/preview/PreviewDialog.kt
index de342d51..929ece76 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/preview/PreviewDialog.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/preview/PreviewDialog.kt
@@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import com.ismartcoding.lib.channel.receiveEvent
import com.ismartcoding.lib.extensions.fullScreen
+import com.ismartcoding.lib.helpers.CoroutinesHelper.coMain
import com.ismartcoding.plain.R
import com.ismartcoding.plain.databinding.DialogPreviewBinding
import com.ismartcoding.plain.ui.CastDialog
@@ -86,8 +87,9 @@ class PreviewDialog : DialogFragment() {
val pagingData = PagingData.from(list)
adapter.submitData(lifecycle, pagingData)
- binding.viewer.setCurrentItem(list.indexOfFirst { it.id == initKey }, false)
-
+ coMain {
+ binding.viewer.setCurrentItem(list.indexOfFirst { it.id == initKey }, false)
+ }
viewModel.viewerUserInputEnabled.observe(viewLifecycleOwner) {
binding.viewer.isUserInputEnabled = it ?: true
}
diff --git a/app/src/main/java/com/ismartcoding/plain/ui/theme/PlainTheme.kt b/app/src/main/java/com/ismartcoding/plain/ui/theme/PlainTheme.kt
index 4815c076..a0cdaf69 100644
--- a/app/src/main/java/com/ismartcoding/plain/ui/theme/PlainTheme.kt
+++ b/app/src/main/java/com/ismartcoding/plain/ui/theme/PlainTheme.kt
@@ -15,6 +15,8 @@ object PlainTheme {
val PAGE_HORIZONTAL_MARGIN = 16.dp
val PAGE_TOP_MARGIN = 8.dp
val CARD_CORNER = 16.dp
+ val APP_BAR_HEIGHT = 64.dp
+ const val ANIMATION_DURATION = 350
@Composable
fun getCardModifier(index: Int, size: Int): Modifier {
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index fef07fc6..aac6d664 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -2,6 +2,16 @@
PlainAppআপনার ডিভাইসে সক্রিয় ভিপিএন আছে, যা একটি পিসি থেকে অ্যাক্সেস করার সময় ওয়েব সংযোগের সমস্যা উত্পন্ন করতে পারে। এটি সমাধান করতে, আমরা আপনাকে আপনার ভিপিএন সেটিংস পরিবর্তন করে এলএএন ট্র্যাফিক অনুমতি দেওয়া বা আপনার ভিপিএন নিষ্ক্রিয় করতে প্রস্তাবনা দিচ্ছি।সতর্কবার্তা
+ কোনো ফলাফল পাওয়া যায়নি
+ অনুসন্ধান
+ মনোযোগ
+ সুপারিশ
+ ইউএসবি চার্জিং কেবল সংযোগ করা নিশ্চিত করে যে ফোনটি জাগ্রত থাকে, অতএব যে কোনও আইনতন বা ব্যবহারের সিস্টেম দ্বারা এর কার্য সীমাবদ্ধ না হওয়ার জন্য।
+ কার্যক্ষমতা
+ ব্যাটারি অপ্টিমাইজেশন নিষ্ক্রিয় করুন
+ ব্যাটারি অপ্টিমাইজেশন নিষ্ক্রিয় করা হয়েছে
+ জাগরিত রাখুন
+ ডিফল্টভাবে, ইউএসবি চার্জিং সংযোগ করা হলে, ফোনটি জাগ্রত থাকে। এই অপশনটি চালু করা ফোনটি ইউএসবি চার্জিং সংযোগ না থাকলেও জাগ্রত রাখে, যাতে ব্যাটারি ব্যবহার বৃদ্ধি করা হতে পারে।প্রায় সমাপ্ত! ওয়েব মাধ্যমে সহজেই ফোন ফাইলগুলি ব্যবস্থাপনা করতে আপনার স্টোরেজ অনুমতি সক্রিয় করুন।ব্যবহারের নির্দেশধাপ ১: আপনার ফোন এবং কম্পিউটারকে একই ওয়াইফাই নেটওয়ার্কে সংযুক্ত করুন।\n\nপদ্ধতি ১: আপনার কম্পিউটার এবং ফোনকে একই ওয়াইফাই নেটওয়ার্কে সংযুক্ত করুন।\nপদ্ধতি ২: আপনার ফোনের হটস্পট চালু করুন এবং কম্পিউটারকে ফোনের হটস্পটে সংযুক্ত করুন।\n\nধাপ ২: আপনার কম্পিউটারে একটি ওয়েব ব্রাউজার খুলুন এবং এপিপি হোমপেজে প্রদর্শিত ওয়েব ঠিকানাটি লিখুন।
@@ -51,7 +61,7 @@
সার্ভার চালু হয়েছেHTTP সার্ভার চালানো হয়নি। PlainApp পুনরায় চালিয়ে দেখুন এবং আবার চেষ্টা করুন। HTTP বা HTTPS পোর্ট দখল করা অন্য কোন অ্যাপস নেই সেটা নিশ্চিত করুন। সমস্যা অবিরত থাকলে, দয়া করে আইসমার্টকোডিং@gmail.com এ যোগাযোগ করে সমস্যার বিশদ বিবরণ সরবরাহ করুন।পুনরায় চালু করুন
- শেষ
+ আরও ডেটা নেইতালিকা খালিএকটি বাক্স নির্বাচন করুনবাক্স যোগ করুন
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 3e71dc31..a909b44a 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -2,6 +2,16 @@
PlainAppIhr VPN ist derzeit auf Ihrem Gerät aktiviert, was potenziell zu Webverbindungsproblemen führen kann, wenn es von Ihrem PC aus zugegriffen wird. Um dies zu lösen, empfehlen wir Ihnen, Ihre VPN-Einstellungen anzupassen, um LAN-Verkehr zuzulassen oder Ihr VPN zu deaktivieren.Warnung
+ Keine Ergebnisse gefunden
+ Suche
+ Achtung
+ Empfehlung
+ Das Anschließen des USB-Ladekabels stellt sicher, dass das Telefon wach bleibt und somit eine Unterbrechung oder Einschränkung seiner Funktionen durch das System vermieden wird.
+ Leistung
+ Akkuoptimierung deaktivieren
+ Akkuoptimierung ist deaktiviert
+ Wach halten
+ Standardmäßig bleibt das Telefon wach, wenn es an das USB-Ladegerät angeschlossen ist. Durch Aktivieren dieser Option bleibt das Telefon auch dann wach, wenn es nicht an das USB-Ladegerät angeschlossen ist, was möglicherweise zu erhöhtem Batterieverbrauch führt.Fast geschafft! Bitte aktivieren Sie die Speicherberechtigung, um Ihre Telefondateien über das Web einfach verwalten zu können.GebrauchsanweisungSchritt 1: Verbinden Sie Ihr Telefon und Ihren Computer mit demselben drahtlosen Netzwerk.\n\nMethode 1: Verbinden Sie Ihren Computer und Ihr Telefon mit demselben WLAN-Netzwerk.\nMethode 2: Schalten Sie den Hotspot Ihres Telefons ein und verbinden Sie Ihren Computer mit dem Hotspot Ihres Telefons.\n\nSchritt 2: Öffnen Sie einen Webbrowser auf Ihrem Computer und geben Sie die auf der APP-Startseite angezeigte Webadresse ein.
@@ -51,7 +61,7 @@
HTTP-Server läuftDer HTTP-Server ist nicht gestartet. Starten Sie die PlainApp erneut und versuchen Sie es erneut. Stellen Sie sicher, dass keine anderen Apps die HTTP- oder HTTPS-Ports belegen. Wenn das Problem weiterhin besteht, geben Sie bitte weitere Details zum Problem an, indem Sie ismartcoding@gmail.com kontaktieren.App neu starten
- Ende
+ Keine weiteren DatenListe ist leerWähle eine BoxBox hinzufügen
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 9e2d5dd7..886f309e 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -2,6 +2,16 @@
PlainAppSu VPN está actualmente habilitado en su dispositivo, lo que podría provocar problemas de conexión web cuando se accede desde su PC. Para resolver esto, le recomendamos ajustar la configuración de su VPN para permitir el tráfico de LAN o desactivar su VPN.Advertencia
+ No se encontraron resultados
+ Buscar
+ Atención
+ Recomendación
+ Conectar el cable de carga USB asegura que el teléfono permanezca despierto, evitando así cualquier interceptación o restricción de sus funciones por parte del sistema.
+ Rendimiento
+ Desactivar optimización de batería
+ La optimización de batería está desactivada
+ Mantener despierto
+ Por defecto, cuando está conectado a la carga USB, el teléfono permanece despierto. Habilitar esta opción mantiene el teléfono despierto incluso cuando no está conectado a la carga USB, lo que puede resultar en un aumento del consumo de batería.¡Casi terminamos! Por favor, habilite el permiso de almacenamiento para poder gestionar fácilmente sus archivos telefónicos a través de la web.Instrucciones de usoPaso 1: Conecta tu teléfono y tu computadora a la misma red inalámbrica.\n\nMétodo 1: Conecta tu computadora y tu teléfono a la misma red Wi-Fi.\nMétodo 2: Activa el hotspot de tu teléfono y conecta tu computadora al hotspot del teléfono.\n\nPaso 2: Abre un navegador web en tu computadora e ingresa la dirección web que se muestra en la página de inicio de la aplicación.
@@ -51,7 +61,7 @@
Servidor HTTP iniciadoEl servidor HTTP no está iniciado. Vuelve a abrir PlainApp e inténtalo de nuevo. Asegúrate de que no haya otras aplicaciones ocupando los puertos HTTP o HTTPS. Si el problema persiste, proporciona más detalles sobre el problema contactando a ismartcoding@gmail.com.Vuelve a abrir PlainApp
- Fin
+ No hay más datosLa lista está vacíaSeleccionar una cajaAñadir caja
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 3fb3aa9c..8b515748 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -2,6 +2,16 @@
PlainAppVotre VPN est actuellement activé sur votre appareil, ce qui pourrait potentiellement entraîner des problèmes de connexion Web lorsqu\'il est accédé depuis un PC. Pour résoudre cela, nous vous recommandons d\'ajuster les paramètres de votre VPN pour autoriser le trafic LAN ou de désactiver votre VPN.Avertissement
+ Aucun résultat trouvé
+ Rechercher
+ Attention
+ Recommandation
+ Connecter le câble de chargement USB assure que le téléphone reste éveillé, évitant ainsi toute interception ou restriction de ses fonctions par le système.
+ Performance
+ Désactiver l\'optimisation de la batterie
+ L\'optimisation de la batterie est désactivée
+ Garder éveillé
+ Par défaut, lorsque connecté au chargement USB, le téléphone reste éveillé. Activer cette option maintient le téléphone éveillé même lorsqu\'il n\'est pas connecté au chargement USB, ce qui peut entraîner une augmentation de la consommation de batterie.Presque terminé ! Veuillez autoriser l\'accès au stockage pour gérer facilement vos fichiers téléphoniques via le web.Instructions d\'utilisationÉtape 1 : Connectez votre téléphone et votre ordinateur au même réseau sans fil.\n\nMéthode 1 : Connectez votre ordinateur et votre téléphone au même réseau Wi-Fi.\nMéthode 2 : Activez le point d\'accès de votre téléphone et connectez votre ordinateur au point d\'accès de votre téléphone.\n\nÉtape 2 : Ouvrez un navigateur web sur votre ordinateur et saisissez l\'adresse web affichée sur la page d\'accueil de l\'application.
@@ -51,7 +61,7 @@
Servidor HTTP iniciadoLe serveur HTTP n\'est pas démarré. Relancez PlainApp et réessayez. Assurez-vous qu\'aucune autre application n\'occupe les ports HTTP ou HTTPS. Si le problème persiste, veuillez fournir plus de détails sur le problème en contactant ismartcoding@gmail.com.Relancer l\'application
- Fin
+ Pas plus de donnéesLa liste est videSélectionner une boîteAjouter une boîte
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index 8d9d0669..bcb2341d 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -2,6 +2,16 @@
PlainAppआपके डिवाइस पर वर्तमान में आपका VPN सक्रिय है, जिससे PC से एक्सेस करते समay वेब कनेक्शन समस्याएँ उत्पन्न हो सकती हैं। इसे हल करने के लिए, हम सुझाव देते हैं कि आप अपने VPN सेटिंग्स को LAN ट्रैफ़िक की अनुमति देने या अपने VPN को अक्षम करने के लिए समायोजित करें।चेतावनी
+ कोई परिणाम नहीं मिला
+ खोजें
+ ध्यान
+ सिफारिश
+ USB चार्जिंग केबल कनेक्ट करने से यह सुनिश्चित होता है कि फोन जागरूक रहता है, जिससे किसी भी प्रणाली द्वारा इसके कार्यों को अवरोधित या सीमित किया नहीं जा सकता।
+ प्रदर्शन
+ बैटरी अनुकूलन निष्क्रिय करें
+ बैटरी अनुकूलन निष्क्रिय किया गया है
+ जागरूक रखें
+ डिफ़ॉल्ट रूप से, जब USB चार्जिंग से कनेक्ट किया जाता है, तो फोन जागरूक रहता है। इस विकल्प को सक्षम करने से फोन जागरूक रहता है, यहाँ तक कि USB चार्जिंग से कनेक्ट न होने पर भी, बैटरी की अधिक खपत के संभावित होने की संभावना है।अब बस एक कदम दूरी पर है! वेब के माध्यम से अपने फ़ोन फ़ाइलों को आसानी से प्रबंधित करने के लिए कृपया स्टोरेज अनुमति सक्षम करें।उपयोग के निर्देशचरण 1: अपने फोन और कंप्यूटर को समान वायरलेस नेटवर्क से जोड़ें।\n\nविधि 1: अपने कंप्यूटर और फोन को समान वाई-फाई नेटवर्क से जोड़ें।\nविधि 2: अपने फोन का हॉटस्पॉट चालू करें और कंप्यूटर को फोन के हॉटस्पॉट से जोड़ें।\n\nचरण 2: अपने कंप्यूटर पर एक वेब ब्राउज़र खोलें और एपीपी होमपेज पर प्रदर्शित वेब पता दर्ज करें।
@@ -51,7 +61,7 @@
एचटीटीपी सर्वर शुरू हो गया हैHTTP सर्वर शुरू नहीं हुआ है। PlainApp को फिर से चालने का प्रयास करें और पुन: प्रयास करें। सुनिश्चित करें कि HTTP या HTTPS पोर्ट पर कोई अन्य एप्लिकेशन नहीं है। यदि समस्या बरकरार रहती है, तो कृपया ismartcoding@gmail.com पर समस्या के बारे में अधिक विवरण प्रदान करें।ऐप फिर से चालू करें
- समाप्त
+ कोई और डेटा नहींसूची खाली हैएक बॉक्स चुनेंबॉक्स जोड़ें
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 17aa08ac..c3525c2a 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -2,6 +2,16 @@
PlainAppAttualmente, il tuo VPN è attivo sul tuo dispositivo, il che potrebbe portare a problemi di connessione web quando si accede da un PC. Per risolvere questo problema, ti consigliamo di regolare le impostazioni del tuo VPN per consentire il traffico LAN o disattivare il tuo VPN.Attenzione
+ Nessun risultato trovato
+ Ricerca
+ Attenzione
+ Raccomandazione
+ Collegando il cavo di ricarica USB ci si assicura che il telefono rimanga attivo, evitando così qualsiasi intercettazione o restrizione delle sue funzioni da parte del sistema.
+ Prestazioni
+ Disattiva ottimizzazione batteria
+ L\'ottimizzazione della batteria è disattivata
+ Mantieni sveglio
+ Per impostazione predefinita, quando collegato alla ricarica USB, il telefono rimane attivo. Abilitando questa opzione il telefono rimane attivo anche quando non è collegato alla ricarica USB, potenzialmente aumentando il consumo della batteria.Quasi fatto! Si prega di abilitare l\'autorizzazione di archiviazione per gestire facilmente i file del telefono tramite il web.Istruzioni per l\'usoPassaggio 1: Collega il tuo telefono e il tuo computer alla stessa rete wireless.\n\nMetodo 1: Collega il tuo computer e il tuo telefono alla stessa rete Wi-Fi.\nMetodo 2: Attiva l\'hotspot del tuo telefono e collega il tuo computer all\'hotspot del telefono.\n\nPassaggio 2: Apri un browser web sul tuo computer e inserisci l\'indirizzo web visualizzato sulla homepage dell\'app.
@@ -51,7 +61,7 @@
Server HTTP avviatoIl server HTTP non è stato avviato. Riavvia PlainApp e riprova. Assicurati che non ci siano altre applicazioni che occupano le porte HTTP o HTTPS. Se il problema persiste, fornisci ulteriori dettagli sul problema contattando ismartcoding@gmail.com.Rilancia l\'app
- Fine
+ Nessun altro datoLa lista è vuotaSeleziona una boxAggiungi box
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index f63eb8e3..0da2fb31 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -2,6 +2,16 @@
PlainAppお使いのデバイスでは現在VPNが有効になっており、PCからアクセスした際にWeb接続の問題が発生する可能性があります。これを解決するために、LANトラフィックを許可するようにVPNの設定を調整するか、VPNを無効にすることをお勧めします。警告
+ 結果が見つかりませんでした
+ 検索
+ 注意
+ 推奨
+ USB充電ケーブルを接続することで、電話が起動し続けるため、システムによる機能の妨害や制限を回避します。
+ パフォーマンス
+ バッテリーの最適化を無効にする
+ バッテリーの最適化が無効になっています
+ 起きている
+ デフォルトでは、USB充電に接続されている場合、電話は起きています。このオプションを有効にすると、USB充電に接続されていない場合でも電話を起きたままにしておくことができ、バッテリー消費量が増加する可能性があります。もう少しで完了です!ウェブを介して簡単に携帯電話のファイルを管理するために、ストレージ許可を有効にしてください。使用説明書ステップ1:携帯電話とコンピューターを同じ無線ネットワークに接続します。\n\n方法1:コンピューターと携帯電話を同じWi-Fiネットワークに接続します。\n方法2:携帯電話のホットスポットをオンにして、コンピューターを携帯電話のホットスポットに接続します。\n\nステップ2:コンピューターでウェブブラウザーを開き、アプリのホームページに表示されるウェブアドレスを入力します。
@@ -51,7 +61,7 @@
HTTPサーバーが起動しましたHTTPサーバーが起動していません。PlainAppを再起動して、もう一度試してみてください。HTTPまたはHTTPSポートを占有している他のアプリケーションがないことを確認してください。問題が解決しない場合は、ismartcoding@gmail.com に連絡して問題の詳細を提供してください。アプリを再起動
- 終わり
+ データがありませんリストは空ですボックスを選択ボックスを追加
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 0b4e31cc..de600689 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -2,6 +2,16 @@
PlainApp현재 기기에서 VPN이 활성화되어 있어 PC에서 액세스할 때 웹 연결 문제가 발생할 수 있습니다. 이를 해결하기 위해 LAN 트래픽을 허용하거나 VPN을 비활성화하는 것을 권장합니다.경고
+ 결과가 없습니다
+ 검색
+ 주의
+ 추천
+ USB 충전 케이블을 연결하면 전화기가 계속해서 깨어 있게되어 시스템에 의한 기능의 차단이나 제한을 피할 수 있습니다.
+ 성능
+ 배터리 최적화 비활성화
+ 배터리 최적화가 비활성화되었습니다
+ 깨어 있게 유지
+ 기본적으로 USB 충전에 연결되어 있을 때 전화기가 계속해서 깨어 있습니다. 이 옵션을 활성화하면 USB 충전에 연결되어 있지 않을 때에도 전화기를 계속해서 깨어 있게 유지할 수 있으며, 배터리 소비량이 증가할 수 있습니다.거의 다 왔어요! 웹을 통해 휴대폰 파일을 쉽게 관리하려면 저장소 권한을 허용해주세요.사용 설명서단계 1: 핸드폰과 컴퓨터를 동일한 무선 네트워크에 연결합니다.\n\n방법 1: 컴퓨터와 핸드폰을 동일한 Wi-Fi 네트워크에 연결합니다.\n방법 2: 핸드폰의 핫스팟을 켜고 컴퓨터를 핸드폰의 핫스팟에 연결합니다.\n\n단계 2: 컴퓨터에서 웹 브라우저를 열고 앱 홈페이지에 표시된 웹 주소를 입력합니다.
@@ -51,7 +61,7 @@
Http 서버가 정상적으로 실행 중입니다.Http 서버가 시작되지 않았습니다. PlainApp을 다시 시작하고 다시 시도하십시오. HTTP 또는 HTTPS 포트를 다른 앱이 차지하고 있지 않은지 확인하십시오. 문제가 지속되면 ismartcoding@gmail.com으로 문제에 대한 자세한 내용을 제공해 주십시오.앱 다시 시작
- 끝
+ 더 이상 데이터 없음목록이 비어 있습니다상자 선택상자 추가
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 234b02f9..327fe6e2 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -2,6 +2,16 @@
PlainAppUw VPN is momenteel ingeschakeld op uw apparaat, wat mogelijk kan leiden tot webverbinding problemen bij toegang vanaf uw pc. Om dit op te lossen, raden we aan om uw VPN-instellingen aan te passen om LAN-verkeer toe te staan of uw VPN uit te schakelen.Waarschuwing
+ Geen resultaten gevonden
+ Zoeken
+ Aandacht
+ Aanbeveling
+ Door de USB-oplaadkabel aan te sluiten, blijft de telefoon wakker, waardoor eventuele onderschepping of beperking van de functies door het systeem wordt vermeden.
+ Prestatie
+ Batterijoptimalisatie uitschakelen
+ Batterijoptimalisatie is uitgeschakeld
+ Wakker houden
+ Standaard blijft de telefoon wakker wanneer deze is aangesloten op USB-opladen. Door deze optie in te schakelen, blijft de telefoon wakker, zelfs wanneer deze niet is aangesloten op USB-opladen, wat mogelijk resulteert in een verhoogd batterijverbruik.Bijna klaar! Schakel alstublieft de opslagtoestemming in om uw telefoonbestanden eenvoudig via het web te beheren.GebruiksaanwijzingStap 1: Sluit uw telefoon en computer aan op hetzelfde draadloze netwerk.\n\nMethode 1: Sluit uw computer en telefoon aan op hetzelfde Wi-Fi-netwerk.\nMethode 2: Schakel de hotspot van uw telefoon in en sluit uw computer aan op de hotspot van de telefoon.\n\nStap 2: Open een webbrowser op uw computer en voer het webadres in dat wordt weergegeven op de startpagina van de app.
@@ -51,7 +61,7 @@
HTTP-server is gestartDe HTTP-server is niet gestart. Start PlainApp opnieuw en probeer het opnieuw. Zorg ervoor dat er geen andere apps zijn die de HTTP- of HTTPS-poorten bezetten. Als het probleem aanhoudt, geef dan meer details over het probleem door contact op te nemen met ismartcoding@gmail.com.App opnieuw starten
- Einde
+ Geen verdere gegevensLijst is leegSelecteer een boxVoeg box toe
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 1f2b2bf8..ac50209a 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -2,6 +2,16 @@
PlainAppO seu VPN está atualmente ativado no seu dispositivo, o que pode potencialmente levar a problemas de conexão web quando acessado a partir do PC. Para resolver isso, recomendamos ajustar as configurações do seu VPN para permitir o tráfego de LAN ou desativar o seu VPN.Aviso
+ Nenhum resultado encontrado
+ Pesquisar
+ Atenção
+ Recomendação
+ Conectar o cabo de carregamento USB garante que o telefone permaneça acordado, evitando assim qualquer interceptação ou restrição de suas funções pelo sistema.
+ Desempenho
+ Desativar otimização da bateria
+ A otimização da bateria está desativada
+ Manter acordado
+ Por padrão, quando conectado ao carregamento USB, o telefone permanece acordado. Habilitar esta opção mantém o telefone acordado mesmo quando não conectado ao carregamento USB, potencialmente resultando em aumento do consumo da bateria.Quase lá! Por favor, habilite a permissão de armazenamento para gerenciar facilmente seus arquivos de telefone através da web.Instruções de usoPasso 1: Conecte o seu telefone e computador à mesma rede sem fio.\n\nMétodo 1: Conecte o seu computador e telefone à mesma rede Wi-Fi.\nMétodo 2: Ative o hotspot do seu telefone e conecte o seu computador ao hotspot do telefone.\n\nPasso 2: Abra um navegador da web no seu computador e insira o endereço da web exibido na página inicial do aplicativo.
@@ -51,7 +61,7 @@
Servidor HTTP iniciadoO servidor HTTP não está iniciado. Reinicie o PlainApp e tente novamente. Certifique-se de que não existem outras aplicações a ocupar as portas HTTP ou HTTPS. Se o problema persistir, forneça mais detalhes sobre o problema ao contactar ismartcoding@gmail.com.Reiniciar aplicativo
- Fim
+ Sem mais dadosLista vaziaSelecione uma caixaAdicionar caixa
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 151844c2..b5c9fdca 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -2,6 +2,16 @@
PlainAppВаш VPN в настоящее время включен на вашем устройстве, что может потенциально привести к проблемам с веб-подключением при доступе с ПК. Для устранения этой проблемы мы рекомендуем настроить параметры вашего VPN для разрешения локального сетевого трафика или отключить ваш VPN.Предупреждение
+ Результатов не найдено
+ Поиск
+ Внимание
+ Рекомендация
+ Подключение USB-кабеля для зарядки гарантирует, что телефон остается активным, тем самым избегая любого перехвата или ограничения его функций системой.
+ Производительность
+ Отключить оптимизацию батареи
+ Оптимизация батареи отключена
+ Держать активным
+ По умолчанию, когда подключено к USB-зарядке, телефон остается активным. Включение этой опции сохраняет активность телефона даже при отсутствии подключения к USB-зарядке, что может привести к увеличению расхода заряда батареи.Почти готово! Пожалуйста, включите разрешение на хранение, чтобы легко управлять файлами телефона через веб.Инструкция по использованиюШаг 1: Подключите ваш телефон и компьютер к одной и той же беспроводной сети.\n\nМетод 1: Подключите ваш компьютер и телефон к одной и той же Wi-Fi сети.\nМетод 2: Включите хотспот на вашем телефоне и подключите ваш компьютер к хотспоту телефона.\n\nШаг 2: Откройте веб-браузер на вашем компьютере и введите веб-адрес, отображаемый на главной странице приложения.
@@ -51,7 +61,7 @@
HTTP-сервер запущенHTTP-сервер не запущен. Перезапустите PlainApp и попробуйте снова. Убедитесь, что нет других приложений, занимающих порты HTTP или HTTPS. Если проблема сохраняется, предоставьте более подробную информацию о проблеме, связавшись с ismartcoding@gmail.com.Перезапустите приложение
- Конец
+ Больше нет данныхСписок пустВыберите ящикДобавить ящик
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index 3f7920c4..ff39c162 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -2,6 +2,16 @@
PlainAppஉங்கள் உலாவியில் தற்போது VPN செல்லுபடி உள்ளது, இது பிரச்சனைகளைக் கொண்டுவரலாம் பாராட்டும் நேரத்தில். இதை தீர்மானிக்க, உங்கள் VPN அமைப்புகளை LAN பரிமாறத்தை அனுமதிக்க அல்லது உங்கள் VPN முடக்குதலை கொண்டுவிடுவதை பரிந்துரைக்கிறோம்.எச்சரிக்கை
+ முடிவுகள் கண்டுபிடிக்கப்படவில்லை
+ தேடு
+ கவனத்தை
+ பரிந்துரை
+ USB சார்ஜ் கேபிளை இணைக்கும்போது தொலைபேசியின் மேம்பட்டதை உள்ளிட்டுத் தூண்டுவது, அதன் செயல்களை அரசாங்கம் மூலம் தடுக்காமல் அல்லது கட்டுப்படுத்தலால் எதிர்காலத்திற்கு உட்படுத்தப்பட்டுள்ளதை உறுதிசெய்கின்றது.
+ செயல்பாடு
+ பேட்டரி ஒப்டிமைசேஷனை முடக்கு
+ பேட்டரி ஒப்டிமைசேஷன் முடக்கப்பட்டுள்ளது
+ எழில்கள் செய்யுங்கள்
+ இயல்புப் படிப்பின்னர், USB சார்ஜிங்கு இணைந்திருந்தால், தொலைபேசி எழில் இருக்கின்றது. இந்த விருப்பத்தை இயல்பாக்கும் மூலம், USB சார்ஜிங்கு இணைந்திருந்தால் இல்லாவிட்டாலும் தொலைபேசி எழில் இருக்கும், அதன் விருப்பத்தின் மூலம் பேட்டரி பயன்படுத்தல் அதிகரிக்க முடியும்.அருமையாகும்! உங்கள் தொலைபேசி கோப்புகளை இணையத்தில் எளிதாக நிர்வகிக்க சூழல் அனுமதியை செயல்படுத்துக.பயன்படுத்தும் விதிகள்படி 1: உங்கள் கைபேசி மற்றும் கணினியை ஒரே வாயர்லஸ் நெட்வொர்க்கில் இணைக்கவும்.\n\nமுறை 1: உங்கள் கணினியை மற்றும் உங்கள் கைபேசியை ஒரே Wi-Fi நெட்வொர்க்கில் இணைக்கவும்.\nமுறை 2: உங்கள் கைபேசின் ஹாட்ஸ்பாட்டை இயக்கி உங்கள் கணினியை கைபேசின் ஹாட்ஸ்பாட்டுக்கு இணைக்கவும்.\n\nபடி 2: உங்கள் கணினியில் ஒரு வலை உலாவி திறந்து அப்பிக்கேடு தளத்தில் காட்சிப்படும் வலை முகவரியை உள்ளிடுங்கள்.
@@ -51,7 +61,7 @@
Http சேவையகம் நலமாக பயன்படுகின்றது.Http சேவையகம் ஆரம்பிக்கப்படவில்லை. PlainApp ஐ மீண்டும் தொடங்கி முயற்சிக்கவும். HTTP அல்லது HTTPS போர்ட்களை பயன்படுகின்ற பிற பயன்பாடுகள் இல்லையெனில் உள்ளிட்ட பிரச்சினைக்கு மேலும் விவரங்களை ismartcoding@gmail.com உடைகளுக்கு அனுப்புக.புதுப்பிக்க APP
- முடிந்தது
+ மேலும் தரவு இல்லைபட்டியல் காலியாகுதுஒரு பெட்டியைத் தேர்ந்தெடுபெட்டியைச் சேர்க்க
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index fd0dcd8d..5a02b8ac 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -1,11 +1,21 @@
简朴
- 您的VPN当前在设备上启用,这可能会导致从PC访问时出现Web连接问题。为解决此问题,我们建议调整VPN设置以允许局域网流量或禁用VPN。
+ 您的手机启用了VPN,这可能会导致从电脑访问网页时出现连接问题。我们建议您调整VPN设置允许局域网流量或关闭VPN。警告
+ 未找到结果
+ 搜索
+ 注意
+ 建议
+ 连接USB充电线可以确保手机保持唤醒状态,从而避免系统拦截或限制其功能。
+ 性能
+ 禁用电池优化
+ 电池优化已禁用
+ 保持唤醒
+ 默认情况下,连接USB充电时,手机会保持唤醒状态。启用此选项可使手机即使未连接USB充电,也保持唤醒状态,可能会增加电池消耗。再一步就完成了!请开启存储权限,以便您通过网页轻松管理手机文件。使用说明
- 步骤1:将您的手机和电脑连接到同一无线网络。\n\n\u0020\u0020\u0020\u0020方法①:将您的电脑和手机连接到同一Wi-Fi网络。\n\u0020\u0020\u0020\u0020方法②:打开您手机的热点,并将您的电脑连接到手机的热点。\n\n步骤2:在您的电脑上打开网络浏览器,并输入在应用主页上显示的网址。
- 1. 计算机浏览器无法打开网页。\n\n无线路由器可能已启用AP隔离,阻止电脑与手机之间的通信。 请前往路由器设置界面禁用AP隔离功能。\n\n2. 在输入HTTPS网页地址后,电脑浏览器显示警告:“您的连接不是私密的。”\n\n您可以单击“继续前往x.x.x.x(不安全)”以继续。 简朴使用自签名的TLS证书加密网站。
+ 步骤1:将您的手机和电脑连接到同一无线网络。\n\n\u0020\u0020\u0020\u0020方法①:将您的电脑和手机连接到同一Wi-Fi网络。\n\u0020\u0020\u0020\u0020方法②:打开您的手机热点,并将您的电脑连接到手机热点。\n\n步骤2:在您的电脑上打开网络浏览器,并输入在应用主页上显示的网址。
+ 1. 电脑浏览器无法打开网页。\n\n无线路由器可能已启用AP隔离,阻止电脑与手机之间的通信。 请前往路由器设置界面禁用AP隔离功能。\n\n2. 在输入HTTPS网页地址后,电脑浏览器显示警告:“您的连接不是私密的。”\n\n您可以单击“继续前往x.x.x.x(不安全)”以继续。 简朴使用自签名的TLS证书加密网站。了解更多…服务运行中启动服务中...
@@ -51,7 +61,7 @@
HTTP服务运行中HTTP服务器未启动。重新启动应用并重试。重启应用
- 完
+ 没有更多数据了暂无数据选择盒子添加盒子
@@ -329,7 +339,7 @@
读取话号码已获取系统权限未获取系统权限
- 打开系统权限设置
+ 系统权限设置API服务运行中屏幕镜像服务运行中投屏
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index e6c09431..2cc706e7 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -1,10 +1,20 @@
簡樸
- 您的VPN目前在設備上啟用,這可能會導致從PC訪問時出現Web連接問題。為解決此問題,我們建議調整VPN設置以允許局域網流量或禁用VPN。
+ 您的手機啟用了VPN,這可能會導致從電腦訪問網頁時出現連接問題。我們建議您調整VPN設置允許區域網路流量或關閉VPN。警告
+ 找不到結果
+ 搜尋
+ 注意
+ 建議
+ 連接USB充電線確保手機保持喚醒狀態,從而避免系統攔截或限制其功能。
+ 性能
+ 停用電池優化
+ 電池優化已停用
+ 保持喚醒
+ 預設情況下,連接USB充電時,手機會保持喚醒狀態。啟用此選項可使手機即使未連接USB充電,也保持喚醒狀態,可能會增加電池消耗。再一步就完成了!請開啟存儲權限,以便您透過網頁輕鬆管理手機檔案。使用說明
- 步驟1:將您的手機和電腦連接到同一個無線網路。\n\n方法1:將您的電腦和手機連接到同一個Wi-Fi網路。\n方法2:打開您手機的熱點,並將您的電腦連接到手機的熱點。\n\n步驟2:在您的電腦上開啟一個網頁瀏覽器,並輸入在應用程式首頁上顯示的網址。
+ 步驟1:將您的手機和電腦連接到同一個無線網路。\n\n方法1:將您的電腦和手機連接到同一個Wi-Fi網路。\n方法2:打開您的手機熱點,並將您的電腦連接到手機熱點。\n\n步驟2:在您的電腦上開啟一個網頁瀏覽器,並輸入在應用程式首頁上顯示的網址。1. 電腦瀏覽器無法開啟網頁。\n\n無線路由器可能已啟用AP隔離,阻止電腦與手機之間的通訊。 請前往路由器設置界面禁用AP隔離功能。\n\n2. 在輸入HTTPS網頁地址後,電腦瀏覽器顯示警告:“您的連線不是私密的。”\n\n您可以點擊“繼續前往x.x.x.x(不安全)”以繼續。 Simple使用自簽名的TLS憑證加密網站。進一步了解…服務正在運行中
@@ -51,7 +61,7 @@
HTTP服務運行中HTTP伺服器未啟動。重新啟動PlainApp並重試。重啟應用
- 完
+ 沒有更多數據暫無數據選擇盒子添加盒子
@@ -329,7 +339,7 @@
讀取電話號碼已獲取系統權限未獲取系統權限
- 打開系統權限設置
+ 系統權限設置API服務運行中屏幕鏡像服務運行中投屏
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 70a3bc4a..6bbd75f0 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2,6 +2,16 @@
PlainAppYour VPN is currently enabled on your device, which could potentially lead to web connection issues when accessed from PC. To resolve this, we recommend adjusting your VPN settings to allow LAN traffic or disabling your VPN.Warning
+ Search
+ No results found
+ Attention
+ Recommendation
+ Connecting the USB charging cable ensures that the phone remains awake, thus avoiding any interception or restriction of its functions by the system.
+ Performance
+ Disable battery optimization
+ Battery optimization is disabled
+ Keep awake
+ By default, when connected to USB charging, the phone remains awake. Enabling this option keeps the phone awake even when not connected to USB charging, potentially resulting in increased battery consumption.Almost there! Please enable storage permission to easily manage your phone files via the web.Instructions for useStep 1: Connect your phone and computer to the same wireless network.\n\nMethod 1: Connect your computer and phone to the same Wi-Fi network.\nMethod 2: Turn on your phone\'s hotspot and connect your computer to the phone\'s hotspot.\n\nStep 2: Open a web browser on your computer and enter the web address displayed on the APP homepage.
@@ -51,7 +61,7 @@
HTTP server is running well.HTTP server is not started. Relaunch the PlainApp and try again.Relaunch APP
- End
+ No more dataList is emptySelect a boxAdd box
diff --git a/app/src/main/resources/web/assets/AIChatView-2034104f.js b/app/src/main/resources/web/assets/AIChatView-fae5b84f.js
similarity index 95%
rename from app/src/main/resources/web/assets/AIChatView-2034104f.js
rename to app/src/main/resources/web/assets/AIChatView-fae5b84f.js
index f20d6d01..51d590b0 100644
--- a/app/src/main/resources/web/assets/AIChatView-2034104f.js
+++ b/app/src/main/resources/web/assets/AIChatView-fae5b84f.js
@@ -1,4 +1,4 @@
-import{d as Z,e as ee,u as te,D as ae,r,s as se,f as ne,g as oe,i as R,aR as ie,U as B,O as le,P as N,Q as ce,R as de,c as u,a as s,p as h,H as f,j as l,x as re,b0 as ue,b1 as pe,b2 as _e,o as c,F as ve,J as me,t as p,b3 as I,k as Q,S as he,m as x,Y as K,h as z,b4 as F,v as fe,ap as y,l as m,b5 as ye,at as ge,b6 as Ce,A as be,B as ke,_ as Ae}from"./index-a9bbc323.js";import{g as G,M as we}from"./splitpanes.es-37578c0b.js";import{u as Me}from"./markdown-1f5c44e0.js";const Ie=g=>(be("data-v-511dc1cd"),g=g(),ke(),g),xe={class:"page-container"},Te={class:"main"},$e={key:0,class:"date"},De={class:"chat-title"},Le={class:"name"},Se={class:"time"},Ve={class:"menu-items"},He=["onClick","disabled"],Re={slot:"headline"},Be={key:2,class:"chat-title"},Ne={class:"name"},Qe={class:"time"},Ke=["innerHTML"],ze={key:0,class:"chat-item replying"},Fe={class:"chat-title"},Ge={class:"name"},Ue=["innerHTML"],qe=["placeholder","onKeydown"],Pe={class:"btns"},je=["onClick"],Ee=Ie(()=>s("md-ripple",null,null,-1)),Je=Z({__name:"AIChatView",setup(g){const U=ee(),{t:q}=te(),P=ae(),d=r(P.params.id),i=r(""),_=r([]),C=r(!1),b=r(""),A=r(""),{app:j,urlTokenKey:E}=se(ne()),T=r(),{render:k}=Me(j,E);function w(){return d.value==="create"}function J(e,t){let n=!1;if(t==0)n=!0;else{const o=t>0?_.value[t-1]:null;o!=null&&I(o.createdAt)!==I(e.createdAt)&&(n=!0)}return n}w()||oe({handle:async(e,t)=>{if(t)re(q(t),"error");else{const n=[];n.push({...e.aiChat,md:await k(e.aiChat.content)});for(const o of e.aiChats)n.push({...o,md:await k(o.content)});_.value=n,await B(),L()}},document:ue,variables:()=>({id:d.value,query:`parent_id:${d.value} sort:created_at-asc`}),appApi:!0});const{mutate:$,onDone:O}=R({document:pe,appApi:!0});function D(){!i.value||C.value||$({id:w()?"":d.value,message:i.value,isMe:!0})}O(async e=>{var n;const t=e.data.createAIChat;if(t){for(const v of t)(n=_.value)==null||n.push({...v,md:await k(v.content)});w()&&(d.value=t[0].id,ie(U,`/aichats/${d.value}`)),i.value="",C.value=!C.value,b.value="",A.value='',await B(),L()}});function L(){const e=T.value;e&&(e.scrollTop=e.scrollHeight)}const M=r(""),{mutate:Y,loading:W}=R({document:_e,options:{update:e=>{var n,o;e.evict({id:e.identify({__typename:"AIChat",id:M.value})});const t=(n=_.value)==null?void 0:n.findIndex(v=>v.id===M.value);t!==null&&((o=_.value)==null||o.splice(t,1))}},appApi:!0});function X(e){M.value=e,Y({query:`ids:${e}`})}const S=async e=>{e.parentId===d.value&&(b.value+=e.content,A.value=await k(b.value+''),e.finishReason==="stop"&&$({id:d.value,message:b.value,isMe:!1}))};return le(()=>{N.on("ai_chat_replied",S)}),ce(()=>{N.off("ai_chat_replied",S)}),(e,t)=>{const n=ye,o=ge,v=Ce,V=de("tooltip");return c(),u("div",xe,[s("div",Te,[h(l(we),{class:"chat-container",horizontal:""},{default:f(()=>[h(l(G),{size:"80"},{default:f(()=>[s("div",{class:"chat-items",ref_key:"scrollContainer",ref:T},[(c(!0),u(ve,null,me(_.value,(a,H)=>(c(),u("div",{key:a.id,class:"chat-item"},[J(a,H)?(c(),u("div",$e,p(l(I)(a.createdAt)),1)):Q("",!0),H>0?(c(),he(o,{key:1},{content:f(()=>[s("div",Ve,[s("md-menu-item",{onClick:Oe=>X(a.id),disabled:l(W)},[s("div",Re,p(e.$t("delete_message")),1)],8,He)])]),default:f(()=>[s("div",De,[s("span",Le,p(e.$t(a.isMe?"me":"ai")),1),x((c(),u("span",Se,[z(p(l(F)(a.createdAt)),1)])),[[V,l(K)(a.createdAt)]]),h(n,{class:"bi bi-more"})])]),_:2},1024)):(c(),u("div",Be,[s("span",Ne,p(e.$t(a.isMe?"me":"ai")),1),x((c(),u("span",Qe,[z(p(l(F)(a.createdAt)),1)])),[[V,l(K)(a.createdAt)]])])),s("div",{class:"chat-content md-container",innerHTML:a.md},null,8,Ke)]))),128)),C.value?(c(),u("div",ze,[s("div",Fe,[s("span",Ge,p(e.$t("ai")),1)]),s("div",{class:"chat-content md-container",innerHTML:A.value},null,8,Ue)])):Q("",!0)],512)]),_:1}),h(l(G),{class:"chat-input",size:"12",style:{"min-height":"80px"}},{default:f(()=>[x(s("md-outlined-text-field",{class:"textarea",type:"textarea","onUpdate:modelValue":t[0]||(t[0]=a=>i.value=a),autocomplete:"off",placeholder:e.$t("chat_input_hint"),onKeydown:[y(m(D,["exact","prevent"]),["enter"]),t[1]||(t[1]=y(m(a=>i.value+=`
+import{d as Z,e as ee,u as te,D as ae,r,s as se,f as ne,g as oe,i as R,aR as ie,U as B,O as le,P as N,Q as ce,R as de,c as u,a as s,p as h,H as f,j as l,x as re,b0 as ue,b1 as pe,b2 as _e,o as c,F as ve,J as me,t as p,b3 as I,k as Q,S as he,m as x,Y as K,h as z,b4 as F,v as fe,ap as y,l as m,b5 as ye,at as ge,b6 as Ce,A as be,B as ke,_ as Ae}from"./index-82e633ff.js";import{g as G,M as we}from"./splitpanes.es-de3e6852.js";import{u as Me}from"./markdown-ac4c00dc.js";const Ie=g=>(be("data-v-511dc1cd"),g=g(),ke(),g),xe={class:"page-container"},Te={class:"main"},$e={key:0,class:"date"},De={class:"chat-title"},Le={class:"name"},Se={class:"time"},Ve={class:"menu-items"},He=["onClick","disabled"],Re={slot:"headline"},Be={key:2,class:"chat-title"},Ne={class:"name"},Qe={class:"time"},Ke=["innerHTML"],ze={key:0,class:"chat-item replying"},Fe={class:"chat-title"},Ge={class:"name"},Ue=["innerHTML"],qe=["placeholder","onKeydown"],Pe={class:"btns"},je=["onClick"],Ee=Ie(()=>s("md-ripple",null,null,-1)),Je=Z({__name:"AIChatView",setup(g){const U=ee(),{t:q}=te(),P=ae(),d=r(P.params.id),i=r(""),_=r([]),C=r(!1),b=r(""),A=r(""),{app:j,urlTokenKey:E}=se(ne()),T=r(),{render:k}=Me(j,E);function w(){return d.value==="create"}function J(e,t){let n=!1;if(t==0)n=!0;else{const o=t>0?_.value[t-1]:null;o!=null&&I(o.createdAt)!==I(e.createdAt)&&(n=!0)}return n}w()||oe({handle:async(e,t)=>{if(t)re(q(t),"error");else{const n=[];n.push({...e.aiChat,md:await k(e.aiChat.content)});for(const o of e.aiChats)n.push({...o,md:await k(o.content)});_.value=n,await B(),L()}},document:ue,variables:()=>({id:d.value,query:`parent_id:${d.value} sort:created_at-asc`}),appApi:!0});const{mutate:$,onDone:O}=R({document:pe,appApi:!0});function D(){!i.value||C.value||$({id:w()?"":d.value,message:i.value,isMe:!0})}O(async e=>{var n;const t=e.data.createAIChat;if(t){for(const v of t)(n=_.value)==null||n.push({...v,md:await k(v.content)});w()&&(d.value=t[0].id,ie(U,`/aichats/${d.value}`)),i.value="",C.value=!C.value,b.value="",A.value='',await B(),L()}});function L(){const e=T.value;e&&(e.scrollTop=e.scrollHeight)}const M=r(""),{mutate:Y,loading:W}=R({document:_e,options:{update:e=>{var n,o;e.evict({id:e.identify({__typename:"AIChat",id:M.value})});const t=(n=_.value)==null?void 0:n.findIndex(v=>v.id===M.value);t!==null&&((o=_.value)==null||o.splice(t,1))}},appApi:!0});function X(e){M.value=e,Y({query:`ids:${e}`})}const S=async e=>{e.parentId===d.value&&(b.value+=e.content,A.value=await k(b.value+''),e.finishReason==="stop"&&$({id:d.value,message:b.value,isMe:!1}))};return le(()=>{N.on("ai_chat_replied",S)}),ce(()=>{N.off("ai_chat_replied",S)}),(e,t)=>{const n=ye,o=ge,v=Ce,V=de("tooltip");return c(),u("div",xe,[s("div",Te,[h(l(we),{class:"chat-container",horizontal:""},{default:f(()=>[h(l(G),{size:"80"},{default:f(()=>[s("div",{class:"chat-items",ref_key:"scrollContainer",ref:T},[(c(!0),u(ve,null,me(_.value,(a,H)=>(c(),u("div",{key:a.id,class:"chat-item"},[J(a,H)?(c(),u("div",$e,p(l(I)(a.createdAt)),1)):Q("",!0),H>0?(c(),he(o,{key:1},{content:f(()=>[s("div",Ve,[s("md-menu-item",{onClick:Oe=>X(a.id),disabled:l(W)},[s("div",Re,p(e.$t("delete_message")),1)],8,He)])]),default:f(()=>[s("div",De,[s("span",Le,p(e.$t(a.isMe?"me":"ai")),1),x((c(),u("span",Se,[z(p(l(F)(a.createdAt)),1)])),[[V,l(K)(a.createdAt)]]),h(n,{class:"bi bi-more"})])]),_:2},1024)):(c(),u("div",Be,[s("span",Ne,p(e.$t(a.isMe?"me":"ai")),1),x((c(),u("span",Qe,[z(p(l(F)(a.createdAt)),1)])),[[V,l(K)(a.createdAt)]])])),s("div",{class:"chat-content md-container",innerHTML:a.md},null,8,Ke)]))),128)),C.value?(c(),u("div",ze,[s("div",Fe,[s("span",Ge,p(e.$t("ai")),1)]),s("div",{class:"chat-content md-container",innerHTML:A.value},null,8,Ue)])):Q("",!0)],512)]),_:1}),h(l(G),{class:"chat-input",size:"12",style:{"min-height":"80px"}},{default:f(()=>[x(s("md-outlined-text-field",{class:"textarea",type:"textarea","onUpdate:modelValue":t[0]||(t[0]=a=>i.value=a),autocomplete:"off",placeholder:e.$t("chat_input_hint"),onKeydown:[y(m(D,["exact","prevent"]),["enter"]),t[1]||(t[1]=y(m(a=>i.value+=`
`,["shift","exact","prevent"]),["enter"])),t[2]||(t[2]=y(m(a=>i.value+=`
`,["ctrl","exact","prevent"]),["enter"])),t[3]||(t[3]=y(m(a=>i.value+=`
`,["alt","exact","prevent"]),["enter"])),t[4]||(t[4]=y(m(a=>i.value+=`
diff --git a/app/src/main/resources/web/assets/AIChatsRootView-0eb89c73.js b/app/src/main/resources/web/assets/AIChatsRootView-3fdf4747.js
similarity index 91%
rename from app/src/main/resources/web/assets/AIChatsRootView-0eb89c73.js
rename to app/src/main/resources/web/assets/AIChatsRootView-3fdf4747.js
index f3d253ba..dc9be072 100644
--- a/app/src/main/resources/web/assets/AIChatsRootView-0eb89c73.js
+++ b/app/src/main/resources/web/assets/AIChatsRootView-3fdf4747.js
@@ -1 +1 @@
-import{_ as A}from"./TagFilter.vuevuetypescriptsetuptruelang-d0de30fc.js";import{o as p,c as _,a as e,d as k,r as M,u as L,i as V,b7 as x,an as G,g as I,x as D,b8 as N,U as S,ao as C,m as w,v as Z,j as t,n as B,ap as K,t as m,D as P,e as Q,E as R,G as z,R as E,p as i,H as $,h as F,l as b,I as H,C as U,a2 as j}from"./index-a9bbc323.js";import{g as y,M as J}from"./splitpanes.es-37578c0b.js";import{u as O,a as W}from"./vee-validate.esm-d674d968.js";import"./EditValueModal-8c79ab9c.js";const X={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Y=e("path",{fill:"currentColor",d:"m9.25 22l-.4-3.2q-.325-.125-.613-.3t-.562-.375L4.7 19.375l-2.75-4.75l2.575-1.95Q4.5 12.5 4.5 12.337v-.674q0-.163.025-.338L1.95 9.375l2.75-4.75l2.975 1.25q.275-.2.575-.375t.6-.3l.4-3.2h5.5l.4 3.2q.325.125.613.3t.562.375l2.975-1.25l2.75 4.75l-2.575 1.95q.025.175.025.338v.674q0 .163-.05.338l2.575 1.95l-2.75 4.75l-2.95-1.25q-.275.2-.575.375t-.6.3l-.4 3.2h-5.5Zm2.8-6.5q1.45 0 2.475-1.025T15.55 12q0-1.45-1.025-2.475T12.05 8.5q-1.475 0-2.488 1.025T8.55 12q0 1.45 1.012 2.475T12.05 15.5Zm0-2q-.625 0-1.063-.438T10.55 12q0-.625.438-1.063t1.062-.437q.625 0 1.063.438T13.55 12q0 .625-.438 1.063t-1.062.437ZM12 12Zm-1 8h1.975l.35-2.65q.775-.2 1.438-.588t1.212-.937l2.475 1.025l.975-1.7l-2.15-1.625q.125-.35.175-.737T17.5 12q0-.4-.05-.787t-.175-.738l2.15-1.625l-.975-1.7l-2.475 1.05q-.55-.575-1.212-.962t-1.438-.588L13 4h-1.975l-.35 2.65q-.775.2-1.437.588t-1.213.937L5.55 7.15l-.975 1.7l2.15 1.6q-.125.375-.175.75t-.05.8q0 .4.05.775t.175.75l-2.15 1.625l.975 1.7l2.475-1.05q.55.575 1.213.963t1.437.587L11 20Z"},null,-1),tt=[Y];function et(h,r){return p(),_("svg",X,tt)}const ot={name:"material-symbols-settings-outline",render:et},st=e("div",{slot:"headline"},"ChatGPT",-1),at={slot:"content"},nt=["label","error","error-text"],lt={slot:"actions"},it=["disabled"],rt=k({__name:"AIChatConfigModal",props:{value:{type:String}},setup(h){const r=h,{handleSubmit:v}=O(),c=M(),{t:f}=L(),{mutate:q,loading:u,onDone:T}=V({document:x,options:{update:()=>{}},appApi:!0}),{value:a,resetField:g,errorMessage:d}=W("inputValue",G());a.value=r.value??"",a.value||g(),I({handle:(s,o)=>{o?D(f(o),"error"):s&&(a.value=s.aiChatConfig.chatGPTApiKey)},document:N,variables:null,appApi:!0}),(async()=>{var s;await S(),(s=c.value)==null||s.focus()})();const l=v(()=>{q({chatGPTApiKey:a.value??""})});return T(()=>{C()}),(s,o)=>(p(),_("md-dialog",null,[st,e("div",at,[w(e("md-outlined-text-field",{ref_key:"input",ref:c,label:s.$t("api_key"),class:"form-control","onUpdate:modelValue":o[0]||(o[0]=n=>B(a)?a.value=n:null),onKeyup:o[1]||(o[1]=K((...n)=>t(l)&&t(l)(...n),["enter"])),error:t(d),"error-text":t(d)?s.$t(t(d)):""},null,40,nt),[[Z,t(a)]])]),e("div",lt,[e("md-outlined-button",{value:"cancel",onClick:o[2]||(o[2]=(...n)=>t(C)&&t(C)(...n))},m(s.$t("cancel")),1),e("md-filled-button",{value:"save",disabled:t(u),onClick:o[3]||(o[3]=(...n)=>t(l)&&t(l)(...n)),autofocus:""},m(s.$t("save")),9,it)])]))}}),ct={class:"page-container"},ut={class:"sidebar"},dt={class:"nav-title"},pt=["onClick"],_t=e("md-ripple",null,null,-1),mt={class:"nav"},ht=["onClick"],vt={class:"main"},Tt=k({__name:"AIChatsRootView",setup(h){const r=P(),v=Q(),c=R(r.query);function f(){U(v,"/aichats")}function q(){j(rt)}return(u,T)=>{const a=ot,g=A,d=z("router-view"),l=E("tooltip");return p(),_("div",ct,[i(t(J),null,{default:$(()=>[i(t(y),{size:"20","min-size":"10"},{default:$(()=>[e("div",ut,[e("h2",dt,[F(m(u.$t("page_title.aichats"))+" ",1),w((p(),_("button",{class:"icon-button",onClick:b(q,["prevent"])},[_t,i(a)],8,pt)),[[l,u.$t("config")]])]),e("ul",mt,[e("li",{onClick:b(f,["prevent"]),class:H({active:t(r).path==="/aichats"&&!t(c)})},m(u.$t("all")),11,ht)]),i(g,{type:"AI_CHAT",selected:t(c)},null,8,["selected"])])]),_:1}),i(t(y),null,{default:$(()=>[e("div",vt,[i(d)])]),_:1})]),_:1})])}}});export{Tt as default};
+import{_ as A}from"./TagFilter.vuevuetypescriptsetuptruelang-10776836.js";import{o as p,c as _,a as e,d as k,r as M,u as L,i as V,b7 as x,an as G,g as I,x as D,b8 as N,U as S,ao as C,m as w,v as Z,j as t,n as B,ap as K,t as m,D as P,e as Q,E as R,G as z,R as E,p as i,H as $,h as F,l as b,I as H,C as U,a2 as j}from"./index-82e633ff.js";import{g as y,M as J}from"./splitpanes.es-de3e6852.js";import{u as O,a as W}from"./vee-validate.esm-6643484a.js";import"./EditValueModal-df390030.js";const X={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Y=e("path",{fill:"currentColor",d:"m9.25 22l-.4-3.2q-.325-.125-.613-.3t-.562-.375L4.7 19.375l-2.75-4.75l2.575-1.95Q4.5 12.5 4.5 12.337v-.674q0-.163.025-.338L1.95 9.375l2.75-4.75l2.975 1.25q.275-.2.575-.375t.6-.3l.4-3.2h5.5l.4 3.2q.325.125.613.3t.562.375l2.975-1.25l2.75 4.75l-2.575 1.95q.025.175.025.338v.674q0 .163-.05.338l2.575 1.95l-2.75 4.75l-2.95-1.25q-.275.2-.575.375t-.6.3l-.4 3.2h-5.5Zm2.8-6.5q1.45 0 2.475-1.025T15.55 12q0-1.45-1.025-2.475T12.05 8.5q-1.475 0-2.488 1.025T8.55 12q0 1.45 1.012 2.475T12.05 15.5Zm0-2q-.625 0-1.063-.438T10.55 12q0-.625.438-1.063t1.062-.437q.625 0 1.063.438T13.55 12q0 .625-.438 1.063t-1.062.437ZM12 12Zm-1 8h1.975l.35-2.65q.775-.2 1.438-.588t1.212-.937l2.475 1.025l.975-1.7l-2.15-1.625q.125-.35.175-.737T17.5 12q0-.4-.05-.787t-.175-.738l2.15-1.625l-.975-1.7l-2.475 1.05q-.55-.575-1.212-.962t-1.438-.588L13 4h-1.975l-.35 2.65q-.775.2-1.437.588t-1.213.937L5.55 7.15l-.975 1.7l2.15 1.6q-.125.375-.175.75t-.05.8q0 .4.05.775t.175.75l-2.15 1.625l.975 1.7l2.475-1.05q.55.575 1.213.963t1.437.587L11 20Z"},null,-1),tt=[Y];function et(h,r){return p(),_("svg",X,tt)}const ot={name:"material-symbols-settings-outline",render:et},st=e("div",{slot:"headline"},"ChatGPT",-1),at={slot:"content"},nt=["label","error","error-text"],lt={slot:"actions"},it=["disabled"],rt=k({__name:"AIChatConfigModal",props:{value:{type:String}},setup(h){const r=h,{handleSubmit:v}=O(),c=M(),{t:f}=L(),{mutate:q,loading:u,onDone:T}=V({document:x,options:{update:()=>{}},appApi:!0}),{value:a,resetField:g,errorMessage:d}=W("inputValue",G());a.value=r.value??"",a.value||g(),I({handle:(s,o)=>{o?D(f(o),"error"):s&&(a.value=s.aiChatConfig.chatGPTApiKey)},document:N,variables:null,appApi:!0}),(async()=>{var s;await S(),(s=c.value)==null||s.focus()})();const l=v(()=>{q({chatGPTApiKey:a.value??""})});return T(()=>{C()}),(s,o)=>(p(),_("md-dialog",null,[st,e("div",at,[w(e("md-outlined-text-field",{ref_key:"input",ref:c,label:s.$t("api_key"),class:"form-control","onUpdate:modelValue":o[0]||(o[0]=n=>B(a)?a.value=n:null),onKeyup:o[1]||(o[1]=K((...n)=>t(l)&&t(l)(...n),["enter"])),error:t(d),"error-text":t(d)?s.$t(t(d)):""},null,40,nt),[[Z,t(a)]])]),e("div",lt,[e("md-outlined-button",{value:"cancel",onClick:o[2]||(o[2]=(...n)=>t(C)&&t(C)(...n))},m(s.$t("cancel")),1),e("md-filled-button",{value:"save",disabled:t(u),onClick:o[3]||(o[3]=(...n)=>t(l)&&t(l)(...n)),autofocus:""},m(s.$t("save")),9,it)])]))}}),ct={class:"page-container"},ut={class:"sidebar"},dt={class:"nav-title"},pt=["onClick"],_t=e("md-ripple",null,null,-1),mt={class:"nav"},ht=["onClick"],vt={class:"main"},Tt=k({__name:"AIChatsRootView",setup(h){const r=P(),v=Q(),c=R(r.query);function f(){U(v,"/aichats")}function q(){j(rt)}return(u,T)=>{const a=ot,g=A,d=z("router-view"),l=E("tooltip");return p(),_("div",ct,[i(t(J),null,{default:$(()=>[i(t(y),{size:"20","min-size":"10"},{default:$(()=>[e("div",ut,[e("h2",dt,[F(m(u.$t("page_title.aichats"))+" ",1),w((p(),_("button",{class:"icon-button",onClick:b(q,["prevent"])},[_t,i(a)],8,pt)),[[l,u.$t("config")]])]),e("ul",mt,[e("li",{onClick:b(f,["prevent"]),class:H({active:t(r).path==="/aichats"&&!t(c)})},m(u.$t("all")),11,ht)]),i(g,{type:"AI_CHAT",selected:t(c)},null,8,["selected"])])]),_:1}),i(t(y),null,{default:$(()=>[e("div",vt,[i(d)])]),_:1})]),_:1})])}}});export{Tt as default};
diff --git a/app/src/main/resources/web/assets/AIChatsView-3f1b7680.js b/app/src/main/resources/web/assets/AIChatsView-75acf5cd.js
similarity index 93%
rename from app/src/main/resources/web/assets/AIChatsView-3f1b7680.js
rename to app/src/main/resources/web/assets/AIChatsView-75acf5cd.js
index aa9384a0..b18eccfd 100644
--- a/app/src/main/resources/web/assets/AIChatsView-3f1b7680.js
+++ b/app/src/main/resources/web/assets/AIChatsView-75acf5cd.js
@@ -1,4 +1,4 @@
-import{c as fe,u as ve,_ as ke,a as be,b as $e}from"./list-be40ed35.js";import{d as Ce,e as ye,r as k,u as Ae,K as Te,L as we,D as Ie,M as Se,N as qe,w as De,O as Ve,P as b,Q as Qe,R as Ue,c as o,a as t,p as c,j as s,F as T,m as _,l as u,k as S,t as d,H as Be,J as K,S as Me,T as Ne,U as Re,b2 as Le,x as Fe,b9 as He,C as j,W as E,o as n,v as ze,I as Pe,aS as Ge,Y as J,h as O,Z as W,$ as Ke,a0 as je,a1 as Ee,ba as Y,a2 as Z,ab as Je,ac as Oe,a3 as We,ad as Ye,a4 as Ze,a5 as Xe,a6 as xe}from"./index-a9bbc323.js";import{_ as et}from"./Breadcrumb-7b5128ab.js";import{u as tt,a as at}from"./tags-7e5964e8.js";import"./vee-validate.esm-d674d968.js";const st={class:"v-toolbar"},lt=t("md-ripple",null,null,-1),nt=t("md-ripple",null,null,-1),ot=["onClick"],dt={class:"filters"},ct=["label"],it={class:"form-label"},ut=["label","selected","onClick"],rt={class:"buttons"},_t=["onClick"],pt={class:"table-responsive"},ht={class:"table"},mt=["checked","indeterminate"],gt=t("th",null,"ID",-1),ft=t("th",null,null,-1),vt=["onClick"],kt=["checked"],bt=["onClick"],$t={class:"nowrap"},Ct={class:"action-btns"},yt=["onClick"],At=t("md-ripple",null,null,-1),Tt=["onClick"],wt=t("md-ripple",null,null,-1),It={class:"nowrap"},St={class:"nowrap"},qt={key:0},Dt={colspan:"7"},Vt={class:"no-data-placeholder"},$=50,Ft=Ce({__name:"AIChatsView",setup(Qt){var H,z;const q=ye(),p=k([]),D=k(),{t:X}=Ae(),i=Te({text:"",tags:[]}),r=we.AI_CHAT,V=Ie().query,C=k(parseInt(((H=V.page)==null?void 0:H.toString())??"1")),h=k(Se(((z=V.q)==null?void 0:z.toString())??"")),y=k(""),{tags:A}=tt(r,h,i,async e=>{e.push({name:"parent_id",op:"",value:""}),y.value=Ne(e),await Re(),ne()}),{addToTags:x}=at(r,p,A),{deleteItems:ee}=fe(Le,()=>{I()},p),{allChecked:Q,realAllChecked:w,selectRealAll:te,allCheckedAlertVisible:ae,clearSelection:U,toggleAllChecked:B,toggleItemChecked:M,toggleRow:se,total:m,checked:N}=ve(p),{loading:le,load:ne,refetch:I}=qe({handle:(e,l)=>{l?Fe(X(l),"error"):e&&(p.value=e.aiChats.map(v=>({...v,checked:!1})),m.value=e.aiChatCount)},document:He,variables:()=>({offset:(C.value-1)*$,limit:$,query:y.value}),appApi:!0});De(C,e=>{j(q,`/aichats?page=${e}&q=${E(h.value)}`)});function oe(e){i.tags.includes(e)?je(i.tags,l=>l.id===e.id):i.tags.push(e)}function de(){h.value=Ee(i),R(),D.value.dismiss()}function R(){j(q,`/aichats?q=${E(h.value)}`)}const L=e=>{e.type===r&&(U(),I())},F=e=>{e.type===r&&I()};Ve(()=>{b.on("item_tags_updated",F),b.on("items_tags_updated",L)}),Qe(()=>{b.off("item_tags_updated",F),b.off("items_tags_updated",L)});function ce(e){Y(`/aichats/${e.id}`)}function ie(){Y("/aichats/create")}function ue(e){Z(Oe,{id:e.id,name:e.id,gql:Je`
+import{c as fe,u as ve,_ as ke,a as be,b as $e}from"./list-0feac61c.js";import{d as Ce,e as ye,r as k,u as Ae,K as Te,L as we,D as Ie,M as Se,N as qe,w as De,O as Ve,P as b,Q as Qe,R as Ue,c as o,a as t,p as c,j as s,F as T,m as _,l as u,k as S,t as d,H as Be,J as K,S as Me,T as Ne,U as Re,b2 as Le,x as Fe,b9 as He,C as j,W as E,o as n,v as ze,I as Pe,aS as Ge,Y as J,h as O,Z as W,$ as Ke,a0 as je,a1 as Ee,ba as Y,a2 as Z,ab as Je,ac as Oe,a3 as We,ad as Ye,a4 as Ze,a5 as Xe,a6 as xe}from"./index-82e633ff.js";import{_ as et}from"./Breadcrumb-9ca58797.js";import{u as tt,a as at}from"./tags-dce7ef69.js";import"./vee-validate.esm-6643484a.js";const st={class:"v-toolbar"},lt=t("md-ripple",null,null,-1),nt=t("md-ripple",null,null,-1),ot=["onClick"],dt={class:"filters"},ct=["label"],it={class:"form-label"},ut=["label","selected","onClick"],rt={class:"buttons"},_t=["onClick"],pt={class:"table-responsive"},ht={class:"table"},mt=["checked","indeterminate"],gt=t("th",null,"ID",-1),ft=t("th",null,null,-1),vt=["onClick"],kt=["checked"],bt=["onClick"],$t={class:"nowrap"},Ct={class:"action-btns"},yt=["onClick"],At=t("md-ripple",null,null,-1),Tt=["onClick"],wt=t("md-ripple",null,null,-1),It={class:"nowrap"},St={class:"nowrap"},qt={key:0},Dt={colspan:"7"},Vt={class:"no-data-placeholder"},$=50,Ft=Ce({__name:"AIChatsView",setup(Qt){var H,z;const q=ye(),p=k([]),D=k(),{t:X}=Ae(),i=Te({text:"",tags:[]}),r=we.AI_CHAT,V=Ie().query,C=k(parseInt(((H=V.page)==null?void 0:H.toString())??"1")),h=k(Se(((z=V.q)==null?void 0:z.toString())??"")),y=k(""),{tags:A}=tt(r,h,i,async e=>{e.push({name:"parent_id",op:"",value:""}),y.value=Ne(e),await Re(),ne()}),{addToTags:x}=at(r,p,A),{deleteItems:ee}=fe(Le,()=>{I()},p),{allChecked:Q,realAllChecked:w,selectRealAll:te,allCheckedAlertVisible:ae,clearSelection:U,toggleAllChecked:B,toggleItemChecked:M,toggleRow:se,total:m,checked:N}=ve(p),{loading:le,load:ne,refetch:I}=qe({handle:(e,l)=>{l?Fe(X(l),"error"):e&&(p.value=e.aiChats.map(v=>({...v,checked:!1})),m.value=e.aiChatCount)},document:He,variables:()=>({offset:(C.value-1)*$,limit:$,query:y.value}),appApi:!0});De(C,e=>{j(q,`/aichats?page=${e}&q=${E(h.value)}`)});function oe(e){i.tags.includes(e)?je(i.tags,l=>l.id===e.id):i.tags.push(e)}function de(){h.value=Ee(i),R(),D.value.dismiss()}function R(){j(q,`/aichats?q=${E(h.value)}`)}const L=e=>{e.type===r&&(U(),I())},F=e=>{e.type===r&&I()};Ve(()=>{b.on("item_tags_updated",F),b.on("items_tags_updated",L)}),Qe(()=>{b.off("item_tags_updated",F),b.off("items_tags_updated",L)});function ce(e){Y(`/aichats/${e.id}`)}function ie(){Y("/aichats/create")}function ue(e){Z(Oe,{id:e.id,name:e.id,gql:Je`
mutation DeleteAIChat($query: String!) {
deleteAIChats(query: $query)
}
diff --git a/app/src/main/resources/web/assets/AppsRootView-767cf039.js b/app/src/main/resources/web/assets/AppsRootView-23ff2ae3.js
similarity index 93%
rename from app/src/main/resources/web/assets/AppsRootView-767cf039.js
rename to app/src/main/resources/web/assets/AppsRootView-23ff2ae3.js
index b098e3dc..45aa52d9 100644
--- a/app/src/main/resources/web/assets/AppsRootView-767cf039.js
+++ b/app/src/main/resources/web/assets/AppsRootView-23ff2ae3.js
@@ -1 +1 @@
-import{d as k,D as $,e as g,G as w,c as p,p as o,H as n,j as t,o as r,a as e,t as i,l as _,I as u,F as B,J as z,C as d}from"./index-a9bbc323.js";import{g as m,M}from"./splitpanes.es-37578c0b.js";const S={class:"page-container"},V={class:"sidebar"},D={class:"nav-title"},F={class:"nav"},N=["onClick"],R=["onClick"],b={class:"main"},I=k({__name:"AppsRootView",setup(j){const l=$(),c=g(),h=l.params.type;function v(s){d(c,`/apps/${s}`)}const f=["user","system"];function y(){d(c,"/apps")}return(s,A)=>{const C=w("router-view");return r(),p("div",S,[o(t(M),null,{default:n(()=>[o(t(m),{size:"20","min-size":"10"},{default:n(()=>[e("div",V,[e("h2",D,i(s.$t("page_title.apps")),1),e("ul",F,[e("li",{onClick:_(y,["prevent"]),class:u({active:t(l).path==="/apps"})},i(s.$t("all")),11,N),(r(),p(B,null,z(f,a=>e("li",{key:a,onClick:_(E=>v(a),["prevent"]),class:u({active:a===t(h)})},i(s.$t(`app_type.${a}`)),11,R)),64))])])]),_:1}),o(t(m),null,{default:n(()=>[e("div",b,[o(C)])]),_:1})]),_:1})])}}});export{I as default};
+import{d as k,D as $,e as g,G as w,c as p,p as o,H as n,j as t,o as r,a as e,t as i,l as _,I as u,F as B,J as z,C as d}from"./index-82e633ff.js";import{g as m,M}from"./splitpanes.es-de3e6852.js";const S={class:"page-container"},V={class:"sidebar"},D={class:"nav-title"},F={class:"nav"},N=["onClick"],R=["onClick"],b={class:"main"},I=k({__name:"AppsRootView",setup(j){const l=$(),c=g(),h=l.params.type;function v(s){d(c,`/apps/${s}`)}const f=["user","system"];function y(){d(c,"/apps")}return(s,A)=>{const C=w("router-view");return r(),p("div",S,[o(t(M),null,{default:n(()=>[o(t(m),{size:"20","min-size":"10"},{default:n(()=>[e("div",V,[e("h2",D,i(s.$t("page_title.apps")),1),e("ul",F,[e("li",{onClick:_(y,["prevent"]),class:u({active:t(l).path==="/apps"})},i(s.$t("all")),11,N),(r(),p(B,null,z(f,a=>e("li",{key:a,onClick:_(E=>v(a),["prevent"]),class:u({active:a===t(h)})},i(s.$t(`app_type.${a}`)),11,R)),64))])])]),_:1}),o(t(m),null,{default:n(()=>[e("div",b,[o(C)])]),_:1})]),_:1})])}}});export{I as default};
diff --git a/app/src/main/resources/web/assets/AppsView-3983b516.js b/app/src/main/resources/web/assets/AppsView-4c675793.js
similarity index 96%
rename from app/src/main/resources/web/assets/AppsView-3983b516.js
rename to app/src/main/resources/web/assets/AppsView-4c675793.js
index ff28d770..f871da28 100644
--- a/app/src/main/resources/web/assets/AppsView-3983b516.js
+++ b/app/src/main/resources/web/assets/AppsView-4c675793.js
@@ -1 +1 @@
-import{u as $e,_ as be,a as Ce,b as we}from"./list-be40ed35.js";import{P,d as Se,ae as Ae,e as De,r as g,u as Ie,s as Ve,f as Ue,K as Te,af as qe,L as Pe,D as Qe,M as Be,ag as Fe,T as Y,g as Le,w as ze,i as Me,N as Re,O as Ne,Q as Ge,R as Ke,c as i,a as t,p as r,j as n,m as p,l as _,k as T,h as A,t as a,H as je,F as q,J as xe,S as Ee,x as He,ah as Je,ai as Oe,C as D,W as I,aj as We,ak as Ye,o,v as Ze,I as Xe,z as et,Y as Z,Z as X,$ as tt,al as st,am as nt,a5 as lt,ad as at}from"./index-a9bbc323.js";import{_ as ot}from"./Breadcrumb-7b5128ab.js";const ee=m=>{P.emit("tap_phone",m)};function it(m,V){const $=m.findIndex(b=>b.id===V);$!==-1&&m.splice($,1)}const ct={class:"v-toolbar"},dt=t("md-ripple",null,null,-1),ut=["onClick"],rt=t("md-ripple",null,null,-1),pt={class:"filters"},_t={class:"form-row"},ht=["label"],ft={class:"buttons"},mt=["onClick"],kt={class:"table-responsive"},vt={class:"table"},gt=["checked","indeterminate"],yt=t("th",null,null,-1),$t=t("th",null,null,-1),bt=["onClick"],Ct=["checked"],wt=["src"],St={class:"v-center"},At={class:"nowrap"},Dt={class:"action-btns"},It={indeterminate:"",class:"spinner-sm"},Vt=["onClick"],Ut=["onClick"],Tt=t("md-ripple",null,null,-1),qt=["onClick"],Pt=t("md-ripple",null,null,-1),Qt={class:"nowrap"},Bt={class:"nowrap"},Ft={class:"nowrap"},Lt={class:"nowrap"},zt={key:0},Mt={colspan:"8"},Rt={class:"no-data-placeholder"},y=50,jt=Se({__name:"AppsView",setup(m){var J,O;const{input:V,upload:$,uploadChanged:b}=Ae(),C=De(),c=g([]),Q=g(),{t:B}=Ie(),{app:te,urlTokenKey:U}=Ve(Ue()),w=Te({text:"",tags:[]}),{allChecked:F,realAllChecked:L,selectRealAll:se,allCheckedAlertVisible:ne,clearSelection:z,toggleAllChecked:M,toggleItemChecked:R,toggleRow:le,total:k,checked:N}=$e(c),{downloadItems:ae}=qe(U,Pe.PACKAGE,c,z,"apps.zip"),{downloadFile:oe}=st(U),G=Qe(),K=G.query,S=g(parseInt(((J=K.page)==null?void 0:J.toString())??"1")),d=g(Be(((O=K.q)==null?void 0:O.toString())??"")),j=Fe(d.value),h=G.params.type;h&&j.push({name:"type",op:"",value:h});const x=g(Y(j)),ie=()=>{$(te.value.downloadsDir)},ce=e=>{e.isUninstalling=!1},{loading:de}=Le({handle:(e,l)=>{l?He(B(l),"error"):e&&(c.value=e.packages.map(u=>({...u,checked:!1,icon:Je(U.value,"pkgicon://"+u.id)})),k.value=e.packageCount)},document:Oe,variables:()=>({offset:(S.value-1)*y,limit:y,query:x.value}),appApi:!0});ze(S,e=>{h?D(C,`/apps/${h}?page=${e}&q=${I(d.value)}`):D(C,`/apps?page=${e}&q=${I(d.value)}`)});function ue(){const e=[];w.text&&e.push({name:"text",op:"",value:w.text}),d.value=Y(e),E(),Q.value.dismiss()}function E(){h?D(C,`/apps/${h}?q=${I(d.value)}`):D(C,`/apps?q=${I(d.value)}`)}const{mutate:re}=Me({document:We,appApi:!0});function pe(e){e.isUninstalling=!0,ee(B("confirm_uninstallation_on_phone")),re({id:e.id})}const{loading:_e,load:he,refetch:fe}=Re({handle:(e,l)=>{if(e)for(const u of e.packageStatuses)u.exist||(it(c.value,u.id),ee(""))},document:Ye,variables:()=>({ids:c.value.filter(e=>e.isUninstalling).map(e=>e.id)}),appApi:!0}),H=e=>{e.status};return Ne(()=>{P.on("upload_task_done",H);let e=!0;setInterval(()=>{c.value.some(l=>l.isUninstalling)&&!_e.value&&(e?(he(),e=!1):fe())},1e3)}),Ge(()=>{P.off("upload_task_done",H)}),(e,l)=>{const u=ot,W=nt,me=be,ke=Ce,ve=lt,ge=at,ye=we,f=Ke("tooltip");return o(),i(q,null,[t("div",ct,[r(u,{current:()=>`${e.$t("page_title.apps")} (${n(k)})`},null,8,["current"]),n(N)?p((o(),i("button",{key:0,class:"icon-button",onClick:l[0]||(l[0]=_(s=>n(ae)(n(L),x.value),["stop"]))},[dt,r(W)])),[[f,e.$t("download")]]):T("",!0),t("button",{class:"icon-button",onClick:_(ie,["stop"]),style:{display:"none"}},[rt,A(" "+a(e.$t("install")),1)],8,ut),r(me,{ref_key:"searchInputRef",ref:Q,modelValue:d.value,"onUpdate:modelValue":l[2]||(l[2]=s=>d.value=s),search:E},{filters:je(()=>[t("div",pt,[t("div",_t,[p(t("md-outlined-text-field",{label:e.$t("keywords"),"onUpdate:modelValue":l[1]||(l[1]=s=>w.text=s),"keyup.enter":"applyAndDoSearch"},null,8,ht),[[Ze,w.text]])]),t("div",ft,[t("md-filled-button",{onClick:_(ue,["stop"])},a(e.$t("search")),9,mt)])])]),_:1},8,["modelValue"])]),r(ke,{limit:y,total:n(k),"all-checked-alert-visible":n(ne),"real-all-checked":n(L),"select-real-all":n(se),"clear-selection":n(z)},null,8,["total","all-checked-alert-visible","real-all-checked","select-real-all","clear-selection"]),t("div",kt,[t("table",vt,[t("thead",null,[t("tr",null,[t("th",null,[t("md-checkbox",{"touch-target":"wrapper",onChange:l[3]||(l[3]=(...s)=>n(M)&&n(M)(...s)),checked:n(F),indeterminate:!n(F)&&n(N)},null,40,gt)]),yt,t("th",null,a(e.$t("name")),1),$t,t("th",null,a(e.$t("size")),1),t("th",null,a(e.$t("type")),1),t("th",null,a(e.$t("installed_at")),1),t("th",null,a(e.$t("updated_at")),1)])]),t("tbody",null,[(o(!0),i(q,null,xe(c.value,s=>(o(),i("tr",{key:s.id,class:Xe({selected:s.checked}),onClick:_(v=>n(le)(s),["stop"])},[t("td",null,[t("md-checkbox",{"touch-target":"wrapper",onChange:l[4]||(l[4]=(...v)=>n(R)&&n(R)(...v)),checked:s.checked},null,40,Ct)]),t("td",null,[t("img",{width:"50",height:"50",src:s.icon},null,8,wt)]),t("td",null,[t("strong",St,a(s.name)+" ("+a(s.version)+")",1),r(ve,{id:s.id,raw:s},null,8,["id","raw"])]),t("td",At,[t("div",Dt,[s.isUninstalling?(o(),i(q,{key:0},[p(t("md-circular-progress",It,null,512),[[f,e.$t("uninstalling")]]),A(" "),t("md-outlined-button",{class:"btn-sm",onClick:_(v=>ce(s),["stop"])},a(e.$t("cancel")),9,Vt)],64)):p((o(),i("button",{key:1,class:"icon-button",onClick:_(v=>pe(s),["stop"])},[Tt,r(ge)],8,Ut)),[[f,e.$t("uninstall")]]),p((o(),i("button",{class:"icon-button",onClick:_(v=>n(oe)(s.path,`${s.name.replace(" ","")}-${s.id}.apk`),["stop"])},[Pt,r(W)],8,qt)),[[f,e.$t("download")]])])]),t("td",Qt,a(n(et)(s.size)),1),t("td",Bt,a(e.$t("app_type."+s.type)),1),t("td",Ft,[p((o(),i("span",null,[A(a(n(X)(s.installedAt)),1)])),[[f,n(Z)(s.installedAt)]])]),t("td",Lt,[p((o(),i("span",null,[A(a(n(X)(s.updatedAt)),1)])),[[f,n(Z)(s.updatedAt)]])])],10,bt))),128))]),c.value.length?T("",!0):(o(),i("tfoot",zt,[t("tr",null,[t("td",Mt,[t("div",Rt,a(e.$t(n(tt)(n(de)))),1)])])]))])]),n(k)>y?(o(),Ee(ye,{key:0,modelValue:S.value,"onUpdate:modelValue":l[5]||(l[5]=s=>S.value=s),total:n(k),limit:y},null,8,["modelValue","total"])):T("",!0),t("input",{ref_key:"fileInput",ref:V,style:{display:"none"},type:"file",accept:".apk",multiple:"",onChange:l[6]||(l[6]=(...s)=>n(b)&&n(b)(...s))},null,544)],64)}}});export{jt as default};
+import{u as $e,_ as be,a as Ce,b as we}from"./list-0feac61c.js";import{P,d as Se,ae as Ae,e as De,r as g,u as Ie,s as Ve,f as Ue,K as Te,af as qe,L as Pe,D as Qe,M as Be,ag as Fe,T as Y,g as Le,w as ze,i as Me,N as Re,O as Ne,Q as Ge,R as Ke,c as i,a as t,p as r,j as n,m as p,l as _,k as T,h as A,t as a,H as je,F as q,J as xe,S as Ee,x as He,ah as Je,ai as Oe,C as D,W as I,aj as We,ak as Ye,o,v as Ze,I as Xe,z as et,Y as Z,Z as X,$ as tt,al as st,am as nt,a5 as lt,ad as at}from"./index-82e633ff.js";import{_ as ot}from"./Breadcrumb-9ca58797.js";const ee=m=>{P.emit("tap_phone",m)};function it(m,V){const $=m.findIndex(b=>b.id===V);$!==-1&&m.splice($,1)}const ct={class:"v-toolbar"},dt=t("md-ripple",null,null,-1),ut=["onClick"],rt=t("md-ripple",null,null,-1),pt={class:"filters"},_t={class:"form-row"},ht=["label"],ft={class:"buttons"},mt=["onClick"],kt={class:"table-responsive"},vt={class:"table"},gt=["checked","indeterminate"],yt=t("th",null,null,-1),$t=t("th",null,null,-1),bt=["onClick"],Ct=["checked"],wt=["src"],St={class:"v-center"},At={class:"nowrap"},Dt={class:"action-btns"},It={indeterminate:"",class:"spinner-sm"},Vt=["onClick"],Ut=["onClick"],Tt=t("md-ripple",null,null,-1),qt=["onClick"],Pt=t("md-ripple",null,null,-1),Qt={class:"nowrap"},Bt={class:"nowrap"},Ft={class:"nowrap"},Lt={class:"nowrap"},zt={key:0},Mt={colspan:"8"},Rt={class:"no-data-placeholder"},y=50,jt=Se({__name:"AppsView",setup(m){var J,O;const{input:V,upload:$,uploadChanged:b}=Ae(),C=De(),c=g([]),Q=g(),{t:B}=Ie(),{app:te,urlTokenKey:U}=Ve(Ue()),w=Te({text:"",tags:[]}),{allChecked:F,realAllChecked:L,selectRealAll:se,allCheckedAlertVisible:ne,clearSelection:z,toggleAllChecked:M,toggleItemChecked:R,toggleRow:le,total:k,checked:N}=$e(c),{downloadItems:ae}=qe(U,Pe.PACKAGE,c,z,"apps.zip"),{downloadFile:oe}=st(U),G=Qe(),K=G.query,S=g(parseInt(((J=K.page)==null?void 0:J.toString())??"1")),d=g(Be(((O=K.q)==null?void 0:O.toString())??"")),j=Fe(d.value),h=G.params.type;h&&j.push({name:"type",op:"",value:h});const x=g(Y(j)),ie=()=>{$(te.value.downloadsDir)},ce=e=>{e.isUninstalling=!1},{loading:de}=Le({handle:(e,l)=>{l?He(B(l),"error"):e&&(c.value=e.packages.map(u=>({...u,checked:!1,icon:Je(U.value,"pkgicon://"+u.id)})),k.value=e.packageCount)},document:Oe,variables:()=>({offset:(S.value-1)*y,limit:y,query:x.value}),appApi:!0});ze(S,e=>{h?D(C,`/apps/${h}?page=${e}&q=${I(d.value)}`):D(C,`/apps?page=${e}&q=${I(d.value)}`)});function ue(){const e=[];w.text&&e.push({name:"text",op:"",value:w.text}),d.value=Y(e),E(),Q.value.dismiss()}function E(){h?D(C,`/apps/${h}?q=${I(d.value)}`):D(C,`/apps?q=${I(d.value)}`)}const{mutate:re}=Me({document:We,appApi:!0});function pe(e){e.isUninstalling=!0,ee(B("confirm_uninstallation_on_phone")),re({id:e.id})}const{loading:_e,load:he,refetch:fe}=Re({handle:(e,l)=>{if(e)for(const u of e.packageStatuses)u.exist||(it(c.value,u.id),ee(""))},document:Ye,variables:()=>({ids:c.value.filter(e=>e.isUninstalling).map(e=>e.id)}),appApi:!0}),H=e=>{e.status};return Ne(()=>{P.on("upload_task_done",H);let e=!0;setInterval(()=>{c.value.some(l=>l.isUninstalling)&&!_e.value&&(e?(he(),e=!1):fe())},1e3)}),Ge(()=>{P.off("upload_task_done",H)}),(e,l)=>{const u=ot,W=nt,me=be,ke=Ce,ve=lt,ge=at,ye=we,f=Ke("tooltip");return o(),i(q,null,[t("div",ct,[r(u,{current:()=>`${e.$t("page_title.apps")} (${n(k)})`},null,8,["current"]),n(N)?p((o(),i("button",{key:0,class:"icon-button",onClick:l[0]||(l[0]=_(s=>n(ae)(n(L),x.value),["stop"]))},[dt,r(W)])),[[f,e.$t("download")]]):T("",!0),t("button",{class:"icon-button",onClick:_(ie,["stop"]),style:{display:"none"}},[rt,A(" "+a(e.$t("install")),1)],8,ut),r(me,{ref_key:"searchInputRef",ref:Q,modelValue:d.value,"onUpdate:modelValue":l[2]||(l[2]=s=>d.value=s),search:E},{filters:je(()=>[t("div",pt,[t("div",_t,[p(t("md-outlined-text-field",{label:e.$t("keywords"),"onUpdate:modelValue":l[1]||(l[1]=s=>w.text=s),"keyup.enter":"applyAndDoSearch"},null,8,ht),[[Ze,w.text]])]),t("div",ft,[t("md-filled-button",{onClick:_(ue,["stop"])},a(e.$t("search")),9,mt)])])]),_:1},8,["modelValue"])]),r(ke,{limit:y,total:n(k),"all-checked-alert-visible":n(ne),"real-all-checked":n(L),"select-real-all":n(se),"clear-selection":n(z)},null,8,["total","all-checked-alert-visible","real-all-checked","select-real-all","clear-selection"]),t("div",kt,[t("table",vt,[t("thead",null,[t("tr",null,[t("th",null,[t("md-checkbox",{"touch-target":"wrapper",onChange:l[3]||(l[3]=(...s)=>n(M)&&n(M)(...s)),checked:n(F),indeterminate:!n(F)&&n(N)},null,40,gt)]),yt,t("th",null,a(e.$t("name")),1),$t,t("th",null,a(e.$t("size")),1),t("th",null,a(e.$t("type")),1),t("th",null,a(e.$t("installed_at")),1),t("th",null,a(e.$t("updated_at")),1)])]),t("tbody",null,[(o(!0),i(q,null,xe(c.value,s=>(o(),i("tr",{key:s.id,class:Xe({selected:s.checked}),onClick:_(v=>n(le)(s),["stop"])},[t("td",null,[t("md-checkbox",{"touch-target":"wrapper",onChange:l[4]||(l[4]=(...v)=>n(R)&&n(R)(...v)),checked:s.checked},null,40,Ct)]),t("td",null,[t("img",{width:"50",height:"50",src:s.icon},null,8,wt)]),t("td",null,[t("strong",St,a(s.name)+" ("+a(s.version)+")",1),r(ve,{id:s.id,raw:s},null,8,["id","raw"])]),t("td",At,[t("div",Dt,[s.isUninstalling?(o(),i(q,{key:0},[p(t("md-circular-progress",It,null,512),[[f,e.$t("uninstalling")]]),A(" "),t("md-outlined-button",{class:"btn-sm",onClick:_(v=>ce(s),["stop"])},a(e.$t("cancel")),9,Vt)],64)):p((o(),i("button",{key:1,class:"icon-button",onClick:_(v=>pe(s),["stop"])},[Tt,r(ge)],8,Ut)),[[f,e.$t("uninstall")]]),p((o(),i("button",{class:"icon-button",onClick:_(v=>n(oe)(s.path,`${s.name.replace(" ","")}-${s.id}.apk`),["stop"])},[Pt,r(W)],8,qt)),[[f,e.$t("download")]])])]),t("td",Qt,a(n(et)(s.size)),1),t("td",Bt,a(e.$t("app_type."+s.type)),1),t("td",Ft,[p((o(),i("span",null,[A(a(n(X)(s.installedAt)),1)])),[[f,n(Z)(s.installedAt)]])]),t("td",Lt,[p((o(),i("span",null,[A(a(n(X)(s.updatedAt)),1)])),[[f,n(Z)(s.updatedAt)]])])],10,bt))),128))]),c.value.length?T("",!0):(o(),i("tfoot",zt,[t("tr",null,[t("td",Mt,[t("div",Rt,a(e.$t(n(tt)(n(de)))),1)])])]))])]),n(k)>y?(o(),Ee(ye,{key:0,modelValue:S.value,"onUpdate:modelValue":l[5]||(l[5]=s=>S.value=s),total:n(k),limit:y},null,8,["modelValue","total"])):T("",!0),t("input",{ref_key:"fileInput",ref:V,style:{display:"none"},type:"file",accept:".apk",multiple:"",onChange:l[6]||(l[6]=(...s)=>n(b)&&n(b)(...s))},null,544)],64)}}});export{jt as default};
diff --git a/app/src/main/resources/web/assets/AudiosRootView-769d7423.js b/app/src/main/resources/web/assets/AudiosRootView-e00c6b00.js
similarity index 70%
rename from app/src/main/resources/web/assets/AudiosRootView-769d7423.js
rename to app/src/main/resources/web/assets/AudiosRootView-e00c6b00.js
index 7282512f..f911270a 100644
--- a/app/src/main/resources/web/assets/AudiosRootView-769d7423.js
+++ b/app/src/main/resources/web/assets/AudiosRootView-e00c6b00.js
@@ -1 +1 @@
-import{_ as g}from"./TagFilter.vuevuetypescriptsetuptruelang-d0de30fc.js";import{_ as k}from"./BucketFilter.vuevuetypescriptsetuptruelang-96d8b135.js";import{d as C,D as w,e as y,az as z,G as B,c as D,p as s,H as o,j as e,o as I,a,t as d,l as $,I as b,C as A}from"./index-a9bbc323.js";import{g as u,M}from"./splitpanes.es-37578c0b.js";import"./EditValueModal-8c79ab9c.js";import"./vee-validate.esm-d674d968.js";const N={class:"page-container"},S={class:"sidebar"},V={class:"nav-title"},O={class:"nav"},R=["onClick"],U={class:"main"},Q=C({__name:"AudiosRootView",setup(j){var r,_;const n=w(),m=y(),i=z(n.query),c=((r=i.find(t=>t.name==="tag"))==null?void 0:r.value)??"",l=((_=i.find(t=>t.name==="bucket_id"))==null?void 0:_.value)??"";function p(){A(m,"/audios")}return(t,q)=>{const f=k,h=g,v=B("router-view");return I(),D("div",N,[s(e(M),null,{default:o(()=>[s(e(u),{size:"20","min-size":"10"},{default:o(()=>[a("aside",S,[a("h2",V,d(t.$t("page_title.audios")),1),a("ul",O,[a("li",{onClick:$(p,["prevent"]),class:b({active:e(n).path==="/audios"&&!e(c)&&!e(l)})},d(t.$t("all")),11,R),s(f,{type:"AUDIO",selected:e(l)},null,8,["selected"])]),s(h,{type:"AUDIO",selected:e(c)},null,8,["selected"])])]),_:1}),s(e(u),null,{default:o(()=>[a("main",U,[s(v)])]),_:1})]),_:1})])}}});export{Q as default};
+import{_ as g}from"./TagFilter.vuevuetypescriptsetuptruelang-10776836.js";import{_ as k}from"./BucketFilter.vuevuetypescriptsetuptruelang-eff38890.js";import{d as C,D as w,e as y,az as z,G as B,c as D,p as s,H as o,j as e,o as I,a,t as d,l as $,I as b,C as A}from"./index-82e633ff.js";import{g as u,M}from"./splitpanes.es-de3e6852.js";import"./EditValueModal-df390030.js";import"./vee-validate.esm-6643484a.js";const N={class:"page-container"},S={class:"sidebar"},V={class:"nav-title"},O={class:"nav"},R=["onClick"],U={class:"main"},Q=C({__name:"AudiosRootView",setup(j){var r,_;const n=w(),m=y(),i=z(n.query),c=((r=i.find(t=>t.name==="tag"))==null?void 0:r.value)??"",l=((_=i.find(t=>t.name==="bucket_id"))==null?void 0:_.value)??"";function p(){A(m,"/audios")}return(t,q)=>{const f=k,h=g,v=B("router-view");return I(),D("div",N,[s(e(M),null,{default:o(()=>[s(e(u),{size:"20","min-size":"10"},{default:o(()=>[a("aside",S,[a("h2",V,d(t.$t("page_title.audios")),1),a("ul",O,[a("li",{onClick:$(p,["prevent"]),class:b({active:e(n).path==="/audios"&&!e(c)&&!e(l)})},d(t.$t("all")),11,R),s(f,{type:"AUDIO",selected:e(l)},null,8,["selected"])]),s(h,{type:"AUDIO",selected:e(c)},null,8,["selected"])])]),_:1}),s(e(u),null,{default:o(()=>[a("main",U,[s(v)])]),_:1})]),_:1})])}}});export{Q as default};
diff --git a/app/src/main/resources/web/assets/AudiosView-ec119daa.js b/app/src/main/resources/web/assets/AudiosView-5ef27725.js
similarity index 96%
rename from app/src/main/resources/web/assets/AudiosView-ec119daa.js
rename to app/src/main/resources/web/assets/AudiosView-5ef27725.js
index b4c9e3a5..a56dc2cf 100644
--- a/app/src/main/resources/web/assets/AudiosView-ec119daa.js
+++ b/app/src/main/resources/web/assets/AudiosView-5ef27725.js
@@ -1 +1 @@
-import{u as Ge,_ as Ke,a as Oe,b as je}from"./list-be40ed35.js";import{o as l,c as a,a as e,i as ce,aL as We,u as ue,P as b,x as _e,r as D,aM as xe,d as Je,e as Xe,s as le,f as Ye,K as et,L as tt,D as ot,M as st,aB as nt,af as lt,aA as at,N as it,w as dt,O as ct,Q as ut,R as _t,p as d,j as o,F as P,m,l as h,k as F,H,t as f,J as N,S as rt,T as pt,U as mt,aN as ht,C as ae,W as ie,at as ft,v as vt,I as gt,aF as yt,a9 as bt,z as kt,$ as $t,A as Tt,B as qt,al as Ct,aG as wt,as as It,aH as At,a0 as St,a1 as Bt,a2 as Dt,a3 as Vt,ad as Rt,am as Mt,a4 as Pt,a5 as Zt,a6 as Et,_ as Lt}from"./index-a9bbc323.js";import{_ as Qt}from"./sort-rounded-a0681bba.js";import{_ as zt}from"./upload-rounded-8f3d4361.js";import{_ as Ft}from"./Breadcrumb-7b5128ab.js";import{u as Ht,a as Nt}from"./tags-7e5964e8.js";import"./vee-validate.esm-d674d968.js";const Ut={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Gt=e("path",{fill:"currentColor",d:"M9.5 9.325v5.35q0 .6.525.875t1.025-.05l4.15-2.65q.475-.275.475-.85t-.475-.85L11.05 8.5q-.5-.325-1.025-.05t-.525.875ZM12 22q-2.075 0-3.9-.788t-3.175-2.137q-1.35-1.35-2.137-3.175T2 12q0-2.075.788-3.9t2.137-3.175q1.35-1.35 3.175-2.137T12 2q2.075 0 3.9.788t3.175 2.137q1.35 1.35 2.138 3.175T22 12q0 2.075-.788 3.9t-2.137 3.175q-1.35 1.35-3.175 2.138T12 22Zm0-10Zm0 8q3.325 0 5.663-2.337T20 12q0-3.325-2.337-5.663T12 4Q8.675 4 6.337 6.337T4 12q0 3.325 2.337 5.663T12 20Z"},null,-1),Kt=[Gt];function Ot(c,v){return l(),a("svg",Ut,Kt)}const jt={name:"material-symbols-play-circle-outline-rounded",render:Ot},Wt={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},xt=e("path",{fill:"currentColor",d:"M10 16q.425 0 .713-.288T11 15V8.975q0-.425-.288-.7T10 8q-.425 0-.713.288T9 9v6.025q0 .425.288.7T10 16Zm4 0q.425 0 .713-.288T15 15V8.975q0-.425-.288-.7T14 8q-.425 0-.713.288T13 9v6.025q0 .425.288.7T14 16Zm-2 6q-2.075 0-3.9-.788t-3.175-2.137q-1.35-1.35-2.137-3.175T2 12q0-2.075.788-3.9t2.137-3.175q1.35-1.35 3.175-2.137T12 2q2.075 0 3.9.788t3.175 2.137q1.35 1.35 2.138 3.175T22 12q0 2.075-.788 3.9t-2.137 3.175q-1.35 1.35-3.175 2.138T12 22Zm0-10Zm0 8q3.325 0 5.663-2.337T20 12q0-3.325-2.337-5.663T12 4Q8.675 4 6.337 6.337T4 12q0 3.325 2.337 5.663T12 20Z"},null,-1),Jt=[xt];function Xt(c,v){return l(),a("svg",Wt,Jt)}const Yt={name:"material-symbols-pause-circle-outline-rounded",render:Xt},eo={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},to=e("path",{fill:"currentColor",d:"M3 16v-2h7v2H3Zm0-4v-2h11v2H3Zm0-4V6h11v2H3Zm13 12v-4h-4v-2h4v-4h2v4h4v2h-4v4h-2Z"},null,-1),oo=[to];function so(c,v){return l(),a("svg",eo,oo)}const no={name:"material-symbols-playlist-add",render:so};function de(c,v,k=500){const i=c.cloneNode(!0),_=c.getBoundingClientRect(),C=v.getBoundingClientRect();i.style.position="absolute",i.style.top=_.top+"px",i.style.left=_.left+"px",i.style.opacity=1,document.body.appendChild(i);let $=0;function T(q){$||($=q);const u=q-$,w=Math.min(u/k,1);i.style.top=_.top+(C.top-_.top)*w+"px",i.style.left=_.left+(C.left-_.left)*w+"px",w<1?requestAnimationFrame(T):document.body.removeChild(i)}requestAnimationFrame(T)}const lo=(c,v)=>{const{mutate:k,loading:i,onDone:_}=ce({document:We,appApi:!0}),{t:C}=ue();return _(()=>{b.emit("refetch_app"),v()}),{loading:i,addItemsToPlaylist:($,T,q)=>{let u=q;if(!T){const Q=c.value.filter(I=>I.checked);if(Q.length===0){_e(C("select_first"),"error");return}u=`ids:${Q.map(I=>I.id).join(",")}`}const w=$.target,g=document.getElementById("quick-audio");de(w,g),k({query:u})},addToPlaylist:($,T)=>{const q=$.target,u=document.getElementById("quick-audio");de(q,u),k({query:`ids:${T.id}`})}}},ao=()=>{const c=D(""),{mutate:v,loading:k,onDone:i}=ce({document:xe,appApi:!0});return i(()=>{b.emit("play_audio")}),{loading:k,playPath:c,play:_=>{c.value=_.path,v({path:_.path})},pause:()=>{b.emit("pause_audio")}}},p=c=>(Tt("data-v-dd874a81"),c=c(),qt(),c),io={class:"v-toolbar"},co=p(()=>e("md-ripple",null,null,-1)),uo=p(()=>e("md-ripple",null,null,-1)),_o=p(()=>e("md-ripple",null,null,-1)),ro=p(()=>e("md-ripple",null,null,-1)),po=["onClick"],mo=p(()=>e("md-ripple",null,null,-1)),ho={class:"icon-button btn-sort"},fo=p(()=>e("md-ripple",null,null,-1)),vo={class:"menu-items"},go=["onClick","selected"],yo={slot:"headline"},bo={class:"filters"},ko=["label"],$o={class:"form-label"},To=["label","selected","onClick"],qo={class:"buttons"},Co=["onClick"],wo={class:"table-responsive"},Io={class:"table"},Ao=["checked","indeterminate"],So=p(()=>e("th",null,"ID",-1)),Bo=p(()=>e("th",null,null,-1)),Do={class:"artist"},Vo=["onClick"],Ro=["checked"],Mo={class:"title"},Po={class:"nowrap"},Zo={class:"action-btns"},Eo=["onClick"],Lo=p(()=>e("md-ripple",null,null,-1)),Qo=["onClick"],zo=p(()=>e("md-ripple",null,null,-1)),Fo=["onClick"],Ho=p(()=>e("md-ripple",null,null,-1)),No=["onClick"],Uo=p(()=>e("md-ripple",null,null,-1)),Go={key:0,indeterminate:"",class:"spinner-sm"},Ko=p(()=>e("md-ripple",null,null,-1)),Oo=["onClick"],jo=p(()=>e("md-ripple",null,null,-1)),Wo={class:"nowrap"},xo={class:"nowrap"},Jo={key:0},Xo={colspan:"8"},Yo={class:"no-data-placeholder"},Z=50,es=Je({__name:"AudiosView",setup(c){var Y,ee;const v=Xe(),{audioSortBy:k}=le(v),i=D([]),_=D(),{t:C}=ue(),{app:$,urlTokenKey:T,audioPlaying:q}=le(Ye()),u=et({text:"",tags:[]}),w=t=>{var n;return q.value&&((n=$.value)==null?void 0:n.audioCurrent)===t.path},g=tt.AUDIO,I=ot().query,E=D(parseInt(((Y=I.page)==null?void 0:Y.toString())??"1")),A=D(st(((ee=I.q)==null?void 0:ee.toString())??"")),S=D(""),{tags:L}=Ht(g,A,u,async t=>{S.value=pt(t),await mt(),Se()}),{addToTags:re}=Nt(g,i,L),{deleteItems:pe,deleteItem:me}=nt(),{allChecked:U,realAllChecked:V,selectRealAll:he,allCheckedAlertVisible:fe,clearSelection:R,toggleAllChecked:G,toggleRow:ve,toggleItemChecked:K,total:B,checked:O}=Ge(i),{downloadItems:ge}=lt(T,g,i,R,"audios.zip"),{downloadFile:ye}=Ct(T),{addItemsToPlaylist:be,addToPlaylist:ke}=lo(i,R),$e=wt(),Te=at(),{play:qe,playPath:Ce,loading:we,pause:Ie}=ao(),{loading:Ae,load:Se,refetch:z}=it({handle:(t,n)=>{n?_e(C(n),"error"):t&&(i.value=t.audios.map(M=>({...M,checked:!1})),B.value=t.audioCount)},document:ht,variables:()=>({offset:(E.value-1)*Z,limit:Z,query:S.value,sortBy:k.value}),appApi:!0});dt(E,t=>{ae(v,`/audios?page=${t}&q=${ie(A.value)}`)});function Be(){Te.push("/files"),It(At,{message:C("upload_audios")})}function De(t,n){k.value=n,t.close()}function Ve(t){u.tags.includes(t)?St(u.tags,n=>n.id===t.id):u.tags.push(t)}function Re(){A.value=Bt(u),j(),_.value.dismiss()}function j(){ae(v,`/audios?q=${ie(A.value)}`)}const W=t=>{t.type===g&&(R(),z())},x=t=>{t.type===g&&z()},J=t=>{t.type===g&&(R(),z())},X=()=>{B.value--};ct(()=>{b.on("item_tags_updated",x),b.on("items_tags_updated",W),b.on("media_item_deleted",X),b.on("media_items_deleted",J)}),ut(()=>{b.off("item_tags_updated",x),b.off("items_tags_updated",W),b.off("media_item_deleted",X),b.off("media_items_deleted",J)});function Me(t){Dt(Vt,{type:g,tags:L.value,item:{key:t.id,title:t.title,size:t.size},selected:L.value.filter(n=>t.tags.some(M=>M.id===n.id))})}return(t,n)=>{const M=Ft,te=Rt,oe=Mt,se=no,ne=Pt,Pe=zt,Ze=Qt,Ee=ft,Le=Ke,Qe=Oe,ze=Zt,Fe=Yt,He=jt,Ne=Et,Ue=je,y=_t("tooltip");return l(),a(P,null,[e("div",io,[d(M,{current:()=>`${t.$t("page_title.audios")} (${o(B)})`},null,8,["current"]),o(O)?(l(),a(P,{key:0},[m((l(),a("button",{class:"icon-button",onClick:n[0]||(n[0]=h(s=>o(pe)(o(g),i.value,o(V),S.value),["stop"]))},[co,d(te)])),[[y,t.$t("delete")]]),m((l(),a("button",{class:"icon-button",onClick:n[1]||(n[1]=h(s=>o(ge)(o(V),S.value),["stop"]))},[uo,d(oe)])),[[y,t.$t("download")]]),m((l(),a("button",{class:"icon-button",onClick:n[2]||(n[2]=h(s=>o(be)(s,o(V),S.value),["stop"]))},[_o,d(se)])),[[y,t.$t("add_to_playlist")]]),m((l(),a("button",{class:"icon-button",onClick:n[3]||(n[3]=h(s=>o(re)(o(V),S.value),["stop"]))},[ro,d(ne)])),[[y,t.$t("add_to_tags")]])],64)):F("",!0),m((l(),a("button",{class:"icon-button",onClick:h(Be,["stop"])},[mo,d(Pe)],8,po)),[[y,t.$t("upload")]]),d(Ee,null,{content:H(s=>[e("div",vo,[(l(!0),a(P,null,N(o($e),r=>(l(),a("md-menu-item",{onClick:ts=>De(s,r.value),selected:r.value===o(k)},[e("div",yo,f(t.$t(r.label)),1)],8,go))),256))])]),default:H(()=>[m((l(),a("button",ho,[fo,d(Ze)])),[[y,t.$t("sort")]])]),_:1}),d(Le,{ref_key:"searchInputRef",ref:_,modelValue:A.value,"onUpdate:modelValue":n[5]||(n[5]=s=>A.value=s),search:j},{filters:H(()=>[e("div",bo,[m(e("md-outlined-text-field",{label:t.$t("keywords"),"onUpdate:modelValue":n[4]||(n[4]=s=>u.text=s),"keyup.enter":"applyAndDoSearch"},null,8,ko),[[vt,u.text]]),e("label",$o,f(t.$t("tags")),1),e("md-chip-set",null,[(l(!0),a(P,null,N(o(L),s=>(l(),a("md-filter-chip",{key:s.id,label:s.name,selected:u.tags.includes(s),onClick:r=>Ve(s)},null,8,To))),128))]),e("div",qo,[e("md-filled-button",{onClick:h(Re,["stop"])},f(t.$t("search")),9,Co)])])]),_:1},8,["modelValue"])]),d(Qe,{limit:Z,total:o(B),"all-checked-alert-visible":o(fe),"real-all-checked":o(V),"select-real-all":o(he),"clear-selection":o(R)},null,8,["total","all-checked-alert-visible","real-all-checked","select-real-all","clear-selection"]),e("div",wo,[e("table",Io,[e("thead",null,[e("tr",null,[e("th",null,[e("md-checkbox",{"touch-target":"wrapper",onChange:n[6]||(n[6]=(...s)=>o(G)&&o(G)(...s)),checked:o(U),indeterminate:!o(U)&&o(O)},null,40,Ao)]),So,e("th",null,f(t.$t("name")),1),Bo,e("th",Do,f(t.$t("artist")),1),e("th",null,f(t.$t("tags")),1),e("th",null,f(t.$t("duration")),1),e("th",null,f(t.$t("file_size")),1)])]),e("tbody",null,[(l(!0),a(P,null,N(i.value,s=>(l(),a("tr",{key:s.id,class:gt({selected:s.checked}),onClick:h(r=>o(ve)(s),["stop"])},[e("td",null,[e("md-checkbox",{"touch-target":"wrapper",onChange:n[7]||(n[7]=(...r)=>o(K)&&o(K)(...r)),checked:s.checked},null,40,Ro)]),e("td",null,[d(ze,{id:s.id,raw:s},null,8,["id","raw"])]),e("td",Mo,f(s.title),1),e("td",Po,[e("div",Zo,[m((l(),a("button",{class:"icon-button",onClick:h(r=>o(me)(o(g),s),["stop"])},[Lo,d(te)],8,Eo)),[[y,t.$t("delete")]]),m((l(),a("button",{class:"icon-button",onClick:h(r=>o(ye)(s.path,o(yt)(s.path).replace(" ","-")),["stop"])},[zo,d(oe)],8,Qo)),[[y,t.$t("download")]]),m((l(),a("button",{class:"icon-button",onClick:h(r=>o(ke)(r,s),["stop"])},[Ho,d(se)],8,Fo)),[[y,t.$t("add_to_playlist")]]),m((l(),a("button",{class:"icon-button",onClick:h(r=>Me(s),["stop"])},[Uo,d(ne)],8,No)),[[y,t.$t("add_to_tags")]]),o(we)&&s.path===o(Ce)?(l(),a("md-circular-progress",Go)):w(s)?m((l(),a("button",{key:1,class:"icon-button",onClick:n[8]||(n[8]=h(r=>o(Ie)(),["stop"]))},[Ko,d(Fe)])),[[y,t.$t("pause")]]):m((l(),a("button",{key:2,class:"icon-button",onClick:h(r=>o(qe)(s),["stop"])},[jo,d(He)],8,Oo)),[[y,t.$t("play")]])])]),e("td",null,f(s.artist),1),e("td",null,[d(Ne,{tags:s.tags,type:o(g)},null,8,["tags","type"])]),e("td",Wo,f(o(bt)(s.duration)),1),e("td",xo,f(o(kt)(s.size)),1)],10,Vo))),128))]),i.value.length?F("",!0):(l(),a("tfoot",Jo,[e("tr",null,[e("td",Xo,[e("div",Yo,f(t.$t(o($t)(o(Ae),o($).permissions,"WRITE_EXTERNAL_STORAGE"))),1)])])]))])]),o(B)>Z?(l(),rt(Ue,{key:0,modelValue:E.value,"onUpdate:modelValue":n[9]||(n[9]=s=>E.value=s),total:o(B),limit:Z},null,8,["modelValue","total"])):F("",!0)],64)}}});const cs=Lt(es,[["__scopeId","data-v-dd874a81"]]);export{cs as default};
+import{u as Ge,_ as Ke,a as Oe,b as je}from"./list-0feac61c.js";import{o as l,c as a,a as e,i as ce,aL as We,u as ue,P as b,x as _e,r as D,aM as xe,d as Je,e as Xe,s as le,f as Ye,K as et,L as tt,D as ot,M as st,aB as nt,af as lt,aA as at,N as it,w as dt,O as ct,Q as ut,R as _t,p as d,j as o,F as P,m,l as h,k as F,H,t as f,J as N,S as rt,T as pt,U as mt,aN as ht,C as ae,W as ie,at as ft,v as vt,I as gt,aF as yt,a9 as bt,z as kt,$ as $t,A as Tt,B as qt,al as Ct,aG as wt,as as It,aH as At,a0 as St,a1 as Bt,a2 as Dt,a3 as Vt,ad as Rt,am as Mt,a4 as Pt,a5 as Zt,a6 as Et,_ as Lt}from"./index-82e633ff.js";import{_ as Qt}from"./sort-rounded-36348883.js";import{_ as zt}from"./upload-rounded-b7b0e642.js";import{_ as Ft}from"./Breadcrumb-9ca58797.js";import{u as Ht,a as Nt}from"./tags-dce7ef69.js";import"./vee-validate.esm-6643484a.js";const Ut={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Gt=e("path",{fill:"currentColor",d:"M9.5 9.325v5.35q0 .6.525.875t1.025-.05l4.15-2.65q.475-.275.475-.85t-.475-.85L11.05 8.5q-.5-.325-1.025-.05t-.525.875ZM12 22q-2.075 0-3.9-.788t-3.175-2.137q-1.35-1.35-2.137-3.175T2 12q0-2.075.788-3.9t2.137-3.175q1.35-1.35 3.175-2.137T12 2q2.075 0 3.9.788t3.175 2.137q1.35 1.35 2.138 3.175T22 12q0 2.075-.788 3.9t-2.137 3.175q-1.35 1.35-3.175 2.138T12 22Zm0-10Zm0 8q3.325 0 5.663-2.337T20 12q0-3.325-2.337-5.663T12 4Q8.675 4 6.337 6.337T4 12q0 3.325 2.337 5.663T12 20Z"},null,-1),Kt=[Gt];function Ot(c,v){return l(),a("svg",Ut,Kt)}const jt={name:"material-symbols-play-circle-outline-rounded",render:Ot},Wt={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},xt=e("path",{fill:"currentColor",d:"M10 16q.425 0 .713-.288T11 15V8.975q0-.425-.288-.7T10 8q-.425 0-.713.288T9 9v6.025q0 .425.288.7T10 16Zm4 0q.425 0 .713-.288T15 15V8.975q0-.425-.288-.7T14 8q-.425 0-.713.288T13 9v6.025q0 .425.288.7T14 16Zm-2 6q-2.075 0-3.9-.788t-3.175-2.137q-1.35-1.35-2.137-3.175T2 12q0-2.075.788-3.9t2.137-3.175q1.35-1.35 3.175-2.137T12 2q2.075 0 3.9.788t3.175 2.137q1.35 1.35 2.138 3.175T22 12q0 2.075-.788 3.9t-2.137 3.175q-1.35 1.35-3.175 2.138T12 22Zm0-10Zm0 8q3.325 0 5.663-2.337T20 12q0-3.325-2.337-5.663T12 4Q8.675 4 6.337 6.337T4 12q0 3.325 2.337 5.663T12 20Z"},null,-1),Jt=[xt];function Xt(c,v){return l(),a("svg",Wt,Jt)}const Yt={name:"material-symbols-pause-circle-outline-rounded",render:Xt},eo={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},to=e("path",{fill:"currentColor",d:"M3 16v-2h7v2H3Zm0-4v-2h11v2H3Zm0-4V6h11v2H3Zm13 12v-4h-4v-2h4v-4h2v4h4v2h-4v4h-2Z"},null,-1),oo=[to];function so(c,v){return l(),a("svg",eo,oo)}const no={name:"material-symbols-playlist-add",render:so};function de(c,v,k=500){const i=c.cloneNode(!0),_=c.getBoundingClientRect(),C=v.getBoundingClientRect();i.style.position="absolute",i.style.top=_.top+"px",i.style.left=_.left+"px",i.style.opacity=1,document.body.appendChild(i);let $=0;function T(q){$||($=q);const u=q-$,w=Math.min(u/k,1);i.style.top=_.top+(C.top-_.top)*w+"px",i.style.left=_.left+(C.left-_.left)*w+"px",w<1?requestAnimationFrame(T):document.body.removeChild(i)}requestAnimationFrame(T)}const lo=(c,v)=>{const{mutate:k,loading:i,onDone:_}=ce({document:We,appApi:!0}),{t:C}=ue();return _(()=>{b.emit("refetch_app"),v()}),{loading:i,addItemsToPlaylist:($,T,q)=>{let u=q;if(!T){const Q=c.value.filter(I=>I.checked);if(Q.length===0){_e(C("select_first"),"error");return}u=`ids:${Q.map(I=>I.id).join(",")}`}const w=$.target,g=document.getElementById("quick-audio");de(w,g),k({query:u})},addToPlaylist:($,T)=>{const q=$.target,u=document.getElementById("quick-audio");de(q,u),k({query:`ids:${T.id}`})}}},ao=()=>{const c=D(""),{mutate:v,loading:k,onDone:i}=ce({document:xe,appApi:!0});return i(()=>{b.emit("play_audio")}),{loading:k,playPath:c,play:_=>{c.value=_.path,v({path:_.path})},pause:()=>{b.emit("pause_audio")}}},p=c=>(Tt("data-v-dd874a81"),c=c(),qt(),c),io={class:"v-toolbar"},co=p(()=>e("md-ripple",null,null,-1)),uo=p(()=>e("md-ripple",null,null,-1)),_o=p(()=>e("md-ripple",null,null,-1)),ro=p(()=>e("md-ripple",null,null,-1)),po=["onClick"],mo=p(()=>e("md-ripple",null,null,-1)),ho={class:"icon-button btn-sort"},fo=p(()=>e("md-ripple",null,null,-1)),vo={class:"menu-items"},go=["onClick","selected"],yo={slot:"headline"},bo={class:"filters"},ko=["label"],$o={class:"form-label"},To=["label","selected","onClick"],qo={class:"buttons"},Co=["onClick"],wo={class:"table-responsive"},Io={class:"table"},Ao=["checked","indeterminate"],So=p(()=>e("th",null,"ID",-1)),Bo=p(()=>e("th",null,null,-1)),Do={class:"artist"},Vo=["onClick"],Ro=["checked"],Mo={class:"title"},Po={class:"nowrap"},Zo={class:"action-btns"},Eo=["onClick"],Lo=p(()=>e("md-ripple",null,null,-1)),Qo=["onClick"],zo=p(()=>e("md-ripple",null,null,-1)),Fo=["onClick"],Ho=p(()=>e("md-ripple",null,null,-1)),No=["onClick"],Uo=p(()=>e("md-ripple",null,null,-1)),Go={key:0,indeterminate:"",class:"spinner-sm"},Ko=p(()=>e("md-ripple",null,null,-1)),Oo=["onClick"],jo=p(()=>e("md-ripple",null,null,-1)),Wo={class:"nowrap"},xo={class:"nowrap"},Jo={key:0},Xo={colspan:"8"},Yo={class:"no-data-placeholder"},Z=50,es=Je({__name:"AudiosView",setup(c){var Y,ee;const v=Xe(),{audioSortBy:k}=le(v),i=D([]),_=D(),{t:C}=ue(),{app:$,urlTokenKey:T,audioPlaying:q}=le(Ye()),u=et({text:"",tags:[]}),w=t=>{var n;return q.value&&((n=$.value)==null?void 0:n.audioCurrent)===t.path},g=tt.AUDIO,I=ot().query,E=D(parseInt(((Y=I.page)==null?void 0:Y.toString())??"1")),A=D(st(((ee=I.q)==null?void 0:ee.toString())??"")),S=D(""),{tags:L}=Ht(g,A,u,async t=>{S.value=pt(t),await mt(),Se()}),{addToTags:re}=Nt(g,i,L),{deleteItems:pe,deleteItem:me}=nt(),{allChecked:U,realAllChecked:V,selectRealAll:he,allCheckedAlertVisible:fe,clearSelection:R,toggleAllChecked:G,toggleRow:ve,toggleItemChecked:K,total:B,checked:O}=Ge(i),{downloadItems:ge}=lt(T,g,i,R,"audios.zip"),{downloadFile:ye}=Ct(T),{addItemsToPlaylist:be,addToPlaylist:ke}=lo(i,R),$e=wt(),Te=at(),{play:qe,playPath:Ce,loading:we,pause:Ie}=ao(),{loading:Ae,load:Se,refetch:z}=it({handle:(t,n)=>{n?_e(C(n),"error"):t&&(i.value=t.audios.map(M=>({...M,checked:!1})),B.value=t.audioCount)},document:ht,variables:()=>({offset:(E.value-1)*Z,limit:Z,query:S.value,sortBy:k.value}),appApi:!0});dt(E,t=>{ae(v,`/audios?page=${t}&q=${ie(A.value)}`)});function Be(){Te.push("/files"),It(At,{message:C("upload_audios")})}function De(t,n){k.value=n,t.close()}function Ve(t){u.tags.includes(t)?St(u.tags,n=>n.id===t.id):u.tags.push(t)}function Re(){A.value=Bt(u),j(),_.value.dismiss()}function j(){ae(v,`/audios?q=${ie(A.value)}`)}const W=t=>{t.type===g&&(R(),z())},x=t=>{t.type===g&&z()},J=t=>{t.type===g&&(R(),z())},X=()=>{B.value--};ct(()=>{b.on("item_tags_updated",x),b.on("items_tags_updated",W),b.on("media_item_deleted",X),b.on("media_items_deleted",J)}),ut(()=>{b.off("item_tags_updated",x),b.off("items_tags_updated",W),b.off("media_item_deleted",X),b.off("media_items_deleted",J)});function Me(t){Dt(Vt,{type:g,tags:L.value,item:{key:t.id,title:t.title,size:t.size},selected:L.value.filter(n=>t.tags.some(M=>M.id===n.id))})}return(t,n)=>{const M=Ft,te=Rt,oe=Mt,se=no,ne=Pt,Pe=zt,Ze=Qt,Ee=ft,Le=Ke,Qe=Oe,ze=Zt,Fe=Yt,He=jt,Ne=Et,Ue=je,y=_t("tooltip");return l(),a(P,null,[e("div",io,[d(M,{current:()=>`${t.$t("page_title.audios")} (${o(B)})`},null,8,["current"]),o(O)?(l(),a(P,{key:0},[m((l(),a("button",{class:"icon-button",onClick:n[0]||(n[0]=h(s=>o(pe)(o(g),i.value,o(V),S.value),["stop"]))},[co,d(te)])),[[y,t.$t("delete")]]),m((l(),a("button",{class:"icon-button",onClick:n[1]||(n[1]=h(s=>o(ge)(o(V),S.value),["stop"]))},[uo,d(oe)])),[[y,t.$t("download")]]),m((l(),a("button",{class:"icon-button",onClick:n[2]||(n[2]=h(s=>o(be)(s,o(V),S.value),["stop"]))},[_o,d(se)])),[[y,t.$t("add_to_playlist")]]),m((l(),a("button",{class:"icon-button",onClick:n[3]||(n[3]=h(s=>o(re)(o(V),S.value),["stop"]))},[ro,d(ne)])),[[y,t.$t("add_to_tags")]])],64)):F("",!0),m((l(),a("button",{class:"icon-button",onClick:h(Be,["stop"])},[mo,d(Pe)],8,po)),[[y,t.$t("upload")]]),d(Ee,null,{content:H(s=>[e("div",vo,[(l(!0),a(P,null,N(o($e),r=>(l(),a("md-menu-item",{onClick:ts=>De(s,r.value),selected:r.value===o(k)},[e("div",yo,f(t.$t(r.label)),1)],8,go))),256))])]),default:H(()=>[m((l(),a("button",ho,[fo,d(Ze)])),[[y,t.$t("sort")]])]),_:1}),d(Le,{ref_key:"searchInputRef",ref:_,modelValue:A.value,"onUpdate:modelValue":n[5]||(n[5]=s=>A.value=s),search:j},{filters:H(()=>[e("div",bo,[m(e("md-outlined-text-field",{label:t.$t("keywords"),"onUpdate:modelValue":n[4]||(n[4]=s=>u.text=s),"keyup.enter":"applyAndDoSearch"},null,8,ko),[[vt,u.text]]),e("label",$o,f(t.$t("tags")),1),e("md-chip-set",null,[(l(!0),a(P,null,N(o(L),s=>(l(),a("md-filter-chip",{key:s.id,label:s.name,selected:u.tags.includes(s),onClick:r=>Ve(s)},null,8,To))),128))]),e("div",qo,[e("md-filled-button",{onClick:h(Re,["stop"])},f(t.$t("search")),9,Co)])])]),_:1},8,["modelValue"])]),d(Qe,{limit:Z,total:o(B),"all-checked-alert-visible":o(fe),"real-all-checked":o(V),"select-real-all":o(he),"clear-selection":o(R)},null,8,["total","all-checked-alert-visible","real-all-checked","select-real-all","clear-selection"]),e("div",wo,[e("table",Io,[e("thead",null,[e("tr",null,[e("th",null,[e("md-checkbox",{"touch-target":"wrapper",onChange:n[6]||(n[6]=(...s)=>o(G)&&o(G)(...s)),checked:o(U),indeterminate:!o(U)&&o(O)},null,40,Ao)]),So,e("th",null,f(t.$t("name")),1),Bo,e("th",Do,f(t.$t("artist")),1),e("th",null,f(t.$t("tags")),1),e("th",null,f(t.$t("duration")),1),e("th",null,f(t.$t("file_size")),1)])]),e("tbody",null,[(l(!0),a(P,null,N(i.value,s=>(l(),a("tr",{key:s.id,class:gt({selected:s.checked}),onClick:h(r=>o(ve)(s),["stop"])},[e("td",null,[e("md-checkbox",{"touch-target":"wrapper",onChange:n[7]||(n[7]=(...r)=>o(K)&&o(K)(...r)),checked:s.checked},null,40,Ro)]),e("td",null,[d(ze,{id:s.id,raw:s},null,8,["id","raw"])]),e("td",Mo,f(s.title),1),e("td",Po,[e("div",Zo,[m((l(),a("button",{class:"icon-button",onClick:h(r=>o(me)(o(g),s),["stop"])},[Lo,d(te)],8,Eo)),[[y,t.$t("delete")]]),m((l(),a("button",{class:"icon-button",onClick:h(r=>o(ye)(s.path,o(yt)(s.path).replace(" ","-")),["stop"])},[zo,d(oe)],8,Qo)),[[y,t.$t("download")]]),m((l(),a("button",{class:"icon-button",onClick:h(r=>o(ke)(r,s),["stop"])},[Ho,d(se)],8,Fo)),[[y,t.$t("add_to_playlist")]]),m((l(),a("button",{class:"icon-button",onClick:h(r=>Me(s),["stop"])},[Uo,d(ne)],8,No)),[[y,t.$t("add_to_tags")]]),o(we)&&s.path===o(Ce)?(l(),a("md-circular-progress",Go)):w(s)?m((l(),a("button",{key:1,class:"icon-button",onClick:n[8]||(n[8]=h(r=>o(Ie)(),["stop"]))},[Ko,d(Fe)])),[[y,t.$t("pause")]]):m((l(),a("button",{key:2,class:"icon-button",onClick:h(r=>o(qe)(s),["stop"])},[jo,d(He)],8,Oo)),[[y,t.$t("play")]])])]),e("td",null,f(s.artist),1),e("td",null,[d(Ne,{tags:s.tags,type:o(g)},null,8,["tags","type"])]),e("td",Wo,f(o(bt)(s.duration)),1),e("td",xo,f(o(kt)(s.size)),1)],10,Vo))),128))]),i.value.length?F("",!0):(l(),a("tfoot",Jo,[e("tr",null,[e("td",Xo,[e("div",Yo,f(t.$t(o($t)(o(Ae),o($).permissions,"WRITE_EXTERNAL_STORAGE"))),1)])])]))])]),o(B)>Z?(l(),rt(Ue,{key:0,modelValue:E.value,"onUpdate:modelValue":n[9]||(n[9]=s=>E.value=s),total:o(B),limit:Z},null,8,["modelValue","total"])):F("",!0)],64)}}});const cs=Lt(es,[["__scopeId","data-v-dd874a81"]]);export{cs as default};
diff --git a/app/src/main/resources/web/assets/Breadcrumb-7b5128ab.js b/app/src/main/resources/web/assets/Breadcrumb-9ca58797.js
similarity index 81%
rename from app/src/main/resources/web/assets/Breadcrumb-7b5128ab.js
rename to app/src/main/resources/web/assets/Breadcrumb-9ca58797.js
index 5d4eca65..e829bb02 100644
--- a/app/src/main/resources/web/assets/Breadcrumb-7b5128ab.js
+++ b/app/src/main/resources/web/assets/Breadcrumb-9ca58797.js
@@ -1 +1 @@
-import{d as _,e as l,o as s,c as r,F as d,J as p,a,t as o,j as f,bS as h,l as m,h as b,bH as g,C as y,_ as v}from"./index-a9bbc323.js";const k={class:"breadcrumb"},B=["onClick"],S={class:"active"},C=_({__name:"Breadcrumb",props:{current:{type:[String,Function]},paths:{type:Array,default:()=>[]}},setup(e){const c=e,u=l();function i(t){y(u,t)}return(t,$)=>(s(),r("ol",k,[(s(!0),r(d,null,p(c.paths,n=>(s(),r("li",{key:n},[a("a",{href:"#",onClick:m(x=>i(n),["prevent"])},o(t.$t(`page_title.${f(h)(n)}`)),9,B)]))),128)),a("li",S,[b(o(typeof e.current=="function"?e.current():e.current),1),g(t.$slots,"current",{},void 0,!0)])]))}});const N=v(C,[["__scopeId","data-v-d292b348"]]);export{N as _};
+import{d as _,e as l,o as s,c as r,F as d,J as p,a,t as o,j as f,bS as h,l as m,h as b,bH as g,C as y,_ as v}from"./index-82e633ff.js";const k={class:"breadcrumb"},B=["onClick"],S={class:"active"},C=_({__name:"Breadcrumb",props:{current:{type:[String,Function]},paths:{type:Array,default:()=>[]}},setup(e){const c=e,u=l();function i(t){y(u,t)}return(t,$)=>(s(),r("ol",k,[(s(!0),r(d,null,p(c.paths,n=>(s(),r("li",{key:n},[a("a",{href:"#",onClick:m(x=>i(n),["prevent"])},o(t.$t(`page_title.${f(h)(n)}`)),9,B)]))),128)),a("li",S,[b(o(typeof e.current=="function"?e.current():e.current),1),g(t.$slots,"current",{},void 0,!0)])]))}});const N=v(C,[["__scopeId","data-v-d292b348"]]);export{N as _};
diff --git a/app/src/main/resources/web/assets/BucketFilter.vuevuetypescriptsetuptruelang-96d8b135.js b/app/src/main/resources/web/assets/BucketFilter.vuevuetypescriptsetuptruelang-eff38890.js
similarity index 93%
rename from app/src/main/resources/web/assets/BucketFilter.vuevuetypescriptsetuptruelang-96d8b135.js
rename to app/src/main/resources/web/assets/BucketFilter.vuevuetypescriptsetuptruelang-eff38890.js
index da516161..5cee7f4f 100644
--- a/app/src/main/resources/web/assets/BucketFilter.vuevuetypescriptsetuptruelang-96d8b135.js
+++ b/app/src/main/resources/web/assets/BucketFilter.vuevuetypescriptsetuptruelang-eff38890.js
@@ -1 +1 @@
-import{d as _,u as k,e as v,r as I,g as B,x as g,aK as h,O as C,P as n,Q as D,o as l,c as u,J as S,l as b,I as q,t as m,F as M,T as Q,C as x,W as A}from"./index-a9bbc323.js";const E=["onClick"],$=_({__name:"BucketFilter",props:{type:{type:String,required:!0},selected:{type:String,required:!0}},setup(i){const a=i,{t:p}=k(),f=v(),o=I([]),{refetch:d}=B({handle:(e,s)=>{s?g(p(s),"error"):e&&(o.value=e.mediaBuckets)},document:h,variables:{type:a.type},appApi:!0});function y(e){const s=Q([{name:"bucket_id",op:"",value:e.id}]);x(f,`/${{AUDIO:"audios",IMAGE:"images",VIDEO:"videos"}[a.type]}?q=${A(s)}`)}const r=e=>{e.type===a.type&&d()},c=e=>{e.item.bucketId&&e.type===a.type&&d()};return C(()=>{n.on("media_items_deleted",r),n.on("media_item_deleted",c)}),D(()=>{n.off("media_items_deleted",r),n.off("media_item_deleted",c)}),(e,s)=>(l(!0),u(M,null,S(o.value,t=>(l(),u("li",{key:t.id,onClick:b(F=>y(t),["prevent"]),class:q({active:i.selected&&t.id===i.selected})},m(t.name)+" ("+m(t.itemCount)+")",11,E))),128))}});export{$ as _};
+import{d as _,u as k,e as v,r as I,g as B,x as g,aK as h,O as C,P as n,Q as D,o as l,c as u,J as S,l as b,I as q,t as m,F as M,T as Q,C as x,W as A}from"./index-82e633ff.js";const E=["onClick"],$=_({__name:"BucketFilter",props:{type:{type:String,required:!0},selected:{type:String,required:!0}},setup(i){const a=i,{t:p}=k(),f=v(),o=I([]),{refetch:d}=B({handle:(e,s)=>{s?g(p(s),"error"):e&&(o.value=e.mediaBuckets)},document:h,variables:{type:a.type},appApi:!0});function y(e){const s=Q([{name:"bucket_id",op:"",value:e.id}]);x(f,`/${{AUDIO:"audios",IMAGE:"images",VIDEO:"videos"}[a.type]}?q=${A(s)}`)}const r=e=>{e.type===a.type&&d()},c=e=>{e.item.bucketId&&e.type===a.type&&d()};return C(()=>{n.on("media_items_deleted",r),n.on("media_item_deleted",c)}),D(()=>{n.off("media_items_deleted",r),n.off("media_item_deleted",c)}),(e,s)=>(l(!0),u(M,null,S(o.value,t=>(l(),u("li",{key:t.id,onClick:b(F=>y(t),["prevent"]),class:q({active:i.selected&&t.id===i.selected})},m(t.name)+" ("+m(t.itemCount)+")",11,E))),128))}});export{$ as _};
diff --git a/app/src/main/resources/web/assets/CallsRootView-58b95174.js b/app/src/main/resources/web/assets/CallsRootView-657b1c5e.js
similarity index 74%
rename from app/src/main/resources/web/assets/CallsRootView-58b95174.js
rename to app/src/main/resources/web/assets/CallsRootView-657b1c5e.js
index 60610631..561eeb61 100644
--- a/app/src/main/resources/web/assets/CallsRootView-58b95174.js
+++ b/app/src/main/resources/web/assets/CallsRootView-657b1c5e.js
@@ -1 +1 @@
-import{_ as $}from"./TagFilter.vuevuetypescriptsetuptruelang-d0de30fc.js";import{d as w,D as B,e as N,E as z,G as L,c as p,p as a,H as l,j as e,o as m,a as s,t as i,l as d,I as u,F as M,J as S,C as f}from"./index-a9bbc323.js";import{g as h,M as T}from"./splitpanes.es-37578c0b.js";import"./EditValueModal-8c79ab9c.js";import"./vee-validate.esm-d674d968.js";const V={class:"page-container"},D={class:"sidebar"},E={class:"nav-title"},F={class:"nav"},R=["onClick"],b=["onClick"],j={class:"main"},K=w({__name:"CallsRootView",setup(q){const n=B(),c=N(),r=n.params.type,_=r?"":z(n.query);function v(t){f(c,`/calls/${t}`)}const g=["incoming","outgoing","missed"];function C(){f(c,"/calls")}return(t,A)=>{const y=$,k=L("router-view");return m(),p("div",V,[a(e(T),null,{default:l(()=>[a(e(h),{size:"20","min-size":"10"},{default:l(()=>[s("div",D,[s("h2",E,i(t.$t("page_title.calls")),1),s("ul",F,[s("li",{onClick:d(C,["prevent"]),class:u({active:e(n).path==="/calls"&&!e(_)})},i(t.$t("all")),11,R),(m(),p(M,null,S(g,o=>s("li",{key:o,onClick:d(G=>v(o),["prevent"]),class:u({active:o===e(r)})},i(t.$t(`call_type.${o}`)),11,b)),64))]),a(y,{type:"CALL",selected:e(_)},null,8,["selected"])])]),_:1}),a(e(h),null,{default:l(()=>[s("div",j,[a(k)])]),_:1})]),_:1})])}}});export{K as default};
+import{_ as $}from"./TagFilter.vuevuetypescriptsetuptruelang-10776836.js";import{d as w,D as B,e as N,E as z,G as L,c as p,p as a,H as l,j as e,o as m,a as s,t as i,l as d,I as u,F as M,J as S,C as f}from"./index-82e633ff.js";import{g as h,M as T}from"./splitpanes.es-de3e6852.js";import"./EditValueModal-df390030.js";import"./vee-validate.esm-6643484a.js";const V={class:"page-container"},D={class:"sidebar"},E={class:"nav-title"},F={class:"nav"},R=["onClick"],b=["onClick"],j={class:"main"},K=w({__name:"CallsRootView",setup(q){const n=B(),c=N(),r=n.params.type,_=r?"":z(n.query);function v(t){f(c,`/calls/${t}`)}const g=["incoming","outgoing","missed"];function C(){f(c,"/calls")}return(t,A)=>{const y=$,k=L("router-view");return m(),p("div",V,[a(e(T),null,{default:l(()=>[a(e(h),{size:"20","min-size":"10"},{default:l(()=>[s("div",D,[s("h2",E,i(t.$t("page_title.calls")),1),s("ul",F,[s("li",{onClick:d(C,["prevent"]),class:u({active:e(n).path==="/calls"&&!e(_)})},i(t.$t("all")),11,R),(m(),p(M,null,S(g,o=>s("li",{key:o,onClick:d(G=>v(o),["prevent"]),class:u({active:o===e(r)})},i(t.$t(`call_type.${o}`)),11,b)),64))]),a(y,{type:"CALL",selected:e(_)},null,8,["selected"])])]),_:1}),a(e(h),null,{default:l(()=>[s("div",j,[a(k)])]),_:1})]),_:1})])}}});export{K as default};
diff --git a/app/src/main/resources/web/assets/CallsView-942096c2.js b/app/src/main/resources/web/assets/CallsView-e23f7673.js
similarity index 94%
rename from app/src/main/resources/web/assets/CallsView-942096c2.js
rename to app/src/main/resources/web/assets/CallsView-e23f7673.js
index 0a3ac8e2..891a4eba 100644
--- a/app/src/main/resources/web/assets/CallsView-942096c2.js
+++ b/app/src/main/resources/web/assets/CallsView-e23f7673.js
@@ -1,4 +1,4 @@
-import{c as be,u as Ce,_ as Te,a as we,b as qe}from"./list-be40ed35.js";import{d as Se,e as Ae,s as De,f as Ve,r as k,u as Ie,K as Le,L as Re,D as Me,M as Qe,N as Ue,w as Be,O as Ne,P as y,Q as Ge,i as ze,R as Ee,c as i,a as t,p as d,j as l,F as S,m as p,l as _,k as R,H as Fe,t as n,J,S as He,T as Y,U as je,a7 as Ke,x as Oe,a8 as Pe,C as A,W as D,q as We,o,v as xe,I as Je,a9 as Ye,Y as Ze,h as Xe,Z as et,$ as tt,a2 as Z,a3 as st,a0 as lt,aa as at,ab as nt,ac as ot,ad as it,a4 as ct,a5 as dt,a6 as ut}from"./index-a9bbc323.js";import{_ as rt}from"./call-outline-rounded-b23cfc4c.js";import{_ as pt}from"./Breadcrumb-7b5128ab.js";import{u as _t,a as mt}from"./tags-7e5964e8.js";import"./vee-validate.esm-d674d968.js";const ht={class:"v-toolbar"},ft=t("md-ripple",null,null,-1),gt=t("md-ripple",null,null,-1),vt={class:"filters"},kt=["label"],yt={class:"form-label"},$t=["label","selected","onClick"],bt={class:"buttons"},Ct=["onClick"],Tt={class:"table-responsive"},wt={class:"table"},qt=["checked","indeterminate"],St=t("th",null,"ID",-1),At=t("th",null,null,-1),Dt=["onClick"],Vt=["checked"],It={class:"v-center"},Lt={class:"nowrap"},Rt={class:"action-btns"},Mt=["onClick"],Qt=t("md-ripple",null,null,-1),Ut={key:0,indeterminate:"",class:"spinner-sm"},Bt=["onClick"],Nt=t("md-ripple",null,null,-1),Gt=["onClick"],zt=t("md-ripple",null,null,-1),Et={class:"nowrap"},Ft={class:"nowrap"},Ht={class:"nowrap"},jt={key:0},Kt={colspan:"10"},Ot={class:"no-data-placeholder"},b=50,es=Se({__name:"CallsView",setup(Pt){var O,P;const C=Ae(),{app:X}=De(Ve()),m=k([]),M=k(),{t:Q}=Ie(),c=Le({text:"",tags:[]}),u=Re.CALL,U=Me(),B=U.query,T=k(parseInt(((O=B.page)==null?void 0:O.toString())??"1")),r=k(Qe(((P=B.q)==null?void 0:P.toString())??"")),w=k(""),{tags:q}=_t(u,r,c,async e=>{f&&e.push({name:"type",op:"",value:ie[f].toString()}),w.value=Y(e),await je(),oe()}),{addToTags:ee}=mt(u,m,q),{deleteItems:te}=be(Ke,()=>{I(),L(),y.emit("refetch_tags",u)},m),{allChecked:N,realAllChecked:V,selectRealAll:se,allCheckedAlertVisible:le,clearSelection:I,toggleAllChecked:G,toggleItemChecked:z,toggleRow:ae,total:h,checked:E}=Ce(m),{loading:ne,load:oe,refetch:L}=Ue({handle:(e,a)=>{a?Oe(Q(a),"error"):e&&(m.value=e.calls.map($=>({...$,checked:!1})),h.value=e.callCount)},document:Pe,variables:()=>({offset:(T.value-1)*b,limit:b,query:w.value}),appApi:!0}),f=U.params.type,ie={incoming:1,outgoing:2,missed:3};Be(T,e=>{f?A(C,`/calls/${f}?page=${e}&q=${D(r.value)}`):A(C,`/calls?page=${e}&q=${D(r.value)}`)});function ce(e){Z(st,{type:u,tags:q.value,item:{key:e.id,title:"",size:0},selected:q.value.filter(a=>e.tags.some($=>$.id===a.id))})}function de(e){c.tags.includes(e)?lt(c.tags,a=>a.id===e.id):c.tags.push(e)}function ue(){const e=[];for(const a of c.tags)e.push({name:"tag",op:"",value:at.kebabCase(a.name)});c.text&&e.push({name:"text",op:"",value:c.text}),r.value=Y(e),F(),M.value.dismiss()}function F(){f?A(C,`/calls/${f}?q=${D(r.value)}`):A(C,`/calls?q=${D(r.value)}`)}const H=e=>{e.type===u&&(I(),L())},j=e=>{e.type===u&&L()};Ne(()=>{y.on("item_tags_updated",j),y.on("items_tags_updated",H)}),Ge(()=>{y.off("item_tags_updated",j),y.off("items_tags_updated",H)});function re(e){if(!e)return"";const a=[];return e.isp&&a.push(Q("phone_isp_type."+e.isp)),e.city===e.province?a.push(e.city):a.push(`${e.province}${e.city}`),a.join(", ")}const K=k(""),{mutate:pe,loading:_e}=ze({document:We,appApi:!0});function me(e){K.value=e.id,pe({number:e.number})}function he(e){Z(ot,{id:e.id,name:e.id,gql:nt`
+import{c as be,u as Ce,_ as Te,a as we,b as qe}from"./list-0feac61c.js";import{d as Se,e as Ae,s as De,f as Ve,r as k,u as Ie,K as Le,L as Re,D as Me,M as Qe,N as Ue,w as Be,O as Ne,P as y,Q as Ge,i as ze,R as Ee,c as i,a as t,p as d,j as l,F as S,m as p,l as _,k as R,H as Fe,t as n,J,S as He,T as Y,U as je,a7 as Ke,x as Oe,a8 as Pe,C as A,W as D,q as We,o,v as xe,I as Je,a9 as Ye,Y as Ze,h as Xe,Z as et,$ as tt,a2 as Z,a3 as st,a0 as lt,aa as at,ab as nt,ac as ot,ad as it,a4 as ct,a5 as dt,a6 as ut}from"./index-82e633ff.js";import{_ as rt}from"./call-outline-rounded-d1a22bdb.js";import{_ as pt}from"./Breadcrumb-9ca58797.js";import{u as _t,a as mt}from"./tags-dce7ef69.js";import"./vee-validate.esm-6643484a.js";const ht={class:"v-toolbar"},ft=t("md-ripple",null,null,-1),gt=t("md-ripple",null,null,-1),vt={class:"filters"},kt=["label"],yt={class:"form-label"},$t=["label","selected","onClick"],bt={class:"buttons"},Ct=["onClick"],Tt={class:"table-responsive"},wt={class:"table"},qt=["checked","indeterminate"],St=t("th",null,"ID",-1),At=t("th",null,null,-1),Dt=["onClick"],Vt=["checked"],It={class:"v-center"},Lt={class:"nowrap"},Rt={class:"action-btns"},Mt=["onClick"],Qt=t("md-ripple",null,null,-1),Ut={key:0,indeterminate:"",class:"spinner-sm"},Bt=["onClick"],Nt=t("md-ripple",null,null,-1),Gt=["onClick"],zt=t("md-ripple",null,null,-1),Et={class:"nowrap"},Ft={class:"nowrap"},Ht={class:"nowrap"},jt={key:0},Kt={colspan:"10"},Ot={class:"no-data-placeholder"},b=50,es=Se({__name:"CallsView",setup(Pt){var O,P;const C=Ae(),{app:X}=De(Ve()),m=k([]),M=k(),{t:Q}=Ie(),c=Le({text:"",tags:[]}),u=Re.CALL,U=Me(),B=U.query,T=k(parseInt(((O=B.page)==null?void 0:O.toString())??"1")),r=k(Qe(((P=B.q)==null?void 0:P.toString())??"")),w=k(""),{tags:q}=_t(u,r,c,async e=>{f&&e.push({name:"type",op:"",value:ie[f].toString()}),w.value=Y(e),await je(),oe()}),{addToTags:ee}=mt(u,m,q),{deleteItems:te}=be(Ke,()=>{I(),L(),y.emit("refetch_tags",u)},m),{allChecked:N,realAllChecked:V,selectRealAll:se,allCheckedAlertVisible:le,clearSelection:I,toggleAllChecked:G,toggleItemChecked:z,toggleRow:ae,total:h,checked:E}=Ce(m),{loading:ne,load:oe,refetch:L}=Ue({handle:(e,a)=>{a?Oe(Q(a),"error"):e&&(m.value=e.calls.map($=>({...$,checked:!1})),h.value=e.callCount)},document:Pe,variables:()=>({offset:(T.value-1)*b,limit:b,query:w.value}),appApi:!0}),f=U.params.type,ie={incoming:1,outgoing:2,missed:3};Be(T,e=>{f?A(C,`/calls/${f}?page=${e}&q=${D(r.value)}`):A(C,`/calls?page=${e}&q=${D(r.value)}`)});function ce(e){Z(st,{type:u,tags:q.value,item:{key:e.id,title:"",size:0},selected:q.value.filter(a=>e.tags.some($=>$.id===a.id))})}function de(e){c.tags.includes(e)?lt(c.tags,a=>a.id===e.id):c.tags.push(e)}function ue(){const e=[];for(const a of c.tags)e.push({name:"tag",op:"",value:at.kebabCase(a.name)});c.text&&e.push({name:"text",op:"",value:c.text}),r.value=Y(e),F(),M.value.dismiss()}function F(){f?A(C,`/calls/${f}?q=${D(r.value)}`):A(C,`/calls?q=${D(r.value)}`)}const H=e=>{e.type===u&&(I(),L())},j=e=>{e.type===u&&L()};Ne(()=>{y.on("item_tags_updated",j),y.on("items_tags_updated",H)}),Ge(()=>{y.off("item_tags_updated",j),y.off("items_tags_updated",H)});function re(e){if(!e)return"";const a=[];return e.isp&&a.push(Q("phone_isp_type."+e.isp)),e.city===e.province?a.push(e.city):a.push(`${e.province}${e.city}`),a.join(", ")}const K=k(""),{mutate:pe,loading:_e}=ze({document:We,appApi:!0});function me(e){K.value=e.id,pe({number:e.number})}function he(e){Z(ot,{id:e.id,name:e.id,gql:nt`
mutation DeleteCall($query: String!) {
deleteCalls(query: $query)
}
diff --git a/app/src/main/resources/web/assets/ContactsRootView-15ee6faf.js b/app/src/main/resources/web/assets/ContactsRootView-1c66db2a.js
similarity index 69%
rename from app/src/main/resources/web/assets/ContactsRootView-15ee6faf.js
rename to app/src/main/resources/web/assets/ContactsRootView-1c66db2a.js
index 999fc374..4f109206 100644
--- a/app/src/main/resources/web/assets/ContactsRootView-15ee6faf.js
+++ b/app/src/main/resources/web/assets/ContactsRootView-1c66db2a.js
@@ -1 +1 @@
-import{_ as m}from"./TagFilter.vuevuetypescriptsetuptruelang-d0de30fc.js";import{d as u,D as f,e as h,E as v,G as C,c as g,p as t,H as a,j as e,o as w,a as s,t as i,l as N,I as k,C as T}from"./index-a9bbc323.js";import{g as l,M as y}from"./splitpanes.es-37578c0b.js";import"./EditValueModal-8c79ab9c.js";import"./vee-validate.esm-d674d968.js";const z={class:"page-container"},B={class:"sidebar"},M={class:"nav-title"},S={class:"nav"},V=["onClick"],$={class:"main"},A=u({__name:"ContactsRootView",setup(D){const o=f(),r=h(),n=v(o.query);function _(){T(r,"/contacts")}return(c,E)=>{const p=m,d=C("router-view");return w(),g("div",z,[t(e(y),null,{default:a(()=>[t(e(l),{size:"20","min-size":"10"},{default:a(()=>[s("div",B,[s("h2",M,i(c.$t("page_title.contacts")),1),s("ul",S,[s("li",{onClick:N(_,["prevent"]),class:k({active:e(o).path==="/contacts"&&!e(n)})},i(c.$t("all")),11,V)]),t(p,{type:"CONTACT",selected:e(n)},null,8,["selected"])])]),_:1}),t(e(l),null,{default:a(()=>[s("div",$,[t(d)])]),_:1})]),_:1})])}}});export{A as default};
+import{_ as m}from"./TagFilter.vuevuetypescriptsetuptruelang-10776836.js";import{d as u,D as f,e as h,E as v,G as C,c as g,p as t,H as a,j as e,o as w,a as s,t as i,l as N,I as k,C as T}from"./index-82e633ff.js";import{g as l,M as y}from"./splitpanes.es-de3e6852.js";import"./EditValueModal-df390030.js";import"./vee-validate.esm-6643484a.js";const z={class:"page-container"},B={class:"sidebar"},M={class:"nav-title"},S={class:"nav"},V=["onClick"],$={class:"main"},A=u({__name:"ContactsRootView",setup(D){const o=f(),r=h(),n=v(o.query);function _(){T(r,"/contacts")}return(c,E)=>{const p=m,d=C("router-view");return w(),g("div",z,[t(e(y),null,{default:a(()=>[t(e(l),{size:"20","min-size":"10"},{default:a(()=>[s("div",B,[s("h2",M,i(c.$t("page_title.contacts")),1),s("ul",S,[s("li",{onClick:N(_,["prevent"]),class:k({active:e(o).path==="/contacts"&&!e(n)})},i(c.$t("all")),11,V)]),t(p,{type:"CONTACT",selected:e(n)},null,8,["selected"])])]),_:1}),t(e(l),null,{default:a(()=>[s("div",$,[t(d)])]),_:1})]),_:1})])}}});export{A as default};
diff --git a/app/src/main/resources/web/assets/ContactsView-eb4858fd.js b/app/src/main/resources/web/assets/ContactsView-6de17fdb.js
similarity index 98%
rename from app/src/main/resources/web/assets/ContactsView-eb4858fd.js
rename to app/src/main/resources/web/assets/ContactsView-6de17fdb.js
index 105ba08a..bdd66d07 100644
--- a/app/src/main/resources/web/assets/ContactsView-eb4858fd.js
+++ b/app/src/main/resources/web/assets/ContactsView-6de17fdb.js
@@ -1,4 +1,4 @@
-import{c as We,u as Je,_ as Pe,a as Ye,b as Xe}from"./list-be40ed35.js";import{o,c as n,a as e,d as de,r as I,an as Ne,ao as j,U as qe,t as u,m,v as f,j as i,n as et,ap as tt,_ as Te,K as Ve,u as Ue,i as se,aq as fe,ar as be,k as V,p as h,F as v,J as b,H as ae,as as lt,ad as Ie,at as ot,e as nt,s as st,f as at,L as dt,D as it,M as ut,N as rt,g as ct,w as _t,O as pt,P as G,Q as mt,R as ht,l as B,S as vt,T as ft,au as bt,x as $e,av as $t,aw as yt,C as ye,W as ge,a2 as te,q as gt,I as kt,ax as Ct,h as ke,Y as wt,Z as Nt,$ as qt,A as Tt,B as Vt,a1 as Ut,a3 as It,ay as Ce,a0 as St,ab as At,ac as Lt,am as Dt,a4 as Mt,a5 as Ft,a6 as xt}from"./index-a9bbc323.js";import{_ as Rt}from"./call-outline-rounded-b23cfc4c.js";import{_ as Bt}from"./Breadcrumb-7b5128ab.js";import{u as Se,a as Ae}from"./vee-validate.esm-d674d968.js";import{u as Qt,a as Zt}from"./tags-7e5964e8.js";const zt={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Ot=e("path",{fill:"currentColor",d:"m19.3 8.925l-4.25-4.2l1.4-1.4q.575-.575 1.413-.575t1.412.575l1.4 1.4q.575.575.6 1.388t-.55 1.387L19.3 8.925ZM17.85 10.4L7.25 21H3v-4.25l10.6-10.6l4.25 4.25Z"},null,-1),jt=[Ot];function Et(g,$){return o(),n("svg",zt,jt)}const Gt={name:"material-symbols-edit",render:Et},Ht={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Kt=e("path",{fill:"currentColor",d:"M6.7 11.7q-.275-.275-.275-.7t.275-.7l4.6-4.6q.15-.15.325-.212T12 5.425q.2 0 .375.063t.325.212l4.6 4.6q.275.275.288.688t-.288.712q-.275.275-.7.275t-.7-.275L12 7.825L8.1 11.7q-.275.275-.688.288T6.7 11.7Zm0 6q-.275-.275-.275-.7t.275-.7l4.6-4.6q.15-.15.325-.212t.375-.063q.2 0 .375.063t.325.212l4.6 4.6q.275.275.288.688t-.288.712q-.275.275-.7.275t-.7-.275L12 13.825L8.1 17.7q-.275.275-.688.288T6.7 17.7Z"},null,-1),Wt=[Kt];function Jt(g,$){return o(),n("svg",Ht,Wt)}const Pt={name:"material-symbols-keyboard-double-arrow-up-rounded",render:Jt},Yt={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Xt=e("path",{fill:"currentColor",d:"M12 12.575q-.2 0-.375-.062T11.3 12.3L6.7 7.7q-.275-.275-.288-.688T6.7 6.3q.275-.275.7-.275t.7.275l3.9 3.875L15.9 6.3q.275-.275.688-.287t.712.287q.275.275.275.7t-.275.7l-4.6 4.6q-.15.15-.325.213t-.375.062Zm0 6q-.2 0-.375-.062T11.3 18.3l-4.6-4.6q-.275-.275-.288-.687T6.7 12.3q.275-.275.7-.275t.7.275l3.9 3.875l3.9-3.875q.275-.275.688-.288t.712.288q.275.275.275.7t-.275.7l-4.6 4.6q-.15.15-.325.213t-.375.062Z"},null,-1),el=[Xt];function tl(g,$){return o(),n("svg",Yt,el)}const ll={name:"material-symbols-keyboard-double-arrow-down-rounded",render:tl};function H(g){return Array.from({length:g},($,Q)=>Q+1).concat(-1)}const P={phoneNumberTypes:H(20),emailTypes:H(4),addressTypes:H(3),eventTypes:H(3),imTypes:H(8),websiteTypes:H(7)},ol={slot:"headline"},nl={slot:"content"},sl=["error","error-text"],al={slot:"actions"},dl=de({__name:"PromptModal",props:{do:{type:Function,required:!0},title:{type:String,required:!0},value:{type:String}},setup(g){const $=g,{handleSubmit:Q}=Se(),d=I(),{value:C,resetField:M,errorMessage:w}=Ae("inputValue",Ne().required()),k=Q(()=>{$.do(C.value??""),j()});return C.value=$.value,$.value||M(),(async()=>{var A;await qe(),(A=d.value)==null||A.focus()})(),(A,q)=>(o(),n("md-dialog",null,[e("div",ol,u(g.title),1),e("div",nl,[m(e("md-outlined-text-field",{ref_key:"inputRef",ref:d,class:"form-control",error:i(w),"error-text":i(w)?A.$t(i(w)):"","onUpdate:modelValue":q[0]||(q[0]=N=>et(C)?C.value=N:null),onKeyup:q[1]||(q[1]=tt((...N)=>i(k)&&i(k)(...N),["enter"]))},null,40,sl),[[f,i(C)]])]),e("div",al,[e("md-outlined-button",{value:"cancel",onClick:q[2]||(q[2]=(...N)=>i(j)&&i(j)(...N))},u(A.$t("cancel")),1),e("md-filled-button",{value:"ok",onClick:q[3]||(q[3]=(...N)=>i(k)&&i(k)(...N)),autofocus:""},u(A.$t("ok")),1)])]))}});const il=Te(dl,[["__scopeId","data-v-f510d520"]]),ul={slot:"headline"},rl={slot:"content"},cl={class:"form-label"},_l={class:"form-row"},pl=["label"],ml=["label"],hl=["label"],vl={key:1,class:"v-center"},fl=e("md-ripple",null,null,-1),bl={key:0,class:"form-row"},$l=["label"],yl=["label"],gl={class:"v-center"},kl=e("md-ripple",null,null,-1),Cl={class:"form-label"},wl=["onUpdate:modelValue","onChange"],Nl=["value"],ql={slot:"headline"},Tl=["placeholder","onUpdate:modelValue"],Vl={class:"v-center"},Ul=["onClick"],Il=e("md-ripple",null,null,-1),Sl={key:1,class:"form-label"},Al=["onUpdate:modelValue","onChange"],Ll=["value"],Dl={slot:"headline"},Ml=["label","onUpdate:modelValue"],Fl={class:"v-center"},xl=["onClick"],Rl=e("md-ripple",null,null,-1),Bl={key:2,class:"form-label"},Ql=["onUpdate:modelValue","onChange"],Zl=["value"],zl={slot:"headline"},Ol=["label","onUpdate:modelValue"],jl={class:"v-center"},El=["onClick"],Gl=e("md-ripple",null,null,-1),Hl={key:3,class:"form-label"},Kl=["onUpdate:modelValue","onChange"],Wl=["value"],Jl={slot:"headline"},Pl=["placeholder","onUpdate:modelValue"],Yl={class:"v-center"},Xl=["onClick"],eo=e("md-ripple",null,null,-1),to={key:4,class:"form-label"},lo=["onUpdate:modelValue","onChange"],oo=["value"],no={slot:"headline"},so=["placeholder","onUpdate:modelValue"],ao={class:"v-center"},io=["onClick"],uo=e("md-ripple",null,null,-1),ro={class:"form-row",style:{display:"block",position:"relative"}},co={class:"menu-items"},_o=["onClick"],po={slot:"headline"},mo=["onClick"],ho={slot:"headline"},vo=["onClick"],fo={slot:"headline"},bo=["onClick"],$o={slot:"headline"},yo=["onClick"],go={slot:"headline"},ko={class:"form-row"},Co=["label"],wo={slot:"actions"},No=["disabled"],we=de({__name:"EditContactModal",props:{data:{type:Object},sources:{type:Array},done:{type:Function,required:!0}},setup(g){const $=g,{handleSubmit:Q}=Se(),d=Ve({firstName:"",middleName:"",lastName:"",prefix:"",suffix:"",nickname:"",organization:null,notes:"",source:"",starred:0,phoneNumbers:[],emails:[],addresses:[],websites:[],events:[],ims:[],groupIds:[]}),C=I(!1),{t:M}=Ue(),{mutate:w,loading:k,onDone:A}=se({document:fe`
+import{c as We,u as Je,_ as Pe,a as Ye,b as Xe}from"./list-0feac61c.js";import{o,c as n,a as e,d as de,r as I,an as Ne,ao as j,U as qe,t as u,m,v as f,j as i,n as et,ap as tt,_ as Te,K as Ve,u as Ue,i as se,aq as fe,ar as be,k as V,p as h,F as v,J as b,H as ae,as as lt,ad as Ie,at as ot,e as nt,s as st,f as at,L as dt,D as it,M as ut,N as rt,g as ct,w as _t,O as pt,P as G,Q as mt,R as ht,l as B,S as vt,T as ft,au as bt,x as $e,av as $t,aw as yt,C as ye,W as ge,a2 as te,q as gt,I as kt,ax as Ct,h as ke,Y as wt,Z as Nt,$ as qt,A as Tt,B as Vt,a1 as Ut,a3 as It,ay as Ce,a0 as St,ab as At,ac as Lt,am as Dt,a4 as Mt,a5 as Ft,a6 as xt}from"./index-82e633ff.js";import{_ as Rt}from"./call-outline-rounded-d1a22bdb.js";import{_ as Bt}from"./Breadcrumb-9ca58797.js";import{u as Se,a as Ae}from"./vee-validate.esm-6643484a.js";import{u as Qt,a as Zt}from"./tags-dce7ef69.js";const zt={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Ot=e("path",{fill:"currentColor",d:"m19.3 8.925l-4.25-4.2l1.4-1.4q.575-.575 1.413-.575t1.412.575l1.4 1.4q.575.575.6 1.388t-.55 1.387L19.3 8.925ZM17.85 10.4L7.25 21H3v-4.25l10.6-10.6l4.25 4.25Z"},null,-1),jt=[Ot];function Et(g,$){return o(),n("svg",zt,jt)}const Gt={name:"material-symbols-edit",render:Et},Ht={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Kt=e("path",{fill:"currentColor",d:"M6.7 11.7q-.275-.275-.275-.7t.275-.7l4.6-4.6q.15-.15.325-.212T12 5.425q.2 0 .375.063t.325.212l4.6 4.6q.275.275.288.688t-.288.712q-.275.275-.7.275t-.7-.275L12 7.825L8.1 11.7q-.275.275-.688.288T6.7 11.7Zm0 6q-.275-.275-.275-.7t.275-.7l4.6-4.6q.15-.15.325-.212t.375-.063q.2 0 .375.063t.325.212l4.6 4.6q.275.275.288.688t-.288.712q-.275.275-.7.275t-.7-.275L12 13.825L8.1 17.7q-.275.275-.688.288T6.7 17.7Z"},null,-1),Wt=[Kt];function Jt(g,$){return o(),n("svg",Ht,Wt)}const Pt={name:"material-symbols-keyboard-double-arrow-up-rounded",render:Jt},Yt={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Xt=e("path",{fill:"currentColor",d:"M12 12.575q-.2 0-.375-.062T11.3 12.3L6.7 7.7q-.275-.275-.288-.688T6.7 6.3q.275-.275.7-.275t.7.275l3.9 3.875L15.9 6.3q.275-.275.688-.287t.712.287q.275.275.275.7t-.275.7l-4.6 4.6q-.15.15-.325.213t-.375.062Zm0 6q-.2 0-.375-.062T11.3 18.3l-4.6-4.6q-.275-.275-.288-.687T6.7 12.3q.275-.275.7-.275t.7.275l3.9 3.875l3.9-3.875q.275-.275.688-.288t.712.288q.275.275.275.7t-.275.7l-4.6 4.6q-.15.15-.325.213t-.375.062Z"},null,-1),el=[Xt];function tl(g,$){return o(),n("svg",Yt,el)}const ll={name:"material-symbols-keyboard-double-arrow-down-rounded",render:tl};function H(g){return Array.from({length:g},($,Q)=>Q+1).concat(-1)}const P={phoneNumberTypes:H(20),emailTypes:H(4),addressTypes:H(3),eventTypes:H(3),imTypes:H(8),websiteTypes:H(7)},ol={slot:"headline"},nl={slot:"content"},sl=["error","error-text"],al={slot:"actions"},dl=de({__name:"PromptModal",props:{do:{type:Function,required:!0},title:{type:String,required:!0},value:{type:String}},setup(g){const $=g,{handleSubmit:Q}=Se(),d=I(),{value:C,resetField:M,errorMessage:w}=Ae("inputValue",Ne().required()),k=Q(()=>{$.do(C.value??""),j()});return C.value=$.value,$.value||M(),(async()=>{var A;await qe(),(A=d.value)==null||A.focus()})(),(A,q)=>(o(),n("md-dialog",null,[e("div",ol,u(g.title),1),e("div",nl,[m(e("md-outlined-text-field",{ref_key:"inputRef",ref:d,class:"form-control",error:i(w),"error-text":i(w)?A.$t(i(w)):"","onUpdate:modelValue":q[0]||(q[0]=N=>et(C)?C.value=N:null),onKeyup:q[1]||(q[1]=tt((...N)=>i(k)&&i(k)(...N),["enter"]))},null,40,sl),[[f,i(C)]])]),e("div",al,[e("md-outlined-button",{value:"cancel",onClick:q[2]||(q[2]=(...N)=>i(j)&&i(j)(...N))},u(A.$t("cancel")),1),e("md-filled-button",{value:"ok",onClick:q[3]||(q[3]=(...N)=>i(k)&&i(k)(...N)),autofocus:""},u(A.$t("ok")),1)])]))}});const il=Te(dl,[["__scopeId","data-v-f510d520"]]),ul={slot:"headline"},rl={slot:"content"},cl={class:"form-label"},_l={class:"form-row"},pl=["label"],ml=["label"],hl=["label"],vl={key:1,class:"v-center"},fl=e("md-ripple",null,null,-1),bl={key:0,class:"form-row"},$l=["label"],yl=["label"],gl={class:"v-center"},kl=e("md-ripple",null,null,-1),Cl={class:"form-label"},wl=["onUpdate:modelValue","onChange"],Nl=["value"],ql={slot:"headline"},Tl=["placeholder","onUpdate:modelValue"],Vl={class:"v-center"},Ul=["onClick"],Il=e("md-ripple",null,null,-1),Sl={key:1,class:"form-label"},Al=["onUpdate:modelValue","onChange"],Ll=["value"],Dl={slot:"headline"},Ml=["label","onUpdate:modelValue"],Fl={class:"v-center"},xl=["onClick"],Rl=e("md-ripple",null,null,-1),Bl={key:2,class:"form-label"},Ql=["onUpdate:modelValue","onChange"],Zl=["value"],zl={slot:"headline"},Ol=["label","onUpdate:modelValue"],jl={class:"v-center"},El=["onClick"],Gl=e("md-ripple",null,null,-1),Hl={key:3,class:"form-label"},Kl=["onUpdate:modelValue","onChange"],Wl=["value"],Jl={slot:"headline"},Pl=["placeholder","onUpdate:modelValue"],Yl={class:"v-center"},Xl=["onClick"],eo=e("md-ripple",null,null,-1),to={key:4,class:"form-label"},lo=["onUpdate:modelValue","onChange"],oo=["value"],no={slot:"headline"},so=["placeholder","onUpdate:modelValue"],ao={class:"v-center"},io=["onClick"],uo=e("md-ripple",null,null,-1),ro={class:"form-row",style:{display:"block",position:"relative"}},co={class:"menu-items"},_o=["onClick"],po={slot:"headline"},mo=["onClick"],ho={slot:"headline"},vo=["onClick"],fo={slot:"headline"},bo=["onClick"],$o={slot:"headline"},yo=["onClick"],go={slot:"headline"},ko={class:"form-row"},Co=["label"],wo={slot:"actions"},No=["disabled"],we=de({__name:"EditContactModal",props:{data:{type:Object},sources:{type:Array},done:{type:Function,required:!0}},setup(g){const $=g,{handleSubmit:Q}=Se(),d=Ve({firstName:"",middleName:"",lastName:"",prefix:"",suffix:"",nickname:"",organization:null,notes:"",source:"",starred:0,phoneNumbers:[],emails:[],addresses:[],websites:[],events:[],ims:[],groupIds:[]}),C=I(!1),{t:M}=Ue(),{mutate:w,loading:k,onDone:A}=se({document:fe`
mutation createContact($input: ContactInput!) {
createContact(input: $input) {
...ContactFragment
diff --git a/app/src/main/resources/web/assets/DeviceInfoView-2311797d.js b/app/src/main/resources/web/assets/DeviceInfoView-25498e8c.js
similarity index 96%
rename from app/src/main/resources/web/assets/DeviceInfoView-2311797d.js
rename to app/src/main/resources/web/assets/DeviceInfoView-25498e8c.js
index d4a36769..23da53b9 100644
--- a/app/src/main/resources/web/assets/DeviceInfoView-2311797d.js
+++ b/app/src/main/resources/web/assets/DeviceInfoView-25498e8c.js
@@ -1 +1 @@
-import{_ as V}from"./Breadcrumb-7b5128ab.js";import{d as $,u as I,r as p,g as A,R as D,c as l,a,p as w,t as o,F as r,J as i,x as N,a9 as T,by as B,o as t,m as y,j as d,Y as m,h as u,Z as f,_ as j}from"./index-a9bbc323.js";const F={class:"page-container"},x={class:"main"},E={class:"v-toolbar"},L={class:"panel-container"},Q={class:"grid"},S={class:"g-col-6 g-col-md-4"},C={class:"card"},G={class:"card-body"},J={class:"card-title"},P={class:"card-text"},R={class:"key-value"},Y={class:"key"},Z={class:"value"},q={key:0,class:"time"},z={class:"g-col-6 g-col-md-4"},H={class:"card"},K={class:"card-body"},M={class:"card-title"},O={class:"card-text"},U={class:"key-value"},W={class:"key"},X={class:"value"},ee={key:0,class:"time"},ae={class:"g-col-6 g-col-md-4"},se={class:"card"},le={class:"card-body"},te={class:"card-title"},oe={class:"card-text"},ce={class:"key-value"},ne={class:"key"},re={class:"value"},ie={key:0,class:"time"},de=$({__name:"DeviceInfoView",setup(ue){const{t:_}=I(),b=p([]),g=p([]),k=p([]);return A({handle:(n,h)=>{if(h)N(_(h),"error");else{const s=n.deviceInfo;b.value=[{label:"device_name",value:s.deviceName},{label:"model",value:s.model},{label:"manufacturer",value:s.manufacturer},{label:"device",value:s.device},{label:"board",value:s.board},{label:"hardware",value:s.hardware},{label:"brand",value:s.buildBrand},{label:"build_fingerprint",value:s.fingerprint}],s.phoneNumbers.length>0&&b.value.push({label:"phone_number",value:s.phoneNumbers.map(e=>e.name+" "+e.number)}),g.value=[{label:"android_version",value:s.releaseBuildVersion+" ("+s.sdkVersion+")"},{label:"security_patch",value:s.securityPatch},{label:"bootloader",value:s.bootloader},{label:"build_number",value:s.displayVersion},{label:"baseband",value:s.radioVersion},{label:"java_vm",value:s.javaVmVersion},{label:"kernel",value:s.kernelVersion},{label:"opengl_es",value:s.glEsVersion},{label:"uptime",value:T(s.uptime/1e3)}];const c=n.battery;k.value=[{label:"health",value:_(`battery_health.${c.health}`)},{label:"remaining",value:`${c.level}%`},{label:"status",value:_(`battery_status.${c.status}`)},{label:"power_source",value:_(`battery_plugged.${c.plugged}`)},{label:"technology",value:c.technology},{label:"temperature",value:`${c.temperature} ℃`},{label:"voltage",value:`${c.voltage} mV`},{label:"capacity",value:c.capacity+" mAh"}]}},document:B,appApi:!0}),(n,h)=>{const s=V,c=D("tooltip");return t(),l("div",F,[a("div",x,[a("div",E,[w(s,{current:()=>n.$t("device_info")},null,8,["current"])]),a("div",L,[a("div",Q,[a("div",S,[a("section",C,[a("div",G,[a("h5",J,o(n.$t("device")),1),a("p",P,[(t(!0),l(r,null,i(b.value,e=>(t(),l("div",R,[a("div",Y,o(n.$t(e.label)),1),a("div",Z,[e.isTime?y((t(),l("span",q,[u(o(d(f)(e.value)),1)])),[[c,d(m)(e.value)]]):Array.isArray(e.value)?(t(!0),l(r,{key:1},i(e.value,v=>(t(),l("div",null,o(v),1))),256)):(t(),l(r,{key:2},[u(o(e.value),1)],64))])]))),256))])])])]),a("div",z,[a("section",H,[a("div",K,[a("h5",M,o(n.$t("system")),1),a("p",O,[(t(!0),l(r,null,i(g.value,e=>(t(),l("div",U,[a("div",W,o(n.$t(e.label)),1),a("div",X,[e.isTime?y((t(),l("span",ee,[u(o(d(f)(e.value)),1)])),[[c,d(m)(e.value)]]):Array.isArray(e.value)?(t(!0),l(r,{key:1},i(e.value,v=>(t(),l("div",null,o(v),1))),256)):(t(),l(r,{key:2},[u(o(e.value),1)],64))])]))),256))])])])]),a("div",ae,[a("section",se,[a("div",le,[a("h5",te,o(n.$t("battery")),1),a("p",oe,[(t(!0),l(r,null,i(k.value,e=>(t(),l("div",ce,[a("div",ne,o(n.$t(e.label)),1),a("div",re,[e.isTime?y((t(),l("span",ie,[u(o(d(f)(e.value)),1)])),[[c,d(m)(e.value)]]):Array.isArray(e.value)?(t(!0),l(r,{key:1},i(e.value,v=>(t(),l("div",null,o(v),1))),256)):(t(),l(r,{key:2},[u(o(e.value),1)],64))])]))),256))])])])])])])])])}}});const be=j(de,[["__scopeId","data-v-c9cf5e1a"]]);export{be as default};
+import{_ as V}from"./Breadcrumb-9ca58797.js";import{d as $,u as I,r as p,g as A,R as D,c as l,a,p as w,t as o,F as r,J as i,x as N,a9 as T,by as B,o as t,m as y,j as d,Y as m,h as u,Z as f,_ as j}from"./index-82e633ff.js";const F={class:"page-container"},x={class:"main"},E={class:"v-toolbar"},L={class:"panel-container"},Q={class:"grid"},S={class:"g-col-6 g-col-md-4"},C={class:"card"},G={class:"card-body"},J={class:"card-title"},P={class:"card-text"},R={class:"key-value"},Y={class:"key"},Z={class:"value"},q={key:0,class:"time"},z={class:"g-col-6 g-col-md-4"},H={class:"card"},K={class:"card-body"},M={class:"card-title"},O={class:"card-text"},U={class:"key-value"},W={class:"key"},X={class:"value"},ee={key:0,class:"time"},ae={class:"g-col-6 g-col-md-4"},se={class:"card"},le={class:"card-body"},te={class:"card-title"},oe={class:"card-text"},ce={class:"key-value"},ne={class:"key"},re={class:"value"},ie={key:0,class:"time"},de=$({__name:"DeviceInfoView",setup(ue){const{t:_}=I(),b=p([]),g=p([]),k=p([]);return A({handle:(n,h)=>{if(h)N(_(h),"error");else{const s=n.deviceInfo;b.value=[{label:"device_name",value:s.deviceName},{label:"model",value:s.model},{label:"manufacturer",value:s.manufacturer},{label:"device",value:s.device},{label:"board",value:s.board},{label:"hardware",value:s.hardware},{label:"brand",value:s.buildBrand},{label:"build_fingerprint",value:s.fingerprint}],s.phoneNumbers.length>0&&b.value.push({label:"phone_number",value:s.phoneNumbers.map(e=>e.name+" "+e.number)}),g.value=[{label:"android_version",value:s.releaseBuildVersion+" ("+s.sdkVersion+")"},{label:"security_patch",value:s.securityPatch},{label:"bootloader",value:s.bootloader},{label:"build_number",value:s.displayVersion},{label:"baseband",value:s.radioVersion},{label:"java_vm",value:s.javaVmVersion},{label:"kernel",value:s.kernelVersion},{label:"opengl_es",value:s.glEsVersion},{label:"uptime",value:T(s.uptime/1e3)}];const c=n.battery;k.value=[{label:"health",value:_(`battery_health.${c.health}`)},{label:"remaining",value:`${c.level}%`},{label:"status",value:_(`battery_status.${c.status}`)},{label:"power_source",value:_(`battery_plugged.${c.plugged}`)},{label:"technology",value:c.technology},{label:"temperature",value:`${c.temperature} ℃`},{label:"voltage",value:`${c.voltage} mV`},{label:"capacity",value:c.capacity+" mAh"}]}},document:B,appApi:!0}),(n,h)=>{const s=V,c=D("tooltip");return t(),l("div",F,[a("div",x,[a("div",E,[w(s,{current:()=>n.$t("device_info")},null,8,["current"])]),a("div",L,[a("div",Q,[a("div",S,[a("section",C,[a("div",G,[a("h5",J,o(n.$t("device")),1),a("p",P,[(t(!0),l(r,null,i(b.value,e=>(t(),l("div",R,[a("div",Y,o(n.$t(e.label)),1),a("div",Z,[e.isTime?y((t(),l("span",q,[u(o(d(f)(e.value)),1)])),[[c,d(m)(e.value)]]):Array.isArray(e.value)?(t(!0),l(r,{key:1},i(e.value,v=>(t(),l("div",null,o(v),1))),256)):(t(),l(r,{key:2},[u(o(e.value),1)],64))])]))),256))])])])]),a("div",z,[a("section",H,[a("div",K,[a("h5",M,o(n.$t("system")),1),a("p",O,[(t(!0),l(r,null,i(g.value,e=>(t(),l("div",U,[a("div",W,o(n.$t(e.label)),1),a("div",X,[e.isTime?y((t(),l("span",ee,[u(o(d(f)(e.value)),1)])),[[c,d(m)(e.value)]]):Array.isArray(e.value)?(t(!0),l(r,{key:1},i(e.value,v=>(t(),l("div",null,o(v),1))),256)):(t(),l(r,{key:2},[u(o(e.value),1)],64))])]))),256))])])])]),a("div",ae,[a("section",se,[a("div",le,[a("h5",te,o(n.$t("battery")),1),a("p",oe,[(t(!0),l(r,null,i(k.value,e=>(t(),l("div",ce,[a("div",ne,o(n.$t(e.label)),1),a("div",re,[e.isTime?y((t(),l("span",ie,[u(o(d(f)(e.value)),1)])),[[c,d(m)(e.value)]]):Array.isArray(e.value)?(t(!0),l(r,{key:1},i(e.value,v=>(t(),l("div",null,o(v),1))),256)):(t(),l(r,{key:2},[u(o(e.value),1)],64))])]))),256))])])])])])])])])}}});const be=j(de,[["__scopeId","data-v-c9cf5e1a"]]);export{be as default};
diff --git a/app/src/main/resources/web/assets/DevicesView-206a9b77.js b/app/src/main/resources/web/assets/DevicesView-28c2b237.js
similarity index 92%
rename from app/src/main/resources/web/assets/DevicesView-206a9b77.js
rename to app/src/main/resources/web/assets/DevicesView-28c2b237.js
index fccb0460..312975a8 100644
--- a/app/src/main/resources/web/assets/DevicesView-206a9b77.js
+++ b/app/src/main/resources/web/assets/DevicesView-28c2b237.js
@@ -1,4 +1,4 @@
-import{d as y,u as A,r as C,g as F,x as N,ab as r,c3 as p,R as I,c as o,a as e,p as m,t,F as M,J as q,o as i,l as _,m as v,j as d,Y as h,h as $,Z as f,a2 as D,ac as B,i as E,a5 as T}from"./index-a9bbc323.js";import{_ as S}from"./Breadcrumb-7b5128ab.js";import{E as j}from"./EditValueModal-8c79ab9c.js";import"./vee-validate.esm-d674d968.js";const J={class:"page-container"},L={class:"main"},O={class:"table-responsive"},Q={class:"table"},R=e("th",null,"ID",-1),U={class:"actions one"},Y=["onClick"],Z={class:"nowrap"},z={class:"nowrap"},G={class:"actions one"},H=["onClick"],ee=y({__name:"DevicesView",setup(K){const{t:s}=A(),c=C([]);F({handle:(n,l)=>{l?N(s(l),"error"):c.value=[...n.devices]},document:r`
+import{d as y,u as A,r as C,g as F,x as N,ab as r,c3 as p,R as I,c as o,a as e,p as m,t,F as M,J as q,o as i,l as _,m as v,j as d,Y as h,h as $,Z as f,a2 as D,ac as B,i as E,a5 as T}from"./index-82e633ff.js";import{_ as S}from"./Breadcrumb-9ca58797.js";import{E as j}from"./EditValueModal-df390030.js";import"./vee-validate.esm-6643484a.js";const J={class:"page-container"},L={class:"main"},O={class:"table-responsive"},Q={class:"table"},R=e("th",null,"ID",-1),U={class:"actions one"},Y=["onClick"],Z={class:"nowrap"},z={class:"nowrap"},G={class:"actions one"},H=["onClick"],ee=y({__name:"DevicesView",setup(K){const{t:s}=A(),c=C([]);F({handle:(n,l)=>{l?N(s(l),"error"):c.value=[...n.devices]},document:r`
query {
devices {
...DeviceFragment
diff --git a/app/src/main/resources/web/assets/EditToolbar.vuevuetypescriptsetuptruelang-8a911148.js b/app/src/main/resources/web/assets/EditToolbar.vuevuetypescriptsetuptruelang-bf8aeafc.js
similarity index 92%
rename from app/src/main/resources/web/assets/EditToolbar.vuevuetypescriptsetuptruelang-8a911148.js
rename to app/src/main/resources/web/assets/EditToolbar.vuevuetypescriptsetuptruelang-bf8aeafc.js
index 38a7425a..39f84256 100644
--- a/app/src/main/resources/web/assets/EditToolbar.vuevuetypescriptsetuptruelang-8a911148.js
+++ b/app/src/main/resources/web/assets/EditToolbar.vuevuetypescriptsetuptruelang-bf8aeafc.js
@@ -1 +1 @@
-import{d as b,r as m,o,c as l,a as r,F as v,J as p,I as y,t as c}from"./index-a9bbc323.js";const f={class:"v-toolbar"},g={class:"v-tabs"},h=["onClick"],k=["disabled"],F=b({__name:"EditToolbar",props:{modelValue:{type:Number,default:0},save:{type:Function},loading:{type:Boolean},tabs:{type:Array,default:()=>[]}},emits:["update:modelValue"],setup(e,{emit:d}){const n=m(e.modelValue);function u(t){n.value=t,d("update:modelValue",t)}return(t,i)=>(o(),l("div",f,[r("ul",g,[(o(!0),l(v,null,p(e.tabs,(a,s)=>(o(),l("li",{key:s,onClick:V=>u(s),class:y({active:n.value===s})},c(a.startsWith("t:")?t.$t(a.slice(2)):a),11,h))),128))]),r("button",{type:"button",disabled:e.loading,class:"btn right-actions",onClick:i[0]||(i[0]=(...a)=>e.save&&e.save(...a))},c(t.$t(e.loading?"saving":"save")),9,k)]))}});export{F as _};
+import{d as b,r as m,o,c as l,a as r,F as v,J as p,I as y,t as c}from"./index-82e633ff.js";const f={class:"v-toolbar"},g={class:"v-tabs"},h=["onClick"],k=["disabled"],F=b({__name:"EditToolbar",props:{modelValue:{type:Number,default:0},save:{type:Function},loading:{type:Boolean},tabs:{type:Array,default:()=>[]}},emits:["update:modelValue"],setup(e,{emit:d}){const n=m(e.modelValue);function u(t){n.value=t,d("update:modelValue",t)}return(t,i)=>(o(),l("div",f,[r("ul",g,[(o(!0),l(v,null,p(e.tabs,(a,s)=>(o(),l("li",{key:s,onClick:V=>u(s),class:y({active:n.value===s})},c(a.startsWith("t:")?t.$t(a.slice(2)):a),11,h))),128))]),r("button",{type:"button",disabled:e.loading,class:"btn right-actions",onClick:i[0]||(i[0]=(...a)=>e.save&&e.save(...a))},c(t.$t(e.loading?"saving":"save")),9,k)]))}});export{F as _};
diff --git a/app/src/main/resources/web/assets/EditValueModal-8c79ab9c.js b/app/src/main/resources/web/assets/EditValueModal-df390030.js
similarity index 91%
rename from app/src/main/resources/web/assets/EditValueModal-8c79ab9c.js
rename to app/src/main/resources/web/assets/EditValueModal-df390030.js
index bb5cb1bf..47284ca2 100644
--- a/app/src/main/resources/web/assets/EditValueModal-8c79ab9c.js
+++ b/app/src/main/resources/web/assets/EditValueModal-df390030.js
@@ -1 +1 @@
-import{d as h,r as V,an as b,U as k,ao as p,o as x,c as E,a as n,t as d,m as F,v as M,j as t,n as S,ap as q,_ as w}from"./index-a9bbc323.js";import{u as B,a as C}from"./vee-validate.esm-d674d968.js";const D={slot:"headline"},R={slot:"content"},$=["placeholder","error","error-text"],K={slot:"actions"},T=["disabled"],U=h({__name:"EditValueModal",props:{getVariables:{type:Function,required:!0},title:{type:String,required:!0},placeholder:{type:String},value:{type:String},mutation:{type:Function,required:!0},done:{type:Function}},setup(r){const s=r,{handleSubmit:v}=B(),c=V(),{mutate:f,loading:m,onDone:_}=s.mutation(),{value:o,resetField:y,errorMessage:u}=C("inputValue",b().required());o.value=s.value??"",o.value||y();function g(){p()}(async()=>{var e;await k(),(e=c.value)==null||e.focus()})();const i=v(()=>{f(s.getVariables(o.value??""))});return _(()=>{var e;(e=s.done)==null||e.call(this,o.value),p()}),(e,a)=>(x(),E("md-dialog",null,[n("div",D,d(r.title),1),n("div",R,[F(n("md-outlined-text-field",{ref_key:"inputRef",ref:c,placeholder:r.placeholder,"onUpdate:modelValue":a[0]||(a[0]=l=>S(o)?o.value=l:null),onKeyup:a[1]||(a[1]=q((...l)=>t(i)&&t(i)(...l),["enter"])),error:t(u),"error-text":t(u)?e.$t(t(u)):""},null,40,$),[[M,t(o)]])]),n("div",K,[n("md-outlined-button",{value:"cancel",onClick:g},d(e.$t("cancel")),1),n("md-filled-button",{value:"save",disabled:t(m),onClick:a[2]||(a[2]=(...l)=>t(i)&&t(i)(...l)),autofocus:""},d(e.$t("save")),9,T)])]))}});const I=w(U,[["__scopeId","data-v-78f7a9dc"]]);export{I as E};
+import{d as h,r as V,an as b,U as k,ao as p,o as x,c as E,a as n,t as d,m as F,v as M,j as t,n as S,ap as q,_ as w}from"./index-82e633ff.js";import{u as B,a as C}from"./vee-validate.esm-6643484a.js";const D={slot:"headline"},R={slot:"content"},$=["placeholder","error","error-text"],K={slot:"actions"},T=["disabled"],U=h({__name:"EditValueModal",props:{getVariables:{type:Function,required:!0},title:{type:String,required:!0},placeholder:{type:String},value:{type:String},mutation:{type:Function,required:!0},done:{type:Function}},setup(r){const s=r,{handleSubmit:v}=B(),c=V(),{mutate:f,loading:m,onDone:_}=s.mutation(),{value:o,resetField:y,errorMessage:u}=C("inputValue",b().required());o.value=s.value??"",o.value||y();function g(){p()}(async()=>{var e;await k(),(e=c.value)==null||e.focus()})();const i=v(()=>{f(s.getVariables(o.value??""))});return _(()=>{var e;(e=s.done)==null||e.call(this,o.value),p()}),(e,a)=>(x(),E("md-dialog",null,[n("div",D,d(r.title),1),n("div",R,[F(n("md-outlined-text-field",{ref_key:"inputRef",ref:c,placeholder:r.placeholder,"onUpdate:modelValue":a[0]||(a[0]=l=>S(o)?o.value=l:null),onKeyup:a[1]||(a[1]=q((...l)=>t(i)&&t(i)(...l),["enter"])),error:t(u),"error-text":t(u)?e.$t(t(u)):""},null,40,$),[[M,t(o)]])]),n("div",K,[n("md-outlined-button",{value:"cancel",onClick:g},d(e.$t("cancel")),1),n("md-filled-button",{value:"save",disabled:t(m),onClick:a[2]||(a[2]=(...l)=>t(i)&&t(i)(...l)),autofocus:""},d(e.$t("save")),9,T)])]))}});const I=w(U,[["__scopeId","data-v-78f7a9dc"]]);export{I as E};
diff --git a/app/src/main/resources/web/assets/FeedEntryView-81a9d372.js b/app/src/main/resources/web/assets/FeedEntryView-93b87810.js
similarity index 95%
rename from app/src/main/resources/web/assets/FeedEntryView-81a9d372.js
rename to app/src/main/resources/web/assets/FeedEntryView-93b87810.js
index 6631bbec..3d7dc84c 100644
--- a/app/src/main/resources/web/assets/FeedEntryView-81a9d372.js
+++ b/app/src/main/resources/web/assets/FeedEntryView-93b87810.js
@@ -1 +1 @@
-import{_ as P}from"./print-outline-rounded-4b36e17a.js";import{o as s,c as o,a,d as Y,u as W,D as X,r as _,s as ee,f as te,g as S,i as ne,O as se,P as r,Q as oe,R as ae,t as q,S as ie,j as g,k as I,F as ce,J as le,m as u,l as b,p,x as Q,cm as de,aT as _e,cn as re,a5 as ue,Z as pe,A as me,B as he,a2 as ve,a3 as Te,a4 as ye,_ as fe}from"./index-a9bbc323.js";import{u as qe}from"./markdown-1f5c44e0.js";const ge={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},be=a("path",{fill:"currentColor",d:"M5 21q-.825 0-1.413-.588T3 19V5q0-.825.588-1.413T5 3h6q.425 0 .713.288T12 4q0 .425-.288.713T11 5H5v14h14v-6q0-.425.288-.713T20 12q.425 0 .713.288T21 13v6q0 .825-.588 1.413T19 21H5Zm4-6q-.275-.275-.275-.7T9 13.6L17.6 5H15q-.425 0-.713-.288T14 4q0-.425.288-.713T15 3h5q.425 0 .713.288T21 4v5q0 .425-.288.713T20 10q-.425 0-.713-.288T19 9V6.4l-8.625 8.625q-.275.275-.675.275T9 15Z"},null,-1),we=[be];function ke(i,c){return s(),o("svg",ge,we)}const Ce={name:"material-symbols-open-in-new-rounded",render:ke},$e={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Ee=a("path",{fill:"currentColor",d:"M15.375 19.25q-.525.25-.95-.038T14 18.275q0-.25.163-.487t.412-.363q1.575-.75 2.5-2.225T18 11.95q0-1.125-.425-2.187T16.25 7.8L16 7.55V9q0 .425-.288.713T15 10q-.425 0-.713-.288T14 9V5q0-.425.288-.713T15 4h4q.425 0 .713.288T20 5q0 .425-.288.713T19 6h-1.75l.4.35q1.225 1.225 1.788 2.663T20 11.95q0 2.4-1.25 4.363t-3.375 2.937ZM5 20q-.425 0-.713-.288T4 19q0-.425.288-.713T5 18h1.75l-.4-.35q-1.225-1.225-1.788-2.663T4 12.05q0-2.4 1.25-4.362T8.625 4.75q.525-.25.95.038t.425.937q0 .25-.163.488t-.412.362q-1.575.75-2.5 2.225T6 12.05q0 1.125.425 2.188T7.75 16.2l.25.25V15q0-.425.288-.713T9 14q.425 0 .713.288T10 15v4q0 .425-.288.713T9 20H5Z"},null,-1),Fe=[Ee];function Ve(i,c){return s(),o("svg",$e,Fe)}const Me={name:"material-symbols-sync-rounded",render:Ve},h=i=>(me("data-v-5b41a86a"),i=i(),he(),i),Le={class:"container"},De={class:"title"},He={class:"subtitle v-center"},Be={key:1,class:"author"},xe=["onClick"],Ae=h(()=>a("md-ripple",null,null,-1)),Se={key:2,indeterminate:"",class:"spinner-sm"},Ie=["disabled","onClick"],Qe=h(()=>a("md-ripple",null,null,-1)),Ze=["href"],Ne={class:"icon-button"},Re=h(()=>a("md-ripple",null,null,-1)),Ge=["onClick"],Ue=h(()=>a("md-ripple",null,null,-1)),je=["innerHTML"],m="FEED_ENTRY",ze=Y({__name:"FeedEntryView",setup(i){const{t:c}=W(),Z=X(),w=_(Z.params.id),n=_(),v=_(""),T=_(),{app:N,urlTokenKey:R}=ee(te()),{render:k}=qe(N,R),{refetch:C}=S({handle:async(e,t)=>{t?Q(c(t),"error"):(n.value=e.feedEntry,v.value=await k(e.feedEntry.content||e.feedEntry.description))},document:de,variables:()=>({id:w.value}),appApi:!0});S({handle:(e,t)=>{t?Q(c(t),"error"):e&&(T.value=e.tags)},document:_e,variables:{type:m},appApi:!0});const G=()=>{window.print()};function U(){var e,t;ve(Te,{type:m,tags:T.value,item:{key:(e=n.value)==null?void 0:e.id,title:"",size:0},selected:(t=T.value)==null?void 0:t.filter(y=>{var l;return(l=n.value)==null?void 0:l.tags.some(f=>f.id===y.id)})})}const{mutate:j,loading:$,onDone:z}=ne({document:re,appApi:!0});z(async e=>{const t=e.data;n.value=t.syncFeedContent,v.value=await k(t.syncFeedContent.content||t.syncFeedContent.description)});const J=()=>{j({id:w.value})},E=e=>{e.type===m&&C()},F=e=>{e.type===m&&C()};return se(()=>{r.on("item_tags_updated",F),r.on("items_tags_updated",E)}),oe(()=>{r.off("item_tags_updated",F),r.off("items_tags_updated",E)}),(e,t)=>{var V,M,L,D,H,B,x;const y=ue,l=ye,f=Me,K=Ce,O=P,d=ae("tooltip");return s(),o("div",Le,[a("h2",De,q((V=n.value)==null?void 0:V.title),1),a("div",He,[(M=n.value)!=null&&M.publishedAt?(s(),ie(y,{key:0,class:"time",id:g(pe)((L=n.value)==null?void 0:L.publishedAt),raw:n.value},null,8,["id","raw"])):I("",!0),(D=n.value)!=null&&D.author?(s(),o("span",Be,q((H=n.value)==null?void 0:H.author),1)):I("",!0),(s(!0),o(ce,null,le((B=n.value)==null?void 0:B.tags,A=>(s(),o("span",{key:A.id,class:"badge"},q(A.name),1))),128)),u((s(),o("button",{class:"icon-button",onClick:b(U,["prevent"]),style:{"margin-inline-start":"8px"}},[Ae,p(l)],8,xe)),[[d,e.$t("add_to_tags")]]),g($)?(s(),o("md-circular-progress",Se)):u((s(),o("button",{key:3,class:"icon-button btn-icon",disabled:g($),onClick:b(J,["prevent"])},[Qe,p(f)],8,Ie)),[[d,e.$t("sync_content")]]),u((s(),o("a",{href:(x=n.value)==null?void 0:x.url,target:"_blank"},[a("button",Ne,[Re,p(K)])],8,Ze)),[[d,e.$t("view_original_article")]]),u((s(),o("button",{class:"icon-button",onClick:b(G,["prevent"])},[Ue,p(O)],8,Ge)),[[d,e.$t("print")]])]),a("div",{class:"md-container",innerHTML:v.value},null,8,je)])}}});const Pe=fe(ze,[["__scopeId","data-v-5b41a86a"]]);export{Pe as default};
+import{_ as P}from"./print-outline-rounded-00796edf.js";import{o as s,c as o,a,d as Y,u as W,D as X,r as _,s as ee,f as te,g as S,i as ne,O as se,P as r,Q as oe,R as ae,t as q,S as ie,j as g,k as I,F as ce,J as le,m as u,l as b,p,x as Q,cm as de,aT as _e,cn as re,a5 as ue,Z as pe,A as me,B as he,a2 as ve,a3 as Te,a4 as ye,_ as fe}from"./index-82e633ff.js";import{u as qe}from"./markdown-ac4c00dc.js";const ge={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},be=a("path",{fill:"currentColor",d:"M5 21q-.825 0-1.413-.588T3 19V5q0-.825.588-1.413T5 3h6q.425 0 .713.288T12 4q0 .425-.288.713T11 5H5v14h14v-6q0-.425.288-.713T20 12q.425 0 .713.288T21 13v6q0 .825-.588 1.413T19 21H5Zm4-6q-.275-.275-.275-.7T9 13.6L17.6 5H15q-.425 0-.713-.288T14 4q0-.425.288-.713T15 3h5q.425 0 .713.288T21 4v5q0 .425-.288.713T20 10q-.425 0-.713-.288T19 9V6.4l-8.625 8.625q-.275.275-.675.275T9 15Z"},null,-1),we=[be];function ke(i,c){return s(),o("svg",ge,we)}const Ce={name:"material-symbols-open-in-new-rounded",render:ke},$e={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Ee=a("path",{fill:"currentColor",d:"M15.375 19.25q-.525.25-.95-.038T14 18.275q0-.25.163-.487t.412-.363q1.575-.75 2.5-2.225T18 11.95q0-1.125-.425-2.187T16.25 7.8L16 7.55V9q0 .425-.288.713T15 10q-.425 0-.713-.288T14 9V5q0-.425.288-.713T15 4h4q.425 0 .713.288T20 5q0 .425-.288.713T19 6h-1.75l.4.35q1.225 1.225 1.788 2.663T20 11.95q0 2.4-1.25 4.363t-3.375 2.937ZM5 20q-.425 0-.713-.288T4 19q0-.425.288-.713T5 18h1.75l-.4-.35q-1.225-1.225-1.788-2.663T4 12.05q0-2.4 1.25-4.362T8.625 4.75q.525-.25.95.038t.425.937q0 .25-.163.488t-.412.362q-1.575.75-2.5 2.225T6 12.05q0 1.125.425 2.188T7.75 16.2l.25.25V15q0-.425.288-.713T9 14q.425 0 .713.288T10 15v4q0 .425-.288.713T9 20H5Z"},null,-1),Fe=[Ee];function Ve(i,c){return s(),o("svg",$e,Fe)}const Me={name:"material-symbols-sync-rounded",render:Ve},h=i=>(me("data-v-5b41a86a"),i=i(),he(),i),Le={class:"container"},De={class:"title"},He={class:"subtitle v-center"},Be={key:1,class:"author"},xe=["onClick"],Ae=h(()=>a("md-ripple",null,null,-1)),Se={key:2,indeterminate:"",class:"spinner-sm"},Ie=["disabled","onClick"],Qe=h(()=>a("md-ripple",null,null,-1)),Ze=["href"],Ne={class:"icon-button"},Re=h(()=>a("md-ripple",null,null,-1)),Ge=["onClick"],Ue=h(()=>a("md-ripple",null,null,-1)),je=["innerHTML"],m="FEED_ENTRY",ze=Y({__name:"FeedEntryView",setup(i){const{t:c}=W(),Z=X(),w=_(Z.params.id),n=_(),v=_(""),T=_(),{app:N,urlTokenKey:R}=ee(te()),{render:k}=qe(N,R),{refetch:C}=S({handle:async(e,t)=>{t?Q(c(t),"error"):(n.value=e.feedEntry,v.value=await k(e.feedEntry.content||e.feedEntry.description))},document:de,variables:()=>({id:w.value}),appApi:!0});S({handle:(e,t)=>{t?Q(c(t),"error"):e&&(T.value=e.tags)},document:_e,variables:{type:m},appApi:!0});const G=()=>{window.print()};function U(){var e,t;ve(Te,{type:m,tags:T.value,item:{key:(e=n.value)==null?void 0:e.id,title:"",size:0},selected:(t=T.value)==null?void 0:t.filter(y=>{var l;return(l=n.value)==null?void 0:l.tags.some(f=>f.id===y.id)})})}const{mutate:j,loading:$,onDone:z}=ne({document:re,appApi:!0});z(async e=>{const t=e.data;n.value=t.syncFeedContent,v.value=await k(t.syncFeedContent.content||t.syncFeedContent.description)});const J=()=>{j({id:w.value})},E=e=>{e.type===m&&C()},F=e=>{e.type===m&&C()};return se(()=>{r.on("item_tags_updated",F),r.on("items_tags_updated",E)}),oe(()=>{r.off("item_tags_updated",F),r.off("items_tags_updated",E)}),(e,t)=>{var V,M,L,D,H,B,x;const y=ue,l=ye,f=Me,K=Ce,O=P,d=ae("tooltip");return s(),o("div",Le,[a("h2",De,q((V=n.value)==null?void 0:V.title),1),a("div",He,[(M=n.value)!=null&&M.publishedAt?(s(),ie(y,{key:0,class:"time",id:g(pe)((L=n.value)==null?void 0:L.publishedAt),raw:n.value},null,8,["id","raw"])):I("",!0),(D=n.value)!=null&&D.author?(s(),o("span",Be,q((H=n.value)==null?void 0:H.author),1)):I("",!0),(s(!0),o(ce,null,le((B=n.value)==null?void 0:B.tags,A=>(s(),o("span",{key:A.id,class:"badge"},q(A.name),1))),128)),u((s(),o("button",{class:"icon-button",onClick:b(U,["prevent"]),style:{"margin-inline-start":"8px"}},[Ae,p(l)],8,xe)),[[d,e.$t("add_to_tags")]]),g($)?(s(),o("md-circular-progress",Se)):u((s(),o("button",{key:3,class:"icon-button btn-icon",disabled:g($),onClick:b(J,["prevent"])},[Qe,p(f)],8,Ie)),[[d,e.$t("sync_content")]]),u((s(),o("a",{href:(x=n.value)==null?void 0:x.url,target:"_blank"},[a("button",Ne,[Re,p(K)])],8,Ze)),[[d,e.$t("view_original_article")]]),u((s(),o("button",{class:"icon-button",onClick:b(G,["prevent"])},[Ue,p(O)],8,Ge)),[[d,e.$t("print")]])]),a("div",{class:"md-container",innerHTML:v.value},null,8,je)])}}});const Pe=fe(ze,[["__scopeId","data-v-5b41a86a"]]);export{Pe as default};
diff --git a/app/src/main/resources/web/assets/FeedsRootView-69fc861a.js b/app/src/main/resources/web/assets/FeedsRootView-9fb85f09.js
similarity index 95%
rename from app/src/main/resources/web/assets/FeedsRootView-69fc861a.js
rename to app/src/main/resources/web/assets/FeedsRootView-9fb85f09.js
index 12d26b3f..3aa03427 100644
--- a/app/src/main/resources/web/assets/FeedsRootView-69fc861a.js
+++ b/app/src/main/resources/web/assets/FeedsRootView-9fb85f09.js
@@ -1 +1 @@
-import{a as ae,_ as le}from"./TagFilter.vuevuetypescriptsetuptruelang-d0de30fc.js";import{d as I,r as y,i as D,ca as ie,an as P,U,ao as V,o as C,c as g,a as t,t as i,m as N,v as j,j as e,n as H,ap as J,h as q,_ as de,cb as ce,u as re,e as ue,D as pe,E as _e,cc as fe,g as me,cd as ve,x as T,G as he,R as $e,p as w,H as L,ce as be,cf as ke,cg as Ce,F as G,J as S,l as B,I as z,bC as K,a2 as R,T as ge,C as E,W as ye,aI as Fe,ch as xe,ac as we}from"./index-a9bbc323.js";import{g as O,M as Me}from"./splitpanes.es-37578c0b.js";import{u as W,a as Y}from"./vee-validate.esm-d674d968.js";import"./EditValueModal-8c79ab9c.js";const Ae={slot:"headline"},Ve={slot:"content"},De={class:"form-row"},Le=["label","error","error-text"],Re={class:"form-row"},Ee={class:"form-check-label"},Ie=["checked"],Ne={slot:"actions"},qe=["disabled"],Qe=I({__name:"AddFeedModal",props:{done:{type:Function}},setup(M){const d=M,{handleSubmit:$}=W(),f=y(),c=y(!1);function b(o){c.value=o.target.checked}const{mutate:m,loading:F,onDone:k}=D({document:ie,appApi:!0}),{value:l,resetField:v,errorMessage:r}=Y("inputValue",P().required());v();function x(){V()}(async()=>{var o;await U(),(o=f.value)==null||o.focus()})();const p=$(()=>{m({url:l.value??"",fetchContent:c.value})});return k(()=>{var o;(o=d.done)==null||o.call(this),V()}),(o,n)=>(C(),g("md-dialog",null,[t("div",Ae,i(o.$t("add_subscription")),1),t("div",Ve,[t("div",De,[N(t("md-outlined-text-field",{ref_key:"inputRef",ref:f,label:o.$t("rss_url"),"onUpdate:modelValue":n[0]||(n[0]=u=>H(l)?l.value=u:null),onKeyup:n[1]||(n[1]=J((...u)=>e(p)&&e(p)(...u),["enter"])),error:e(r),"error-text":e(r)?o.$t(e(r)):""},null,40,Le),[[j,e(l)]])]),t("div",Re,[t("label",Ee,[t("md-checkbox",{"touch-target":"wrapper",onChange:b,checked:c.value},null,40,Ie),q(" "+i(o.$t("fetch_content_automatically")),1)])])]),t("div",Ne,[t("md-outlined-button",{value:"cancel",onClick:x},i(o.$t("cancel")),1),t("md-filled-button",{value:"save",disabled:e(F),onClick:n[2]||(n[2]=(...u)=>e(p)&&e(p)(...u)),autofocus:""},i(o.$t("save")),9,qe)])]))}});const Te=de(Qe,[["__scopeId","data-v-24d21569"]]),Ge={slot:"headline"},Se={slot:"content"},Be={class:"form-label"},ze={class:"form-row"},Ke=["label","error","error-text"],Oe={class:"form-row"},Pe={class:"form-check-label"},Ue=["checked"],je={slot:"actions"},He=["disabled"],Je=I({__name:"FeedModal",props:{data:{type:Object}},setup(M){var x,p;const d=M,{handleSubmit:$}=W(),f=y(),c=y(!1);function b(o){c.value=o.target.checked}const{mutate:m,loading:F,onDone:k}=D({document:ce,appApi:!0}),{value:l,errorMessage:v}=Y("inputValue",P().required());l.value=((x=d.data)==null?void 0:x.name)??"",c.value=((p=d.data)==null?void 0:p.fetchContent)??!1,(async()=>{var o;await U(),(o=f.value)==null||o.focus()})();const r=$(()=>{var o;m({id:(o=d.data)==null?void 0:o.id,name:l.value,fetchContent:c.value})});return k(()=>{V()}),(o,n)=>{var u;return C(),g("md-dialog",null,[t("div",Ge,i(o.$t("update_subscription")),1),t("div",Se,[t("div",Be,i((u=M.data)==null?void 0:u.url),1),t("div",ze,[N(t("md-outlined-text-field",{ref_key:"inputRef",ref:f,class:"form-control",label:o.$t("name"),error:e(v),"error-text":e(v)?o.$t(e(v)):"","onUpdate:modelValue":n[0]||(n[0]=_=>H(l)?l.value=_:null),onKeyup:n[1]||(n[1]=J((..._)=>e(r)&&e(r)(..._),["enter"]))},null,40,Ke),[[j,e(l)]])]),t("div",Oe,[t("label",Pe,[t("md-checkbox",{"touch-target":"wrapper",onChange:b,checked:c.value},null,40,Ue),q(" "+i(o.$t("fetch_content_automatically")),1)])])]),t("div",je,[t("md-outlined-button",{value:"cancel",onClick:n[2]||(n[2]=(..._)=>e(V)&&e(V)(..._))},i(o.$t("cancel")),1),t("md-filled-button",{value:"save",disabled:e(F),onClick:n[3]||(n[3]=(..._)=>e(r)&&e(r)(..._)),autofocus:""},i(o.$t("save")),9,He)])])}}}),We={class:"page-container"},Ye={class:"sidebar"},Xe={class:"nav-title"},Ze={style:{position:"relative"}},et=t("md-ripple",null,null,-1),tt=["open"],ot=["onClick"],nt={slot:"headline"},st={class:"nav"},at=["onClick"],lt=["onClick","onContextmenu"],it={class:"main"},_t=I({__name:"FeedsRootView",setup(M){const{t:d}=re(),$=ue(),f=y([]),c=[{text:"add_subscription",click:x},{text:"import_opml_file",click:_},{text:"export_opml_file",click:X}],b=y(!1),m=pe(),F=_e(m.query),k=fe(m.query),l=y(),{refetch:v}=me({handle:(s,a)=>{a?T(d(a),"error"):s&&(f.value=s.feeds)},document:be,appApi:!0});function r(s){const a=s.target.files;if(!a)return;const A=new FileReader;A.addEventListener("load",()=>{n({content:A.result})},!1),A.readAsText(a[0])}function x(){R(Te,{done:()=>{v()}})}const{mutate:p,onDone:o}=D({document:ke,appApi:!0});o(s=>{ve(s.data.exportFeeds,"application/xml","feeds.xml")});const{mutate:n,onDone:u}=D({document:Ce,appApi:!0});u(()=>{T(d("imported")),v()});function _(){l.value.value="",l.value.click()}function X(){p()}function Z(s){const a=ge([{name:"feed",op:"",value:K(s.name)}]);E($,`/feeds?q=${ye(a)}`)}function ee(s,a){s.preventDefault(),Fe({x:s.x,y:s.y,items:[{label:d("edit"),onClick:()=>{R(Je,{data:a})}},{label:d("delete"),onClick:()=>{R(we,{id:a.id,name:a.name,gql:xe,appApi:!0,typeName:"Feed",done:()=>{E($,"/feeds")}})}}]})}function te(){E($,"/feeds")}return(s,a)=>{const A=ae,oe=le,ne=he("router-view"),se=$e("tooltip");return C(),g("div",We,[w(e(Me),null,{default:L(()=>[w(e(O),{size:"20","min-size":"10"},{default:L(()=>[t("div",Ye,[t("h2",Xe,[q(i(s.$t("page_title.feeds"))+" ",1),t("div",Ze,[N((C(),g("button",{class:"icon-button",id:"add-feed-ref",onClick:a[0]||(a[0]=()=>b.value=!0)},[et,w(A)])),[[se,e(d)("add_subscription")]]),t("md-menu",{anchor:"add-feed-ref",positioning:"fixed","stay-open-on-focusout":"",quick:"",open:b.value,onClosed:a[1]||(a[1]=()=>b.value=!1)},[(C(),g(G,null,S(c,h=>t("md-menu-item",{onClick:h.click},[t("div",nt,i(s.$t(h.text)),1)],8,ot)),64))],40,tt)])]),t("ul",st,[t("li",{onClick:B(te,["prevent"]),class:z({active:e(m).path==="/feeds"&&!e(F)&&!e(k)})},i(s.$t("all")),11,at),(C(!0),g(G,null,S(f.value,h=>(C(),g("li",{onClick:B(Q=>Z(h),["stop","prevent"]),onContextmenu:Q=>ee(Q,h),class:z({active:e(m).params.feedId===h.id||e(k)&&e(K)(h.name)===e(k)})},i(h.name),43,lt))),256))]),w(oe,{type:"FEED_ENTRY",selected:e(F)},null,8,["selected"])])]),_:1}),w(e(O),null,{default:L(()=>[t("div",it,[w(ne)])]),_:1})]),_:1}),t("input",{ref_key:"fileInput",ref:l,style:{display:"none"},accept:".xml",type:"file",onChange:r},null,544)])}}});export{_t as default};
+import{a as ae,_ as le}from"./TagFilter.vuevuetypescriptsetuptruelang-10776836.js";import{d as I,r as y,i as D,ca as ie,an as P,U,ao as V,o as C,c as g,a as t,t as i,m as N,v as j,j as e,n as H,ap as J,h as q,_ as de,cb as ce,u as re,e as ue,D as pe,E as _e,cc as fe,g as me,cd as ve,x as T,G as he,R as $e,p as w,H as L,ce as be,cf as ke,cg as Ce,F as G,J as S,l as B,I as z,bC as K,a2 as R,T as ge,C as E,W as ye,aI as Fe,ch as xe,ac as we}from"./index-82e633ff.js";import{g as O,M as Me}from"./splitpanes.es-de3e6852.js";import{u as W,a as Y}from"./vee-validate.esm-6643484a.js";import"./EditValueModal-df390030.js";const Ae={slot:"headline"},Ve={slot:"content"},De={class:"form-row"},Le=["label","error","error-text"],Re={class:"form-row"},Ee={class:"form-check-label"},Ie=["checked"],Ne={slot:"actions"},qe=["disabled"],Qe=I({__name:"AddFeedModal",props:{done:{type:Function}},setup(M){const d=M,{handleSubmit:$}=W(),f=y(),c=y(!1);function b(o){c.value=o.target.checked}const{mutate:m,loading:F,onDone:k}=D({document:ie,appApi:!0}),{value:l,resetField:v,errorMessage:r}=Y("inputValue",P().required());v();function x(){V()}(async()=>{var o;await U(),(o=f.value)==null||o.focus()})();const p=$(()=>{m({url:l.value??"",fetchContent:c.value})});return k(()=>{var o;(o=d.done)==null||o.call(this),V()}),(o,n)=>(C(),g("md-dialog",null,[t("div",Ae,i(o.$t("add_subscription")),1),t("div",Ve,[t("div",De,[N(t("md-outlined-text-field",{ref_key:"inputRef",ref:f,label:o.$t("rss_url"),"onUpdate:modelValue":n[0]||(n[0]=u=>H(l)?l.value=u:null),onKeyup:n[1]||(n[1]=J((...u)=>e(p)&&e(p)(...u),["enter"])),error:e(r),"error-text":e(r)?o.$t(e(r)):""},null,40,Le),[[j,e(l)]])]),t("div",Re,[t("label",Ee,[t("md-checkbox",{"touch-target":"wrapper",onChange:b,checked:c.value},null,40,Ie),q(" "+i(o.$t("fetch_content_automatically")),1)])])]),t("div",Ne,[t("md-outlined-button",{value:"cancel",onClick:x},i(o.$t("cancel")),1),t("md-filled-button",{value:"save",disabled:e(F),onClick:n[2]||(n[2]=(...u)=>e(p)&&e(p)(...u)),autofocus:""},i(o.$t("save")),9,qe)])]))}});const Te=de(Qe,[["__scopeId","data-v-24d21569"]]),Ge={slot:"headline"},Se={slot:"content"},Be={class:"form-label"},ze={class:"form-row"},Ke=["label","error","error-text"],Oe={class:"form-row"},Pe={class:"form-check-label"},Ue=["checked"],je={slot:"actions"},He=["disabled"],Je=I({__name:"FeedModal",props:{data:{type:Object}},setup(M){var x,p;const d=M,{handleSubmit:$}=W(),f=y(),c=y(!1);function b(o){c.value=o.target.checked}const{mutate:m,loading:F,onDone:k}=D({document:ce,appApi:!0}),{value:l,errorMessage:v}=Y("inputValue",P().required());l.value=((x=d.data)==null?void 0:x.name)??"",c.value=((p=d.data)==null?void 0:p.fetchContent)??!1,(async()=>{var o;await U(),(o=f.value)==null||o.focus()})();const r=$(()=>{var o;m({id:(o=d.data)==null?void 0:o.id,name:l.value,fetchContent:c.value})});return k(()=>{V()}),(o,n)=>{var u;return C(),g("md-dialog",null,[t("div",Ge,i(o.$t("update_subscription")),1),t("div",Se,[t("div",Be,i((u=M.data)==null?void 0:u.url),1),t("div",ze,[N(t("md-outlined-text-field",{ref_key:"inputRef",ref:f,class:"form-control",label:o.$t("name"),error:e(v),"error-text":e(v)?o.$t(e(v)):"","onUpdate:modelValue":n[0]||(n[0]=_=>H(l)?l.value=_:null),onKeyup:n[1]||(n[1]=J((..._)=>e(r)&&e(r)(..._),["enter"]))},null,40,Ke),[[j,e(l)]])]),t("div",Oe,[t("label",Pe,[t("md-checkbox",{"touch-target":"wrapper",onChange:b,checked:c.value},null,40,Ue),q(" "+i(o.$t("fetch_content_automatically")),1)])])]),t("div",je,[t("md-outlined-button",{value:"cancel",onClick:n[2]||(n[2]=(..._)=>e(V)&&e(V)(..._))},i(o.$t("cancel")),1),t("md-filled-button",{value:"save",disabled:e(F),onClick:n[3]||(n[3]=(..._)=>e(r)&&e(r)(..._)),autofocus:""},i(o.$t("save")),9,He)])])}}}),We={class:"page-container"},Ye={class:"sidebar"},Xe={class:"nav-title"},Ze={style:{position:"relative"}},et=t("md-ripple",null,null,-1),tt=["open"],ot=["onClick"],nt={slot:"headline"},st={class:"nav"},at=["onClick"],lt=["onClick","onContextmenu"],it={class:"main"},_t=I({__name:"FeedsRootView",setup(M){const{t:d}=re(),$=ue(),f=y([]),c=[{text:"add_subscription",click:x},{text:"import_opml_file",click:_},{text:"export_opml_file",click:X}],b=y(!1),m=pe(),F=_e(m.query),k=fe(m.query),l=y(),{refetch:v}=me({handle:(s,a)=>{a?T(d(a),"error"):s&&(f.value=s.feeds)},document:be,appApi:!0});function r(s){const a=s.target.files;if(!a)return;const A=new FileReader;A.addEventListener("load",()=>{n({content:A.result})},!1),A.readAsText(a[0])}function x(){R(Te,{done:()=>{v()}})}const{mutate:p,onDone:o}=D({document:ke,appApi:!0});o(s=>{ve(s.data.exportFeeds,"application/xml","feeds.xml")});const{mutate:n,onDone:u}=D({document:Ce,appApi:!0});u(()=>{T(d("imported")),v()});function _(){l.value.value="",l.value.click()}function X(){p()}function Z(s){const a=ge([{name:"feed",op:"",value:K(s.name)}]);E($,`/feeds?q=${ye(a)}`)}function ee(s,a){s.preventDefault(),Fe({x:s.x,y:s.y,items:[{label:d("edit"),onClick:()=>{R(Je,{data:a})}},{label:d("delete"),onClick:()=>{R(we,{id:a.id,name:a.name,gql:xe,appApi:!0,typeName:"Feed",done:()=>{E($,"/feeds")}})}}]})}function te(){E($,"/feeds")}return(s,a)=>{const A=ae,oe=le,ne=he("router-view"),se=$e("tooltip");return C(),g("div",We,[w(e(Me),null,{default:L(()=>[w(e(O),{size:"20","min-size":"10"},{default:L(()=>[t("div",Ye,[t("h2",Xe,[q(i(s.$t("page_title.feeds"))+" ",1),t("div",Ze,[N((C(),g("button",{class:"icon-button",id:"add-feed-ref",onClick:a[0]||(a[0]=()=>b.value=!0)},[et,w(A)])),[[se,e(d)("add_subscription")]]),t("md-menu",{anchor:"add-feed-ref",positioning:"fixed","stay-open-on-focusout":"",quick:"",open:b.value,onClosed:a[1]||(a[1]=()=>b.value=!1)},[(C(),g(G,null,S(c,h=>t("md-menu-item",{onClick:h.click},[t("div",nt,i(s.$t(h.text)),1)],8,ot)),64))],40,tt)])]),t("ul",st,[t("li",{onClick:B(te,["prevent"]),class:z({active:e(m).path==="/feeds"&&!e(F)&&!e(k)})},i(s.$t("all")),11,at),(C(!0),g(G,null,S(f.value,h=>(C(),g("li",{onClick:B(Q=>Z(h),["stop","prevent"]),onContextmenu:Q=>ee(Q,h),class:z({active:e(m).params.feedId===h.id||e(k)&&e(K)(h.name)===e(k)})},i(h.name),43,lt))),256))]),w(oe,{type:"FEED_ENTRY",selected:e(F)},null,8,["selected"])])]),_:1}),w(e(O),null,{default:L(()=>[t("div",it,[w(ne)])]),_:1})]),_:1}),t("input",{ref_key:"fileInput",ref:l,style:{display:"none"},accept:".xml",type:"file",onChange:r},null,544)])}}});export{_t as default};
diff --git a/app/src/main/resources/web/assets/FeedsView-410cb8a2.js b/app/src/main/resources/web/assets/FeedsView-67c2be34.js
similarity index 95%
rename from app/src/main/resources/web/assets/FeedsView-410cb8a2.js
rename to app/src/main/resources/web/assets/FeedsView-67c2be34.js
index 53e491cc..097007be 100644
--- a/app/src/main/resources/web/assets/FeedsView-410cb8a2.js
+++ b/app/src/main/resources/web/assets/FeedsView-67c2be34.js
@@ -1,4 +1,4 @@
-import{c as ke,u as ye,_ as be,a as $e,b as Ce}from"./list-be40ed35.js";import{d as we,e as Te,r as _,u as Fe,K as Ee,L as Se,D as qe,M as Ae,N as Ve,g as De,w as Ie,O as Qe,P as f,Q as Ue,i as Le,R as Me,c as d,a as t,p as h,j as l,F as I,m as C,l as m,k as Q,t as c,H as Ne,J as X,S as Re,ci as Be,x as N,cj as Ge,ag as He,bC as ee,T as ze,U as je,ck as Ke,C as te,W as se,cl as Pe,o,v as Ye,I as Ze,ax as xe,Y as Je,h as Oe,Z as We,$ as Xe,a2 as le,ab as et,ac as tt,a3 as st,a0 as lt,a1 as at,aZ as nt,ad as ot,a4 as dt,a6 as it}from"./index-a9bbc323.js";import{_ as ct}from"./Breadcrumb-7b5128ab.js";import{a as ut}from"./tags-7e5964e8.js";import"./vee-validate.esm-d674d968.js";const rt={class:"v-toolbar"},pt=t("md-ripple",null,null,-1),_t=t("md-ripple",null,null,-1),ft=["disabled","onClick"],ht={class:"filters"},mt=["label"],gt={class:"form-label"},vt=["label","selected","onClick"],kt={class:"buttons"},yt=["onClick"],bt={class:"table-responsive"},$t={class:"table"},Ct=["checked","indeterminate"],wt=t("th",null,null,-1),Tt=t("th",null,null,-1),Ft=["onClick"],Et=["checked"],St=["src"],qt={style:{"min-width":"200px"}},At=["href","onClick"],Vt={class:"nowrap"},Dt={class:"action-btns"},It=["onClick"],Qt=t("md-ripple",null,null,-1),Ut=["onClick"],Lt=t("md-ripple",null,null,-1),Mt={class:"nowrap"},Nt={class:"nowrap"},Rt={key:0},Bt={colspan:"7"},Gt={class:"no-data-placeholder"},S=50,xt=we({__name:"FeedsView",setup(Ht){var O,W;const R=Te(),g=_([]),B=_(),{t:U}=Fe(),i=Ee({text:"",feeds:[],tags:[]}),r=Se.FEED_ENTRY,G=qe().query,q=_(parseInt(((O=G.page)==null?void 0:O.toString())??"1")),w=_([]),ae=_([]),v=_(Ae(((W=G.q)==null?void 0:W.toString())??"")),A=_(""),{addToTags:ne}=ut(r,g,w),{deleteItems:oe}=ke(Be,()=>{D(),M(),g.value.some(e=>e.tags.length)&&f.emit("refetch_tags",r)},g),V=_(!1),{allChecked:H,realAllChecked:L,selectRealAll:de,allCheckedAlertVisible:ie,clearSelection:D,toggleAllChecked:z,toggleItemChecked:j,toggleRow:ce,total:k,checked:K}=ye(g),{loading:ue,load:re,refetch:M}=Ve({handle:(e,a)=>{a?N(U(a),"error"):e&&(g.value=e.feedEntries.map(p=>({...p,checked:!1})),k.value=e.feedEntryCount)},document:Ge,variables:()=>({offset:(q.value-1)*S,limit:S,query:A.value}),appApi:!0});function pe(e){le(tt,{id:e.id,name:e.title,gql:et`
+import{c as ke,u as ye,_ as be,a as $e,b as Ce}from"./list-0feac61c.js";import{d as we,e as Te,r as _,u as Fe,K as Ee,L as Se,D as qe,M as Ae,N as Ve,g as De,w as Ie,O as Qe,P as f,Q as Ue,i as Le,R as Me,c as d,a as t,p as h,j as l,F as I,m as C,l as m,k as Q,t as c,H as Ne,J as X,S as Re,ci as Be,x as N,cj as Ge,ag as He,bC as ee,T as ze,U as je,ck as Ke,C as te,W as se,cl as Pe,o,v as Ye,I as Ze,ax as xe,Y as Je,h as Oe,Z as We,$ as Xe,a2 as le,ab as et,ac as tt,a3 as st,a0 as lt,a1 as at,aZ as nt,ad as ot,a4 as dt,a6 as it}from"./index-82e633ff.js";import{_ as ct}from"./Breadcrumb-9ca58797.js";import{a as ut}from"./tags-dce7ef69.js";import"./vee-validate.esm-6643484a.js";const rt={class:"v-toolbar"},pt=t("md-ripple",null,null,-1),_t=t("md-ripple",null,null,-1),ft=["disabled","onClick"],ht={class:"filters"},mt=["label"],gt={class:"form-label"},vt=["label","selected","onClick"],kt={class:"buttons"},yt=["onClick"],bt={class:"table-responsive"},$t={class:"table"},Ct=["checked","indeterminate"],wt=t("th",null,null,-1),Tt=t("th",null,null,-1),Ft=["onClick"],Et=["checked"],St=["src"],qt={style:{"min-width":"200px"}},At=["href","onClick"],Vt={class:"nowrap"},Dt={class:"action-btns"},It=["onClick"],Qt=t("md-ripple",null,null,-1),Ut=["onClick"],Lt=t("md-ripple",null,null,-1),Mt={class:"nowrap"},Nt={class:"nowrap"},Rt={key:0},Bt={colspan:"7"},Gt={class:"no-data-placeholder"},S=50,xt=we({__name:"FeedsView",setup(Ht){var O,W;const R=Te(),g=_([]),B=_(),{t:U}=Fe(),i=Ee({text:"",feeds:[],tags:[]}),r=Se.FEED_ENTRY,G=qe().query,q=_(parseInt(((O=G.page)==null?void 0:O.toString())??"1")),w=_([]),ae=_([]),v=_(Ae(((W=G.q)==null?void 0:W.toString())??"")),A=_(""),{addToTags:ne}=ut(r,g,w),{deleteItems:oe}=ke(Be,()=>{D(),M(),g.value.some(e=>e.tags.length)&&f.emit("refetch_tags",r)},g),V=_(!1),{allChecked:H,realAllChecked:L,selectRealAll:de,allCheckedAlertVisible:ie,clearSelection:D,toggleAllChecked:z,toggleItemChecked:j,toggleRow:ce,total:k,checked:K}=ye(g),{loading:ue,load:re,refetch:M}=Ve({handle:(e,a)=>{a?N(U(a),"error"):e&&(g.value=e.feedEntries.map(p=>({...p,checked:!1})),k.value=e.feedEntryCount)},document:Ge,variables:()=>({offset:(q.value-1)*S,limit:S,query:A.value}),appApi:!0});function pe(e){le(tt,{id:e.id,name:e.title,gql:et`
mutation deleteFeedEntry($query: String!) {
deleteFeedEntries(query: $query)
}
diff --git a/app/src/main/resources/web/assets/FilesRecentView-b7233af8.js b/app/src/main/resources/web/assets/FilesRecentView-4fe45090.js
similarity index 96%
rename from app/src/main/resources/web/assets/FilesRecentView-b7233af8.js
rename to app/src/main/resources/web/assets/FilesRecentView-4fe45090.js
index e921e0fe..093e3747 100644
--- a/app/src/main/resources/web/assets/FilesRecentView-b7233af8.js
+++ b/app/src/main/resources/web/assets/FilesRecentView-4fe45090.js
@@ -1 +1 @@
-import{d as K,u as W,r as b,f as X,s as q,br as P,i as Q,aC as Z,R as H,c as a,a as c,p as V,m as Y,l as F,k as i,h as m,t as r,j as o,F as w,J as ee,al as te,bh as se,o as n,I as oe,bi as ae,bj as ne,ax as ce,Z as le,z as ie,$ as re,A as de,B as ue,bl as pe,bn as R,ah as S,bo as g,aI as _e,am as he,bq as me,_ as ke}from"./index-a9bbc323.js";import{_ as ve}from"./Breadcrumb-7b5128ab.js";const be=p=>(de("data-v-88cef092"),p=p(),ue(),p),we={class:"v-toolbar"},ge={class:"right-actions"},fe=["onClick"],ye=be(()=>c("md-ripple",null,null,-1)),Ie={class:"form-check-label"},Ce=["checked"],De={class:"panel-container"},Te={key:0,class:"file-items"},Ve=["onClick","onDblclick","onContextmenu"],Fe=["checked"],Re=["src"],Se={class:"title"},Ee={style:{"font-size":"0.75rem"}},xe={key:1,class:"no-data-placeholder"},$e={key:0,class:"file-item-info"},Ae=K({__name:"FilesRecentView",setup(p){const{t:k}=W(),E=b([]),u=b(!1),f=X(),{app:y,urlTokenKey:_}=q(f),{loading:x,files:d}=P(_),{downloadFile:I,downloadDir:$,downloadFiles:A}=te(_),{view:C}=me(E,(e,t)=>{f.lightbox={sources:e,index:t,visible:!0}}),h=b(null),{mutate:N,onDone:B}=Q({document:se,appApi:!0});B(e=>{A(e.data.setTempValue.key),d.value.forEach(t=>{t.checked=!1})});const D=()=>{const e=[];return d.value.forEach(t=>{t.checked&&e.push({path:t.path})}),e};function z(e){u.value=e.target.checked}const M=()=>{N({key:pe(),value:JSON.stringify(D())})},L=Z(()=>D().length>0);function O(e){if(u.value){e.checked=!e.checked;return}h.value=e}function U(e){R(e.name)?window.open(S(_.value,e.path),"_blank"):g(e.name)?C(d.value,e):I(e.path)}function G(e,t){e.preventDefault();let l;t.isDir?l=[{label:k("download"),onClick:()=>{$(t.path)}}]:(l=[],(R(t.name)||g(t.name))&&l.push({label:k("open"),onClick:()=>{g(t.name)?C(d.value,t):window.open(S(_.value,t.path),"_blank")}}),l.push({label:k("download"),onClick:()=>{I(t.path)}})),_e({x:e.x,y:e.y,items:l})}return(e,t)=>{const l=ve,j=he,J=H("tooltip");return n(),a(w,null,[c("div",we,[V(l,{current:e.$t("recent_files")},null,8,["current"]),c("div",ge,[u.value&&L.value?Y((n(),a("button",{key:0,class:"icon-button",onClick:F(M,["stop"])},[ye,V(j)],8,fe)),[[J,e.$t("download")]]):i("",!0),c("label",Ie,[c("md-checkbox",{"touch-target":"wrapper",onChange:z,checked:u.value},null,40,Ce),m(r(e.$t("select_mode")),1)])])]),c("div",De,[o(y).permissions.includes("WRITE_EXTERNAL_STORAGE")?(n(),a("div",Te,[(n(!0),a(w,null,ee(o(d),s=>{var T;return n(),a("div",{key:s.path,class:oe(["file-item",{active:((T=h.value)==null?void 0:T.path)===s.path}]),onClick:v=>O(s),onDblclick:F(v=>U(s),["prevent"]),onContextmenu:v=>G(v,s)},[u.value?(n(),a("md-checkbox",{key:0,"touch-target":"wrapper",checked:s.checked},null,8,Fe)):i("",!0),o(ae)(s.name)||o(ne)(s.name)?(n(),a("img",{key:1,src:o(ce)(s.fileId)+"&w=50&h=50",width:"50",height:"50",onerror:"this.src='/broken-image.png'"},null,8,Re)):i("",!0),c("div",Se,[m(r(s.name)+" ",1),c("div",Ee,[m(r(o(le)(s.updatedAt)),1),s.isDir?i("",!0):(n(),a(w,{key:0},[m(", "+r(o(ie)(s.size)),1)],64))])])],42,Ve)}),128))])):i("",!0),o(d).length===0?(n(),a("div",xe,r(e.$t(o(re)(o(x),o(y).permissions,"WRITE_EXTERNAL_STORAGE"))),1)):i("",!0)]),h.value?(n(),a("div",$e,r(e.$t("path"))+": "+r(h.value.path),1)):i("",!0)],64)}}});const ze=ke(Ae,[["__scopeId","data-v-88cef092"]]);export{ze as default};
+import{d as K,u as W,r as b,f as X,s as q,br as P,i as Q,aC as Z,R as H,c as a,a as c,p as V,m as Y,l as F,k as i,h as m,t as r,j as o,F as w,J as ee,al as te,bh as se,o as n,I as oe,bi as ae,bj as ne,ax as ce,Z as le,z as ie,$ as re,A as de,B as ue,bl as pe,bn as R,ah as S,bo as g,aI as _e,am as he,bq as me,_ as ke}from"./index-82e633ff.js";import{_ as ve}from"./Breadcrumb-9ca58797.js";const be=p=>(de("data-v-88cef092"),p=p(),ue(),p),we={class:"v-toolbar"},ge={class:"right-actions"},fe=["onClick"],ye=be(()=>c("md-ripple",null,null,-1)),Ie={class:"form-check-label"},Ce=["checked"],De={class:"panel-container"},Te={key:0,class:"file-items"},Ve=["onClick","onDblclick","onContextmenu"],Fe=["checked"],Re=["src"],Se={class:"title"},Ee={style:{"font-size":"0.75rem"}},xe={key:1,class:"no-data-placeholder"},$e={key:0,class:"file-item-info"},Ae=K({__name:"FilesRecentView",setup(p){const{t:k}=W(),E=b([]),u=b(!1),f=X(),{app:y,urlTokenKey:_}=q(f),{loading:x,files:d}=P(_),{downloadFile:I,downloadDir:$,downloadFiles:A}=te(_),{view:C}=me(E,(e,t)=>{f.lightbox={sources:e,index:t,visible:!0}}),h=b(null),{mutate:N,onDone:B}=Q({document:se,appApi:!0});B(e=>{A(e.data.setTempValue.key),d.value.forEach(t=>{t.checked=!1})});const D=()=>{const e=[];return d.value.forEach(t=>{t.checked&&e.push({path:t.path})}),e};function z(e){u.value=e.target.checked}const M=()=>{N({key:pe(),value:JSON.stringify(D())})},L=Z(()=>D().length>0);function O(e){if(u.value){e.checked=!e.checked;return}h.value=e}function U(e){R(e.name)?window.open(S(_.value,e.path),"_blank"):g(e.name)?C(d.value,e):I(e.path)}function G(e,t){e.preventDefault();let l;t.isDir?l=[{label:k("download"),onClick:()=>{$(t.path)}}]:(l=[],(R(t.name)||g(t.name))&&l.push({label:k("open"),onClick:()=>{g(t.name)?C(d.value,t):window.open(S(_.value,t.path),"_blank")}}),l.push({label:k("download"),onClick:()=>{I(t.path)}})),_e({x:e.x,y:e.y,items:l})}return(e,t)=>{const l=ve,j=he,J=H("tooltip");return n(),a(w,null,[c("div",we,[V(l,{current:e.$t("recent_files")},null,8,["current"]),c("div",ge,[u.value&&L.value?Y((n(),a("button",{key:0,class:"icon-button",onClick:F(M,["stop"])},[ye,V(j)],8,fe)),[[J,e.$t("download")]]):i("",!0),c("label",Ie,[c("md-checkbox",{"touch-target":"wrapper",onChange:z,checked:u.value},null,40,Ce),m(r(e.$t("select_mode")),1)])])]),c("div",De,[o(y).permissions.includes("WRITE_EXTERNAL_STORAGE")?(n(),a("div",Te,[(n(!0),a(w,null,ee(o(d),s=>{var T;return n(),a("div",{key:s.path,class:oe(["file-item",{active:((T=h.value)==null?void 0:T.path)===s.path}]),onClick:v=>O(s),onDblclick:F(v=>U(s),["prevent"]),onContextmenu:v=>G(v,s)},[u.value?(n(),a("md-checkbox",{key:0,"touch-target":"wrapper",checked:s.checked},null,8,Fe)):i("",!0),o(ae)(s.name)||o(ne)(s.name)?(n(),a("img",{key:1,src:o(ce)(s.fileId)+"&w=50&h=50",width:"50",height:"50",onerror:"this.src='/broken-image.png'"},null,8,Re)):i("",!0),c("div",Se,[m(r(s.name)+" ",1),c("div",Ee,[m(r(o(le)(s.updatedAt)),1),s.isDir?i("",!0):(n(),a(w,{key:0},[m(", "+r(o(ie)(s.size)),1)],64))])])],42,Ve)}),128))])):i("",!0),o(d).length===0?(n(),a("div",xe,r(e.$t(o(re)(o(x),o(y).permissions,"WRITE_EXTERNAL_STORAGE"))),1)):i("",!0)]),h.value?(n(),a("div",$e,r(e.$t("path"))+": "+r(h.value.path),1)):i("",!0)],64)}}});const ze=ke(Ae,[["__scopeId","data-v-88cef092"]]);export{ze as default};
diff --git a/app/src/main/resources/web/assets/FilesRootView-22132beb.js b/app/src/main/resources/web/assets/FilesRootView-432626d5.js
similarity index 91%
rename from app/src/main/resources/web/assets/FilesRootView-22132beb.js
rename to app/src/main/resources/web/assets/FilesRootView-432626d5.js
index fe491722..5053d163 100644
--- a/app/src/main/resources/web/assets/FilesRootView-22132beb.js
+++ b/app/src/main/resources/web/assets/FilesRootView-432626d5.js
@@ -1 +1 @@
-import{d as y,D as b,e as w,s as B,f as S,G as V,c as l,p as c,H as m,j as e,o as p,a as t,t as n,l as o,I as i,k as z,F as D,J as F,C as $}from"./index-a9bbc323.js";import{g as k,M}from"./splitpanes.es-37578c0b.js";const N={class:"page-container"},P={class:"sidebar"},R={class:"nav-title"},T={class:"nav"},j=["onClick"],E=["onClick"],G={class:"main"},q=y({__name:"FilesRootView",setup(H){const d=b(),f=w(),{app:C}=B(S()),u=d.params.type;function r(s){$(f,`/files/${s}`)}function h(){$(f,"/files")}return(s,a)=>{const g=V("router-view");return p(),l("div",N,[c(e(M),null,{default:m(()=>[c(e(k),{size:"20","min-size":"10"},{default:m(()=>[t("div",P,[t("h2",R,n(s.$t("page_title.files")),1),t("ul",T,[t("li",{onClick:a[0]||(a[0]=o(v=>r("recent"),["prevent"])),class:i({active:e(d).path==="/files/recent"})},n(s.$t("recents")),3),t("li",{onClick:o(h,["prevent"]),class:i({active:e(d).path==="/files"})},n(s.$t("internal_storage")),11,j),e(C).sdcardPath?(p(),l("li",{key:0,onClick:a[1]||(a[1]=o(v=>r("sdcard"),["prevent"])),class:i({active:e(u)==="sdcard"})},n(s.$t("sdcard")),3)):z("",!0),(p(!0),l(D,null,F(e(C).usbDiskPaths,(v,_)=>(p(),l("li",{onClick:o(I=>r(`usb${_+1}`),["prevent"]),class:i({active:e(u)===`usb${_+1}`})},n(s.$t("usb_storage")+" "+(_+1)),11,E))),256)),t("li",{onClick:a[2]||(a[2]=o(v=>r("app"),["prevent"])),class:i({active:e(u)==="app"})},n(s.$t("app_name")),3)])])]),_:1}),c(e(k),null,{default:m(()=>[t("div",G,[c(g)])]),_:1})]),_:1})])}}});export{q as default};
+import{d as y,D as b,e as w,s as B,f as S,G as V,c as l,p as c,H as m,j as e,o as p,a as t,t as n,l as o,I as i,k as z,F as D,J as F,C as $}from"./index-82e633ff.js";import{g as k,M}from"./splitpanes.es-de3e6852.js";const N={class:"page-container"},P={class:"sidebar"},R={class:"nav-title"},T={class:"nav"},j=["onClick"],E=["onClick"],G={class:"main"},q=y({__name:"FilesRootView",setup(H){const d=b(),f=w(),{app:C}=B(S()),u=d.params.type;function r(s){$(f,`/files/${s}`)}function h(){$(f,"/files")}return(s,a)=>{const g=V("router-view");return p(),l("div",N,[c(e(M),null,{default:m(()=>[c(e(k),{size:"20","min-size":"10"},{default:m(()=>[t("div",P,[t("h2",R,n(s.$t("page_title.files")),1),t("ul",T,[t("li",{onClick:a[0]||(a[0]=o(v=>r("recent"),["prevent"])),class:i({active:e(d).path==="/files/recent"})},n(s.$t("recents")),3),t("li",{onClick:o(h,["prevent"]),class:i({active:e(d).path==="/files"})},n(s.$t("internal_storage")),11,j),e(C).sdcardPath?(p(),l("li",{key:0,onClick:a[1]||(a[1]=o(v=>r("sdcard"),["prevent"])),class:i({active:e(u)==="sdcard"})},n(s.$t("sdcard")),3)):z("",!0),(p(!0),l(D,null,F(e(C).usbDiskPaths,(v,_)=>(p(),l("li",{onClick:o(I=>r(`usb${_+1}`),["prevent"]),class:i({active:e(u)===`usb${_+1}`})},n(s.$t("usb_storage")+" "+(_+1)),11,E))),256)),t("li",{onClick:a[2]||(a[2]=o(v=>r("app"),["prevent"])),class:i({active:e(u)==="app"})},n(s.$t("app_name")),3)])])]),_:1}),c(e(k),null,{default:m(()=>[t("div",G,[c(g)])]),_:1})]),_:1})])}}});export{q as default};
diff --git a/app/src/main/resources/web/assets/FilesView-123e18d2.js b/app/src/main/resources/web/assets/FilesView-dbbf62d9.js
similarity index 96%
rename from app/src/main/resources/web/assets/FilesView-123e18d2.js
rename to app/src/main/resources/web/assets/FilesView-dbbf62d9.js
index b1cf554c..add1d391 100644
--- a/app/src/main/resources/web/assets/FilesView-123e18d2.js
+++ b/app/src/main/resources/web/assets/FilesView-dbbf62d9.js
@@ -1 +1 @@
-import{o as a,c,a as i,d as dt,u as _t,r as V,D as pt,M as mt,ag as ht,e as ft,s as ve,f as bt,bb as vt,bc as kt,bd as gt,be as yt,bf as Ct,bg as Tt,ae as ke,i as qt,aC as wt,w as Dt,O as $t,P as H,Q as It,R as St,p as m,F as v,m as C,l as F,k as h,h as T,t as p,j as n,H as M,al as Vt,bh as Ft,at as Mt,J,S as K,I as Bt,bi as xt,bj as Et,ax as Pt,Z as Zt,z as k,$ as Ht,A as Lt,B as Rt,aG as Ut,bk as Wt,bl as zt,a2 as L,bm as ge,bn as ye,ah as Ce,bo as X,aI as Te,ad as Nt,am as At,bp as Ot,bq as Gt,_ as Qt}from"./index-a9bbc323.js";import{_ as jt}from"./sort-rounded-a0681bba.js";import{_ as Jt}from"./refresh-rounded-9c88e50a.js";import{_ as Kt}from"./Breadcrumb-7b5128ab.js";import{g as qe,M as Xt}from"./splitpanes.es-37578c0b.js";import{E as we}from"./EditValueModal-8c79ab9c.js";import"./vee-validate.esm-d674d968.js";const Yt={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},eo=i("path",{fill:"currentColor",d:"M19.6 21.6L12 14l-2.35 2.35q.2.375.275.8T10 18q0 1.65-1.175 2.825T6 22q-1.65 0-2.825-1.175T2 18q0-1.65 1.175-2.825T6 14q.425 0 .85.075t.8.275L10 12L7.65 9.65q-.375.2-.8.275T6 10q-1.65 0-2.825-1.175T2 6q0-1.65 1.175-2.825T6 2q1.65 0 2.825 1.175T10 6q0 .425-.075.85t-.275.8L21.6 19.6q.425.425.425 1t-.425 1q-.425.425-1 .425t-1-.425ZM15 11l-2-2l6.6-6.6q.425-.425 1-.425t1 .425q.425.425.425 1t-.425 1L15 11ZM6 8q.825 0 1.413-.588T8 6q0-.825-.588-1.413T6 4q-.825 0-1.413.588T4 6q0 .825.588 1.413T6 8Zm6 4.5q.225 0 .363-.138T12.5 12q0-.225-.138-.363T12 11.5q-.225 0-.363.138T11.5 12q0 .225.138.363T12 12.5ZM6 20q.825 0 1.413-.588T8 18q0-.825-.588-1.413T6 16q-.825 0-1.413.588T4 18q0 .825.588 1.413T6 20Z"},null,-1),to=[eo];function oo(g,s){return a(),c("svg",Yt,to)}const so={name:"material-symbols-content-cut-rounded",render:oo},no={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},lo=i("path",{fill:"currentColor",d:"M9 18q-.825 0-1.413-.588T7 16V4q0-.825.588-1.413T9 2h9q.825 0 1.413.588T20 4v12q0 .825-.588 1.413T18 18H9Zm0-2h9V4H9v12Zm-4 6q-.825 0-1.413-.588T3 20V7q0-.425.288-.713T4 6q.425 0 .713.288T5 7v13h10q.425 0 .713.288T16 21q0 .425-.288.713T15 22H5ZM9 4v12V4Z"},null,-1),ao=[lo];function io(g,s){return a(),c("svg",no,ao)}const co={name:"material-symbols-content-copy-outline-rounded",render:io},q=g=>(Lt("data-v-6a8cd392"),g=g(),Rt(),g),ro={class:"v-toolbar"},uo={class:"right-actions"},_o=q(()=>i("md-ripple",null,null,-1)),po=q(()=>i("md-ripple",null,null,-1)),mo=["onClick"],ho=q(()=>i("md-ripple",null,null,-1)),fo=["onClick"],bo=q(()=>i("md-ripple",null,null,-1)),vo={class:"form-check"},ko={class:"form-check-label"},go=["checked"],yo={class:"form-check"},Co={class:"form-check-label"},To=["checked"],qo=q(()=>i("md-ripple",null,null,-1)),wo={class:"icon-button btn-sort"},Do=q(()=>i("md-ripple",null,null,-1)),$o={class:"menu-items"},Io=["onClick","selected"],So={slot:"headline"},Vo={class:"file-items"},Fo=["onClick","onDblclick","onContextmenu"],Mo=["checked"],Bo=["src"],xo={class:"title"},Eo={style:{"font-size":"0.75rem"}},Po=["onContextmenu"],Zo={key:0,class:"no-files"},Ho={key:0,class:"file-item-info"},Lo=dt({__name:"FilesView",setup(g){var me,he,fe,be;const{t:s}=_t(),De=V([]),Y=pt(),$e=Y.query,d=Y.params.type,ee=V(mt(((me=$e.q)==null?void 0:me.toString())??"")),R=ht(ee.value),b=V(((he=R.find(e=>e.name==="path"))==null?void 0:he.value)??"");let B=((fe=R.find(e=>e.name==="dir"))==null?void 0:fe.value)??"";B||(((be=R.find(t=>t.name==="isDir"))==null?void 0:be.value)==="1"?B=b.value:B=b.value.substring(0,b.value.lastIndexOf("/")));const Ie=V(B),Se=Ut(),w=V(!1),te=ft(),{fileShowHidden:D,fileSortBy:U}=ve(te),oe=bt(),{app:$,urlTokenKey:I,selectedFiles:Ve}=ve(oe);let x=$.value.internalStoragePath;d&&(d==="sdcard"?x=$.value.sdcardPath:d.startsWith("usb")?x=$.value.usbDiskPaths[parseInt(d.substring(3))-1]:d==="app"&&(x=$.value.externalFilesDir));const{loading:Fe,panels:_,currentDir:E,refetch:W}=vt(I,x,Ie.value,U),{createPath:Me,createVariables:Be,createMutation:xe}=kt(I,_),{renameValue:Ee,renamePath:Pe,renameDone:Ze,renameMutation:He,renameVariables:Le}=gt(_),{internal:se,sdcard:ne,usb:Re,refetch:z}=yt(),{onDeleted:N}=Wt(_,E,z),{downloadFile:le,downloadDir:Ue,downloadFiles:We}=Vt(I),{view:A}=Gt(De,(e,t)=>{oe.lightbox={sources:e,index:t,visible:!0}}),{selectedItem:P,select:ze}=Ct(E,d,ee,te),{canPaste:ae,copy:O,cut:ie,paste:G}=Tt(Ve,W,z),{input:Ne,upload:ce,uploadChanged:re}=ke(),{input:Ae,upload:ue,uploadChanged:de}=ke(),{mutate:Oe,onDone:Ge}=qt({document:Ft,appApi:!0});Ge(e=>{We(e.data.setTempValue.key),_.value.forEach(t=>{t.items.forEach(o=>{o.checked=!1})})});const S=()=>{const e=[];return _.value.forEach(t=>{t.items.forEach(o=>{o.checked&&(o.panel=t,e.push(o))})}),e};function Qe(e){w.value=e.target.checked}function je(e){D.value=e.target.checked}const Je=()=>{Oe({key:zt(),value:JSON.stringify(S().map(e=>({path:e.path})))})},Ke=wt(()=>S().length>0),Xe=()=>{L(ge,{files:S(),onDone:N})};b.value&&Dt(()=>_.value.length,()=>{if(_.value.length>0&&b.value){const t=_.value[_.value.length-1].items.find(o=>o.path===b.value);t&&(P.value=t,b.value="")}});function Ye(){var e,t,o,r;if(d){if(d==="sdcard")return`${s("sdcard")} (${s("storage_free_total",{free:k(((e=ne.value)==null?void 0:e.freeBytes)??0),total:k(((t=ne.value)==null?void 0:t.totalBytes)??0)})})`;if(d==="app")return s("app_name");if(d.startsWith("usb")){const Z=parseInt(d.substring(3)),f=Re.value[Z-1];return`${s("usb_storage")} ${Z} (${s("storage_free_total",{free:k((f==null?void 0:f.freeBytes)??0),total:k((f==null?void 0:f.totalBytes)??0)})})`}}return`${s("page_title.files")} (${s("storage_free_total",{free:k(((o=se.value)==null?void 0:o.freeBytes)??0),total:k(((r=se.value)==null?void 0:r.totalBytes)??0)})})`}function et(e,t){if(w.value){t.checked=!t.checked;return}ze(e,t)}function tt(e,t){U.value=t,e.close()}function ot(){W(E.value)}function st(e,t){t.isDir||(ye(t.name)?window.open(Ce(I.value,t.path),"_blank"):X(t.name)?A(D?e.items:e.items.filter(o=>!o.name.startsWith(".")),t):le(t.path))}function nt(e,t){e.preventDefault();const o=[{label:s("create_folder"),onClick:()=>{Me.value=t,L(we,{title:s("name"),placeholder:s("name"),mutation:xe,getVariables:Be})}},{label:s("upload_files"),onClick:()=>{ce(t)}},{label:s("upload_folder"),onClick:()=>{ue(t)}}];ae()&&o.push({label:s("paste"),onClick:()=>{G(t)}}),Te({x:e.x,y:e.y,items:o})}function lt(e,t,o){e.preventDefault();let r;o.isDir?r=[{label:s("upload_files"),onClick:()=>{ce(o.path)}},{label:s("upload_folder"),onClick:()=>{ue(o.path)}},{label:s("download"),onClick:()=>{Ue(o.path)}}]:(r=[],(ye(o.name)||X(o.name))&&r.push({label:s("open"),onClick:()=>{X(o.name)?A(t.items,o):window.open(Ce(I.value,o.path),"_blank")}}),r.push({label:s("download"),onClick:()=>{le(o.path)}})),r.push({label:s("duplicate"),onClick:()=>{O([o]),G(t.dir)}}),r.push({label:s("cut"),onClick:()=>{o.panel=t,ie([o])}}),r.push({label:s("copy"),onClick:()=>{O([o])}}),o.isDir&&ae()&&r.push({label:s("paste"),onClick:()=>{G(o.path)}}),r=[...r,{label:s("rename"),onClick:()=>{Ee.value=o.name,Pe.value=o.path,L(we,{title:s("rename"),placeholder:s("name"),value:o.name,mutation:He,getVariables:Le,done:Ze})}},{label:s("delete"),onClick:()=>{L(ge,{files:[o],onDone:N})}}],Te({x:e.x,y:e.y,items:r})}const _e=e=>{e.status==="done"&&setTimeout(()=>{W(e.dir),z()},1e3)},pe=e=>{N([e.item])};return $t(()=>{H.on("upload_task_done",_e),H.on("file_deleted",pe)}),It(()=>{H.off("upload_task_done",_e),H.off("file_deleted",pe)}),(e,t)=>{const o=Kt,r=co,Z=so,f=Nt,at=At,it=Jt,ct=jt,rt=Mt,ut=Ot,y=St("tooltip");return a(),c(v,null,[i("div",ro,[m(o,{current:Ye}),i("div",uo,[w.value&&Ke.value?(a(),c(v,{key:0},[C((a(),c("button",{class:"icon-button",onClick:t[0]||(t[0]=F(()=>n(O)(S()),["stop"]))},[_o,m(r)])),[[y,e.$t("copy")]]),C((a(),c("button",{class:"icon-button",onClick:t[1]||(t[1]=F(()=>n(ie)(S()),["stop"]))},[po,m(Z)])),[[y,e.$t("cut")]]),C((a(),c("button",{class:"icon-button",onClick:F(Xe,["stop"])},[ho,m(f)],8,mo)),[[y,e.$t("delete")]]),C((a(),c("button",{class:"icon-button",onClick:F(Je,["stop"])},[bo,m(at)],8,fo)),[[y,e.$t("download")]])],64)):h("",!0),i("div",vo,[i("label",ko,[i("md-checkbox",{"touch-target":"wrapper",onChange:Qe,checked:w.value},null,40,go),T(" "+p(e.$t("select_mode")),1)])]),i("div",yo,[i("label",Co,[i("md-checkbox",{"touch-target":"wrapper",onChange:je,checked:n(D)},null,40,To),T(p(e.$t("show_hidden")),1)])]),C((a(),c("button",{class:"icon-button btn-refresh",onClick:ot},[qo,m(it)])),[[y,e.$t("refresh")]]),m(rt,null,{content:M(u=>[i("div",$o,[(a(!0),c(v,null,J(n(Se),l=>(a(),c("md-menu-item",{onClick:Q=>tt(u,l.value),selected:l.value===n(U)},[i("div",So,p(e.$t(l.label)),1)],8,Io))),256))])]),default:M(()=>[C((a(),c("button",wo,[Do,m(ct)])),[[y,e.$t("sort")]])]),_:1})])]),m(n(Xt),{class:"panel-container"},{default:M(()=>[(a(!0),c(v,null,J(n(_),u=>(a(),K(n(qe),{key:u.dir},{default:M(()=>[i("div",Vo,[(a(!0),c(v,null,J(u.items,l=>{var Q;return a(),c(v,{key:l.path},[!l.name.startsWith(".")||n(D)?(a(),c("div",{key:0,class:Bt(["file-item",{active:(n(E)+"/").startsWith(l.path+"/")||((Q=n(P))==null?void 0:Q.path)===l.path}]),onClick:j=>et(u,l),onDblclick:F(j=>st(u,l),["prevent"]),onContextmenu:j=>lt(j,u,l)},[w.value?(a(),c("md-checkbox",{key:0,"touch-target":"wrapper",checked:l.checked},null,8,Mo)):h("",!0),l.isDir?(a(),K(ut,{key:1})):h("",!0),n(xt)(l.name)||n(Et)(l.name)?(a(),c("img",{key:2,src:n(Pt)(l.fileId)+"&w=50&h=50",width:"50",height:"50",onerror:"this.src='/broken-image.png'"},null,8,Bo)):h("",!0),i("div",xo,[T(p(l.name)+" ",1),i("div",Eo,[T(p(n(Zt)(l.updatedAt)),1),l.isDir?h("",!0):(a(),c(v,{key:0},[T(", "+p(n(k)(l.size)),1)],64))])])],42,Fo)):h("",!0)],64)}),128)),i("div",{class:"empty",onContextmenu:l=>nt(l,u.dir)},[u.items.filter(l=>!l.name.startsWith(".")||n(D)).length===0?(a(),c("div",Zo,p(e.$t("no_files")),1)):h("",!0)],40,Po)])]),_:2},1024))),128)),n(_).length===0?(a(),K(n(qe),{key:0,class:"no-data-placeholder"},{default:M(()=>[T(p(e.$t(n(Ht)(n(Fe),n($).permissions,"WRITE_EXTERNAL_STORAGE"))),1)]),_:1})):h("",!0)]),_:1}),n(P)?(a(),c("div",Ho,p(e.$t("path"))+": "+p(n(P).path),1)):h("",!0),i("input",{ref_key:"fileInput",ref:Ne,style:{display:"none"},type:"file",multiple:"",onChange:t[2]||(t[2]=(...u)=>n(re)&&n(re)(...u))},null,544),i("input",{ref_key:"dirFileInput",ref:Ae,style:{display:"none"},type:"file",multiple:"",webkitdirectory:"",mozdirectory:"",directory:"",onChange:t[3]||(t[3]=(...u)=>n(de)&&n(de)(...u))},null,544)],64)}}});const Go=Qt(Lo,[["__scopeId","data-v-6a8cd392"]]);export{Go as default};
+import{o as a,c,a as i,d as dt,u as _t,r as V,D as pt,M as mt,ag as ht,e as ft,s as ve,f as bt,bb as vt,bc as kt,bd as gt,be as yt,bf as Ct,bg as Tt,ae as ke,i as qt,aC as wt,w as Dt,O as $t,P as H,Q as It,R as St,p as m,F as v,m as C,l as F,k as h,h as T,t as p,j as n,H as M,al as Vt,bh as Ft,at as Mt,J,S as K,I as Bt,bi as xt,bj as Et,ax as Pt,Z as Zt,z as k,$ as Ht,A as Lt,B as Rt,aG as Ut,bk as Wt,bl as zt,a2 as L,bm as ge,bn as ye,ah as Ce,bo as X,aI as Te,ad as Nt,am as At,bp as Ot,bq as Gt,_ as Qt}from"./index-82e633ff.js";import{_ as jt}from"./sort-rounded-36348883.js";import{_ as Jt}from"./refresh-rounded-9b9be316.js";import{_ as Kt}from"./Breadcrumb-9ca58797.js";import{g as qe,M as Xt}from"./splitpanes.es-de3e6852.js";import{E as we}from"./EditValueModal-df390030.js";import"./vee-validate.esm-6643484a.js";const Yt={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},eo=i("path",{fill:"currentColor",d:"M19.6 21.6L12 14l-2.35 2.35q.2.375.275.8T10 18q0 1.65-1.175 2.825T6 22q-1.65 0-2.825-1.175T2 18q0-1.65 1.175-2.825T6 14q.425 0 .85.075t.8.275L10 12L7.65 9.65q-.375.2-.8.275T6 10q-1.65 0-2.825-1.175T2 6q0-1.65 1.175-2.825T6 2q1.65 0 2.825 1.175T10 6q0 .425-.075.85t-.275.8L21.6 19.6q.425.425.425 1t-.425 1q-.425.425-1 .425t-1-.425ZM15 11l-2-2l6.6-6.6q.425-.425 1-.425t1 .425q.425.425.425 1t-.425 1L15 11ZM6 8q.825 0 1.413-.588T8 6q0-.825-.588-1.413T6 4q-.825 0-1.413.588T4 6q0 .825.588 1.413T6 8Zm6 4.5q.225 0 .363-.138T12.5 12q0-.225-.138-.363T12 11.5q-.225 0-.363.138T11.5 12q0 .225.138.363T12 12.5ZM6 20q.825 0 1.413-.588T8 18q0-.825-.588-1.413T6 16q-.825 0-1.413.588T4 18q0 .825.588 1.413T6 20Z"},null,-1),to=[eo];function oo(g,s){return a(),c("svg",Yt,to)}const so={name:"material-symbols-content-cut-rounded",render:oo},no={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},lo=i("path",{fill:"currentColor",d:"M9 18q-.825 0-1.413-.588T7 16V4q0-.825.588-1.413T9 2h9q.825 0 1.413.588T20 4v12q0 .825-.588 1.413T18 18H9Zm0-2h9V4H9v12Zm-4 6q-.825 0-1.413-.588T3 20V7q0-.425.288-.713T4 6q.425 0 .713.288T5 7v13h10q.425 0 .713.288T16 21q0 .425-.288.713T15 22H5ZM9 4v12V4Z"},null,-1),ao=[lo];function io(g,s){return a(),c("svg",no,ao)}const co={name:"material-symbols-content-copy-outline-rounded",render:io},q=g=>(Lt("data-v-6a8cd392"),g=g(),Rt(),g),ro={class:"v-toolbar"},uo={class:"right-actions"},_o=q(()=>i("md-ripple",null,null,-1)),po=q(()=>i("md-ripple",null,null,-1)),mo=["onClick"],ho=q(()=>i("md-ripple",null,null,-1)),fo=["onClick"],bo=q(()=>i("md-ripple",null,null,-1)),vo={class:"form-check"},ko={class:"form-check-label"},go=["checked"],yo={class:"form-check"},Co={class:"form-check-label"},To=["checked"],qo=q(()=>i("md-ripple",null,null,-1)),wo={class:"icon-button btn-sort"},Do=q(()=>i("md-ripple",null,null,-1)),$o={class:"menu-items"},Io=["onClick","selected"],So={slot:"headline"},Vo={class:"file-items"},Fo=["onClick","onDblclick","onContextmenu"],Mo=["checked"],Bo=["src"],xo={class:"title"},Eo={style:{"font-size":"0.75rem"}},Po=["onContextmenu"],Zo={key:0,class:"no-files"},Ho={key:0,class:"file-item-info"},Lo=dt({__name:"FilesView",setup(g){var me,he,fe,be;const{t:s}=_t(),De=V([]),Y=pt(),$e=Y.query,d=Y.params.type,ee=V(mt(((me=$e.q)==null?void 0:me.toString())??"")),R=ht(ee.value),b=V(((he=R.find(e=>e.name==="path"))==null?void 0:he.value)??"");let B=((fe=R.find(e=>e.name==="dir"))==null?void 0:fe.value)??"";B||(((be=R.find(t=>t.name==="isDir"))==null?void 0:be.value)==="1"?B=b.value:B=b.value.substring(0,b.value.lastIndexOf("/")));const Ie=V(B),Se=Ut(),w=V(!1),te=ft(),{fileShowHidden:D,fileSortBy:U}=ve(te),oe=bt(),{app:$,urlTokenKey:I,selectedFiles:Ve}=ve(oe);let x=$.value.internalStoragePath;d&&(d==="sdcard"?x=$.value.sdcardPath:d.startsWith("usb")?x=$.value.usbDiskPaths[parseInt(d.substring(3))-1]:d==="app"&&(x=$.value.externalFilesDir));const{loading:Fe,panels:_,currentDir:E,refetch:W}=vt(I,x,Ie.value,U),{createPath:Me,createVariables:Be,createMutation:xe}=kt(I,_),{renameValue:Ee,renamePath:Pe,renameDone:Ze,renameMutation:He,renameVariables:Le}=gt(_),{internal:se,sdcard:ne,usb:Re,refetch:z}=yt(),{onDeleted:N}=Wt(_,E,z),{downloadFile:le,downloadDir:Ue,downloadFiles:We}=Vt(I),{view:A}=Gt(De,(e,t)=>{oe.lightbox={sources:e,index:t,visible:!0}}),{selectedItem:P,select:ze}=Ct(E,d,ee,te),{canPaste:ae,copy:O,cut:ie,paste:G}=Tt(Ve,W,z),{input:Ne,upload:ce,uploadChanged:re}=ke(),{input:Ae,upload:ue,uploadChanged:de}=ke(),{mutate:Oe,onDone:Ge}=qt({document:Ft,appApi:!0});Ge(e=>{We(e.data.setTempValue.key),_.value.forEach(t=>{t.items.forEach(o=>{o.checked=!1})})});const S=()=>{const e=[];return _.value.forEach(t=>{t.items.forEach(o=>{o.checked&&(o.panel=t,e.push(o))})}),e};function Qe(e){w.value=e.target.checked}function je(e){D.value=e.target.checked}const Je=()=>{Oe({key:zt(),value:JSON.stringify(S().map(e=>({path:e.path})))})},Ke=wt(()=>S().length>0),Xe=()=>{L(ge,{files:S(),onDone:N})};b.value&&Dt(()=>_.value.length,()=>{if(_.value.length>0&&b.value){const t=_.value[_.value.length-1].items.find(o=>o.path===b.value);t&&(P.value=t,b.value="")}});function Ye(){var e,t,o,r;if(d){if(d==="sdcard")return`${s("sdcard")} (${s("storage_free_total",{free:k(((e=ne.value)==null?void 0:e.freeBytes)??0),total:k(((t=ne.value)==null?void 0:t.totalBytes)??0)})})`;if(d==="app")return s("app_name");if(d.startsWith("usb")){const Z=parseInt(d.substring(3)),f=Re.value[Z-1];return`${s("usb_storage")} ${Z} (${s("storage_free_total",{free:k((f==null?void 0:f.freeBytes)??0),total:k((f==null?void 0:f.totalBytes)??0)})})`}}return`${s("page_title.files")} (${s("storage_free_total",{free:k(((o=se.value)==null?void 0:o.freeBytes)??0),total:k(((r=se.value)==null?void 0:r.totalBytes)??0)})})`}function et(e,t){if(w.value){t.checked=!t.checked;return}ze(e,t)}function tt(e,t){U.value=t,e.close()}function ot(){W(E.value)}function st(e,t){t.isDir||(ye(t.name)?window.open(Ce(I.value,t.path),"_blank"):X(t.name)?A(D?e.items:e.items.filter(o=>!o.name.startsWith(".")),t):le(t.path))}function nt(e,t){e.preventDefault();const o=[{label:s("create_folder"),onClick:()=>{Me.value=t,L(we,{title:s("name"),placeholder:s("name"),mutation:xe,getVariables:Be})}},{label:s("upload_files"),onClick:()=>{ce(t)}},{label:s("upload_folder"),onClick:()=>{ue(t)}}];ae()&&o.push({label:s("paste"),onClick:()=>{G(t)}}),Te({x:e.x,y:e.y,items:o})}function lt(e,t,o){e.preventDefault();let r;o.isDir?r=[{label:s("upload_files"),onClick:()=>{ce(o.path)}},{label:s("upload_folder"),onClick:()=>{ue(o.path)}},{label:s("download"),onClick:()=>{Ue(o.path)}}]:(r=[],(ye(o.name)||X(o.name))&&r.push({label:s("open"),onClick:()=>{X(o.name)?A(t.items,o):window.open(Ce(I.value,o.path),"_blank")}}),r.push({label:s("download"),onClick:()=>{le(o.path)}})),r.push({label:s("duplicate"),onClick:()=>{O([o]),G(t.dir)}}),r.push({label:s("cut"),onClick:()=>{o.panel=t,ie([o])}}),r.push({label:s("copy"),onClick:()=>{O([o])}}),o.isDir&&ae()&&r.push({label:s("paste"),onClick:()=>{G(o.path)}}),r=[...r,{label:s("rename"),onClick:()=>{Ee.value=o.name,Pe.value=o.path,L(we,{title:s("rename"),placeholder:s("name"),value:o.name,mutation:He,getVariables:Le,done:Ze})}},{label:s("delete"),onClick:()=>{L(ge,{files:[o],onDone:N})}}],Te({x:e.x,y:e.y,items:r})}const _e=e=>{e.status==="done"&&setTimeout(()=>{W(e.dir),z()},1e3)},pe=e=>{N([e.item])};return $t(()=>{H.on("upload_task_done",_e),H.on("file_deleted",pe)}),It(()=>{H.off("upload_task_done",_e),H.off("file_deleted",pe)}),(e,t)=>{const o=Kt,r=co,Z=so,f=Nt,at=At,it=Jt,ct=jt,rt=Mt,ut=Ot,y=St("tooltip");return a(),c(v,null,[i("div",ro,[m(o,{current:Ye}),i("div",uo,[w.value&&Ke.value?(a(),c(v,{key:0},[C((a(),c("button",{class:"icon-button",onClick:t[0]||(t[0]=F(()=>n(O)(S()),["stop"]))},[_o,m(r)])),[[y,e.$t("copy")]]),C((a(),c("button",{class:"icon-button",onClick:t[1]||(t[1]=F(()=>n(ie)(S()),["stop"]))},[po,m(Z)])),[[y,e.$t("cut")]]),C((a(),c("button",{class:"icon-button",onClick:F(Xe,["stop"])},[ho,m(f)],8,mo)),[[y,e.$t("delete")]]),C((a(),c("button",{class:"icon-button",onClick:F(Je,["stop"])},[bo,m(at)],8,fo)),[[y,e.$t("download")]])],64)):h("",!0),i("div",vo,[i("label",ko,[i("md-checkbox",{"touch-target":"wrapper",onChange:Qe,checked:w.value},null,40,go),T(" "+p(e.$t("select_mode")),1)])]),i("div",yo,[i("label",Co,[i("md-checkbox",{"touch-target":"wrapper",onChange:je,checked:n(D)},null,40,To),T(p(e.$t("show_hidden")),1)])]),C((a(),c("button",{class:"icon-button btn-refresh",onClick:ot},[qo,m(it)])),[[y,e.$t("refresh")]]),m(rt,null,{content:M(u=>[i("div",$o,[(a(!0),c(v,null,J(n(Se),l=>(a(),c("md-menu-item",{onClick:Q=>tt(u,l.value),selected:l.value===n(U)},[i("div",So,p(e.$t(l.label)),1)],8,Io))),256))])]),default:M(()=>[C((a(),c("button",wo,[Do,m(ct)])),[[y,e.$t("sort")]])]),_:1})])]),m(n(Xt),{class:"panel-container"},{default:M(()=>[(a(!0),c(v,null,J(n(_),u=>(a(),K(n(qe),{key:u.dir},{default:M(()=>[i("div",Vo,[(a(!0),c(v,null,J(u.items,l=>{var Q;return a(),c(v,{key:l.path},[!l.name.startsWith(".")||n(D)?(a(),c("div",{key:0,class:Bt(["file-item",{active:(n(E)+"/").startsWith(l.path+"/")||((Q=n(P))==null?void 0:Q.path)===l.path}]),onClick:j=>et(u,l),onDblclick:F(j=>st(u,l),["prevent"]),onContextmenu:j=>lt(j,u,l)},[w.value?(a(),c("md-checkbox",{key:0,"touch-target":"wrapper",checked:l.checked},null,8,Mo)):h("",!0),l.isDir?(a(),K(ut,{key:1})):h("",!0),n(xt)(l.name)||n(Et)(l.name)?(a(),c("img",{key:2,src:n(Pt)(l.fileId)+"&w=50&h=50",width:"50",height:"50",onerror:"this.src='/broken-image.png'"},null,8,Bo)):h("",!0),i("div",xo,[T(p(l.name)+" ",1),i("div",Eo,[T(p(n(Zt)(l.updatedAt)),1),l.isDir?h("",!0):(a(),c(v,{key:0},[T(", "+p(n(k)(l.size)),1)],64))])])],42,Fo)):h("",!0)],64)}),128)),i("div",{class:"empty",onContextmenu:l=>nt(l,u.dir)},[u.items.filter(l=>!l.name.startsWith(".")||n(D)).length===0?(a(),c("div",Zo,p(e.$t("no_files")),1)):h("",!0)],40,Po)])]),_:2},1024))),128)),n(_).length===0?(a(),K(n(qe),{key:0,class:"no-data-placeholder"},{default:M(()=>[T(p(e.$t(n(Ht)(n(Fe),n($).permissions,"WRITE_EXTERNAL_STORAGE"))),1)]),_:1})):h("",!0)]),_:1}),n(P)?(a(),c("div",Ho,p(e.$t("path"))+": "+p(n(P).path),1)):h("",!0),i("input",{ref_key:"fileInput",ref:Ne,style:{display:"none"},type:"file",multiple:"",onChange:t[2]||(t[2]=(...u)=>n(re)&&n(re)(...u))},null,544),i("input",{ref_key:"dirFileInput",ref:Ae,style:{display:"none"},type:"file",multiple:"",webkitdirectory:"",mozdirectory:"",directory:"",onChange:t[3]||(t[3]=(...u)=>n(de)&&n(de)(...u))},null,544)],64)}}});const Go=Qt(Lo,[["__scopeId","data-v-6a8cd392"]]);export{Go as default};
diff --git a/app/src/main/resources/web/assets/HomeView-69395bae.js b/app/src/main/resources/web/assets/HomeView-c755323f.js
similarity index 98%
rename from app/src/main/resources/web/assets/HomeView-69395bae.js
rename to app/src/main/resources/web/assets/HomeView-c755323f.js
index fa07727c..7cce51e7 100644
--- a/app/src/main/resources/web/assets/HomeView-69395bae.js
+++ b/app/src/main/resources/web/assets/HomeView-c755323f.js
@@ -1 +1 @@
-import{b as L,o as d,c,a as e,d as M,u as O,e as E,s as B,r as h,f as j,i as A,w as F,g as P,h as p,t as o,j as f,k as m,l,F as w,m as Q,v as Z,n as z,p as D,q as R,x as U,y as J,z as S,A as K,B as W,C as X,_ as Y}from"./index-a9bbc323.js";function x(i,_){for(var u,r=-1,g=i.length;++r(K("data-v-2b7c24f3"),i=i(),W(),i),ae={class:"page-container"},ie={class:"main"},re={class:"grid"},de={class:"g-col-lg-6 g-col-md-12"},ce={class:"card"},ue={class:"card-body"},ve={class:"card-title"},pe={key:0,class:"total-bytes"},fe={class:"stats-items"},me={class:"g-col-lg-6 g-col-md-12"},_e={class:"card"},he={class:"card-body"},ge={class:"card-title"},$e={class:"stats-items"},be={class:"g-col-lg-6 g-col-md-12"},ke={class:"card"},Ce={class:"card-body"},ye={class:"card-title"},Te={class:"stats-items"},qe={class:"g-col-lg-6 g-col-md-12"},we={class:"card"},Be={class:"card-body"},Se={class:"card-title"},Ve={class:"stats-items"},Ge={class:"g-col-lg-6 g-col-md-12"},He={class:"card"},Ne={class:"card-body"},Ie={class:"card-title"},Le={class:"form-row"},Me=["label","error","error-text"],Oe=["onClick"],Ee=le(()=>e("md-ripple",null,null,-1)),je=["onClick","disabled"],Ae=M({__name:"HomeView",setup(i){const{t:_}=O(),u=E(),{callNumber:r}=B(u),g=h(!1),{app:v}=B(j()),C=h(-1),y=h(-1),T=h(-1),$=h(-1),k=h(-1);function G(){navigator.clipboard.readText().then(t=>{r.value=t})}const{mutate:H,loading:N}=A({document:R,appApi:!0}),I=()=>{if(!r.value){g.value=!0;return}H({number:r.value})};F(r,()=>{g.value=!1}),P({handle:(t,s)=>{if(s)U(_(s),"error");else if(t){C.value=t.messageCount,y.value=t.contactCount,T.value=t.callCount,$.value=t.storageStats.internal.totalBytes,k.value=t.storageStats.internal.freeBytes;const b=t.storageStats.sdcard;b&&($.value+=b.totalBytes,k.value+=b.freeBytes);const n=t.storageStats.usb;n.length&&($.value+=V(n,q=>q.totalBytes),k.value+=V(n,q=>q.freeBytes))}},document:J,variables:null,appApi:!0});function a(t){X(u,t)}return(t,s)=>{const b=ne;return d(),c("div",ae,[e("div",ie,[e("div",re,[e("div",de,[e("section",ce,[e("div",ue,[e("h5",ve,[p(o(t.$t("storage")),1),$.value>=0?(d(),c("span",pe,o(t.$t("storage_free_total",{free:f(S)(k.value),total:f(S)($.value)})),1)):m("",!0)]),e("p",fe,[e("a",{href:"#",onClick:s[0]||(s[0]=l(n=>a("/images"),["prevent"]))},o(t.$t("images")),1),e("a",{href:"#",onClick:s[1]||(s[1]=l(n=>a("/audios"),["prevent"]))},o(t.$t("audios")),1),e("a",{href:"#",onClick:s[2]||(s[2]=l(n=>a("/videos"),["prevent"]))},o(t.$t("videos")),1),e("a",{href:"#",onClick:s[3]||(s[3]=l(n=>a("/files"),["prevent"]))},o(t.$t("files")),1),f(v).channel!=="GOOGLE"?(d(),c("a",{key:0,href:"#",onClick:s[4]||(s[4]=l(n=>a("/apps"),["prevent"]))},o(t.$t("apps")),1)):m("",!0)])])])]),e("div",me,[e("section",_e,[e("div",he,[e("h5",ge,o(t.$t("work")),1),e("p",$e,[e("a",{href:"#",onClick:s[5]||(s[5]=l(n=>a("/notes"),["prevent"]))},o(t.$t("page_title.notes")),1),e("a",{style:{display:"none"},href:"#",onClick:s[6]||(s[6]=l(n=>a("/books"),["prevent"]))},o(t.$t("page_title.books")),1),e("a",{href:"#",onClick:s[7]||(s[7]=l(n=>a("/feeds"),["prevent"]))},o(t.$t("page_title.feeds")),1)])])])]),e("div",be,[e("section",ke,[e("div",Ce,[e("h5",ye,o(t.$t("social")),1),e("p",Te,[f(v).channel!=="GOOGLE"?(d(),c("a",{key:0,href:"#",onClick:s[8]||(s[8]=l(n=>a("/messages"),["prevent"]))},[p(o(t.$t("messages")),1),C.value>=0?(d(),c(w,{key:0},[p("("+o(C.value)+")",1)],64)):m("",!0)])):m("",!0),f(v).channel!=="GOOGLE"?(d(),c("a",{key:1,href:"#",onClick:s[9]||(s[9]=l(n=>a("/calls"),["prevent"]))},[p(o(t.$t("calls")),1),T.value>=0?(d(),c(w,{key:0},[p("("+o(T.value)+")",1)],64)):m("",!0)])):m("",!0),e("a",{href:"#",onClick:s[10]||(s[10]=l(n=>a("/contacts"),["prevent"]))},[p(o(t.$t("contacts")),1),y.value>=0?(d(),c(w,{key:0},[p("("+o(y.value)+")",1)],64)):m("",!0)])])])])]),e("div",qe,[e("section",we,[e("div",Be,[e("h5",Se,o(t.$t("tools")),1),e("p",Ve,[e("a",{href:"#",onClick:s[11]||(s[11]=l(n=>a("/screen-mirror"),["prevent"]))},o(t.$t("screen_mirror")),1),e("a",{href:"#",onClick:s[12]||(s[12]=l(n=>a("/device-info"),["prevent"]))},o(t.$t("device_info")),1),e("a",{href:"#",onClick:s[13]||(s[13]=l(n=>a("/qrcode-generator"),["prevent"]))},o(t.$t("qrcode_generator")),1),e("a",{href:"#",onClick:s[14]||(s[14]=l(n=>a("/json-viewer"),["prevent"]))},o(t.$t("json_viewer")),1)])])])]),e("div",Ge,[e("section",He,[e("div",Ne,[e("h5",Ie,o(t.$t("call_phone")),1),e("p",Le,[Q(e("md-outlined-text-field",{type:"tel",label:t.$t("phone_number"),class:"form-control flex-3","onUpdate:modelValue":s[15]||(s[15]=n=>z(r)?r.value=n:null),error:g.value,"error-text":t.$t("valid.required")},[e("button",{class:"icon-button",slot:"trailing-icon",onClick:l(G,["prevent"])},[Ee,D(b)],8,Oe)],8,Me),[[Z,f(r)]]),e("md-filled-button",{class:"btn-lg",onClick:l(I,["prevent"]),disabled:f(N)},o(t.$t("call")),9,je)])])])])])])])}}});const Pe=Y(Ae,[["__scopeId","data-v-2b7c24f3"]]);export{Pe as default};
+import{b as L,o as d,c,a as e,d as M,u as O,e as E,s as B,r as h,f as j,i as A,w as F,g as P,h as p,t as o,j as f,k as m,l,F as w,m as Q,v as Z,n as z,p as D,q as R,x as U,y as J,z as S,A as K,B as W,C as X,_ as Y}from"./index-82e633ff.js";function x(i,_){for(var u,r=-1,g=i.length;++r(K("data-v-2b7c24f3"),i=i(),W(),i),ae={class:"page-container"},ie={class:"main"},re={class:"grid"},de={class:"g-col-lg-6 g-col-md-12"},ce={class:"card"},ue={class:"card-body"},ve={class:"card-title"},pe={key:0,class:"total-bytes"},fe={class:"stats-items"},me={class:"g-col-lg-6 g-col-md-12"},_e={class:"card"},he={class:"card-body"},ge={class:"card-title"},$e={class:"stats-items"},be={class:"g-col-lg-6 g-col-md-12"},ke={class:"card"},Ce={class:"card-body"},ye={class:"card-title"},Te={class:"stats-items"},qe={class:"g-col-lg-6 g-col-md-12"},we={class:"card"},Be={class:"card-body"},Se={class:"card-title"},Ve={class:"stats-items"},Ge={class:"g-col-lg-6 g-col-md-12"},He={class:"card"},Ne={class:"card-body"},Ie={class:"card-title"},Le={class:"form-row"},Me=["label","error","error-text"],Oe=["onClick"],Ee=le(()=>e("md-ripple",null,null,-1)),je=["onClick","disabled"],Ae=M({__name:"HomeView",setup(i){const{t:_}=O(),u=E(),{callNumber:r}=B(u),g=h(!1),{app:v}=B(j()),C=h(-1),y=h(-1),T=h(-1),$=h(-1),k=h(-1);function G(){navigator.clipboard.readText().then(t=>{r.value=t})}const{mutate:H,loading:N}=A({document:R,appApi:!0}),I=()=>{if(!r.value){g.value=!0;return}H({number:r.value})};F(r,()=>{g.value=!1}),P({handle:(t,s)=>{if(s)U(_(s),"error");else if(t){C.value=t.messageCount,y.value=t.contactCount,T.value=t.callCount,$.value=t.storageStats.internal.totalBytes,k.value=t.storageStats.internal.freeBytes;const b=t.storageStats.sdcard;b&&($.value+=b.totalBytes,k.value+=b.freeBytes);const n=t.storageStats.usb;n.length&&($.value+=V(n,q=>q.totalBytes),k.value+=V(n,q=>q.freeBytes))}},document:J,variables:null,appApi:!0});function a(t){X(u,t)}return(t,s)=>{const b=ne;return d(),c("div",ae,[e("div",ie,[e("div",re,[e("div",de,[e("section",ce,[e("div",ue,[e("h5",ve,[p(o(t.$t("storage")),1),$.value>=0?(d(),c("span",pe,o(t.$t("storage_free_total",{free:f(S)(k.value),total:f(S)($.value)})),1)):m("",!0)]),e("p",fe,[e("a",{href:"#",onClick:s[0]||(s[0]=l(n=>a("/images"),["prevent"]))},o(t.$t("images")),1),e("a",{href:"#",onClick:s[1]||(s[1]=l(n=>a("/audios"),["prevent"]))},o(t.$t("audios")),1),e("a",{href:"#",onClick:s[2]||(s[2]=l(n=>a("/videos"),["prevent"]))},o(t.$t("videos")),1),e("a",{href:"#",onClick:s[3]||(s[3]=l(n=>a("/files"),["prevent"]))},o(t.$t("files")),1),f(v).channel!=="GOOGLE"?(d(),c("a",{key:0,href:"#",onClick:s[4]||(s[4]=l(n=>a("/apps"),["prevent"]))},o(t.$t("apps")),1)):m("",!0)])])])]),e("div",me,[e("section",_e,[e("div",he,[e("h5",ge,o(t.$t("work")),1),e("p",$e,[e("a",{href:"#",onClick:s[5]||(s[5]=l(n=>a("/notes"),["prevent"]))},o(t.$t("page_title.notes")),1),e("a",{style:{display:"none"},href:"#",onClick:s[6]||(s[6]=l(n=>a("/books"),["prevent"]))},o(t.$t("page_title.books")),1),e("a",{href:"#",onClick:s[7]||(s[7]=l(n=>a("/feeds"),["prevent"]))},o(t.$t("page_title.feeds")),1)])])])]),e("div",be,[e("section",ke,[e("div",Ce,[e("h5",ye,o(t.$t("social")),1),e("p",Te,[f(v).channel!=="GOOGLE"?(d(),c("a",{key:0,href:"#",onClick:s[8]||(s[8]=l(n=>a("/messages"),["prevent"]))},[p(o(t.$t("messages")),1),C.value>=0?(d(),c(w,{key:0},[p("("+o(C.value)+")",1)],64)):m("",!0)])):m("",!0),f(v).channel!=="GOOGLE"?(d(),c("a",{key:1,href:"#",onClick:s[9]||(s[9]=l(n=>a("/calls"),["prevent"]))},[p(o(t.$t("calls")),1),T.value>=0?(d(),c(w,{key:0},[p("("+o(T.value)+")",1)],64)):m("",!0)])):m("",!0),e("a",{href:"#",onClick:s[10]||(s[10]=l(n=>a("/contacts"),["prevent"]))},[p(o(t.$t("contacts")),1),y.value>=0?(d(),c(w,{key:0},[p("("+o(y.value)+")",1)],64)):m("",!0)])])])])]),e("div",qe,[e("section",we,[e("div",Be,[e("h5",Se,o(t.$t("tools")),1),e("p",Ve,[e("a",{href:"#",onClick:s[11]||(s[11]=l(n=>a("/screen-mirror"),["prevent"]))},o(t.$t("screen_mirror")),1),e("a",{href:"#",onClick:s[12]||(s[12]=l(n=>a("/device-info"),["prevent"]))},o(t.$t("device_info")),1),e("a",{href:"#",onClick:s[13]||(s[13]=l(n=>a("/qrcode-generator"),["prevent"]))},o(t.$t("qrcode_generator")),1),e("a",{href:"#",onClick:s[14]||(s[14]=l(n=>a("/json-viewer"),["prevent"]))},o(t.$t("json_viewer")),1)])])])]),e("div",Ge,[e("section",He,[e("div",Ne,[e("h5",Ie,o(t.$t("call_phone")),1),e("p",Le,[Q(e("md-outlined-text-field",{type:"tel",label:t.$t("phone_number"),class:"form-control flex-3","onUpdate:modelValue":s[15]||(s[15]=n=>z(r)?r.value=n:null),error:g.value,"error-text":t.$t("valid.required")},[e("button",{class:"icon-button",slot:"trailing-icon",onClick:l(G,["prevent"])},[Ee,D(b)],8,Oe)],8,Me),[[Z,f(r)]]),e("md-filled-button",{class:"btn-lg",onClick:l(I,["prevent"]),disabled:f(N)},o(t.$t("call")),9,je)])])])])])])])}}});const Pe=Y(Ae,[["__scopeId","data-v-2b7c24f3"]]);export{Pe as default};
diff --git a/app/src/main/resources/web/assets/ImagesRootView-3ee5fa33.js b/app/src/main/resources/web/assets/ImagesRootView-34228c59.js
similarity index 70%
rename from app/src/main/resources/web/assets/ImagesRootView-3ee5fa33.js
rename to app/src/main/resources/web/assets/ImagesRootView-34228c59.js
index 4fe279e0..869acb10 100644
--- a/app/src/main/resources/web/assets/ImagesRootView-3ee5fa33.js
+++ b/app/src/main/resources/web/assets/ImagesRootView-34228c59.js
@@ -1 +1 @@
-import{_ as g}from"./TagFilter.vuevuetypescriptsetuptruelang-d0de30fc.js";import{_ as k}from"./BucketFilter.vuevuetypescriptsetuptruelang-96d8b135.js";import{d as C,D as w,e as y,az as I,G as M,c as z,p as s,H as o,j as e,o as B,a,t as m,l as $,I as b,C as E}from"./index-a9bbc323.js";import{g as d,M as G}from"./splitpanes.es-37578c0b.js";import"./EditValueModal-8c79ab9c.js";import"./vee-validate.esm-d674d968.js";const N={class:"page-container"},S={class:"sidebar"},V={class:"nav-title"},A={class:"nav"},D=["onClick"],R={class:"main"},F=C({__name:"ImagesRootView",setup(j){var r,_;const n=w(),u=y(),i=I(n.query),c=((r=i.find(t=>t.name==="tag"))==null?void 0:r.value)??"",l=((_=i.find(t=>t.name==="bucket_id"))==null?void 0:_.value)??"";function p(){E(u,"/images")}return(t,q)=>{const f=k,h=g,v=M("router-view");return B(),z("div",N,[s(e(G),null,{default:o(()=>[s(e(d),{size:"20","min-size":"10"},{default:o(()=>[a("div",S,[a("h2",V,m(t.$t("page_title.images")),1),a("ul",A,[a("li",{onClick:$(p,["prevent"]),class:b({active:e(n).path==="/images"&&!e(c)&&!e(l)})},m(t.$t("all")),11,D),s(f,{type:"IMAGE",selected:e(l)},null,8,["selected"])]),s(h,{type:"IMAGE",selected:e(c)},null,8,["selected"])])]),_:1}),s(e(d),null,{default:o(()=>[a("div",R,[s(v)])]),_:1})]),_:1})])}}});export{F as default};
+import{_ as g}from"./TagFilter.vuevuetypescriptsetuptruelang-10776836.js";import{_ as k}from"./BucketFilter.vuevuetypescriptsetuptruelang-eff38890.js";import{d as C,D as w,e as y,az as I,G as M,c as z,p as s,H as o,j as e,o as B,a,t as m,l as $,I as b,C as E}from"./index-82e633ff.js";import{g as d,M as G}from"./splitpanes.es-de3e6852.js";import"./EditValueModal-df390030.js";import"./vee-validate.esm-6643484a.js";const N={class:"page-container"},S={class:"sidebar"},V={class:"nav-title"},A={class:"nav"},D=["onClick"],R={class:"main"},F=C({__name:"ImagesRootView",setup(j){var r,_;const n=w(),u=y(),i=I(n.query),c=((r=i.find(t=>t.name==="tag"))==null?void 0:r.value)??"",l=((_=i.find(t=>t.name==="bucket_id"))==null?void 0:_.value)??"";function p(){E(u,"/images")}return(t,q)=>{const f=k,h=g,v=M("router-view");return B(),z("div",N,[s(e(G),null,{default:o(()=>[s(e(d),{size:"20","min-size":"10"},{default:o(()=>[a("div",S,[a("h2",V,m(t.$t("page_title.images")),1),a("ul",A,[a("li",{onClick:$(p,["prevent"]),class:b({active:e(n).path==="/images"&&!e(c)&&!e(l)})},m(t.$t("all")),11,D),s(f,{type:"IMAGE",selected:e(l)},null,8,["selected"])]),s(h,{type:"IMAGE",selected:e(c)},null,8,["selected"])])]),_:1}),s(e(d),null,{default:o(()=>[a("div",R,[s(v)])]),_:1})]),_:1})])}}});export{F as default};
diff --git a/app/src/main/resources/web/assets/ImagesView-00687075.css b/app/src/main/resources/web/assets/ImagesView-00687075.css
new file mode 100644
index 00000000..20c49541
--- /dev/null
+++ b/app/src/main/resources/web/assets/ImagesView-00687075.css
@@ -0,0 +1 @@
+.image-container .item[data-v-959116fa]{width:calc(20% - 4px);margin:2px}
diff --git a/app/src/main/resources/web/assets/ImagesView-06eddf35.css b/app/src/main/resources/web/assets/ImagesView-06eddf35.css
deleted file mode 100644
index 91e055c8..00000000
--- a/app/src/main/resources/web/assets/ImagesView-06eddf35.css
+++ /dev/null
@@ -1 +0,0 @@
-.image-container .item[data-v-b477a944]{width:calc(16.66% - 4px);margin:2px}
diff --git a/app/src/main/resources/web/assets/ImagesView-c0beee6a.js b/app/src/main/resources/web/assets/ImagesView-4d60f7c1.js
similarity index 76%
rename from app/src/main/resources/web/assets/ImagesView-c0beee6a.js
rename to app/src/main/resources/web/assets/ImagesView-4d60f7c1.js
index 1b1df1c3..6e9e2ae5 100644
--- a/app/src/main/resources/web/assets/ImagesView-c0beee6a.js
+++ b/app/src/main/resources/web/assets/ImagesView-4d60f7c1.js
@@ -1 +1 @@
-import{u as Qe,_ as Ge,a as Ke,b as Oe}from"./list-be40ed35.js";import{d as We,aA as Pe,e as Xe,s as pe,r as D,u as je,f as Je,K as Ye,L as Ze,D as et,M as tt,aB as st,af as ot,aC as nt,N as lt,w as at,O as it,P as b,Q as dt,R as ct,c as a,a as s,p as i,j as e,F as $,m,l as _,k as v,H as G,S as K,h as ut,t as r,J as N,T as _t,U as rt,x as pt,aD as mt,aE as ht,C as me,W as he,at as gt,o as l,v as vt,ax as O,z as ge,I as ft,aF as q,$ as ve,A as kt,B as bt,al as yt,aG as Ct,a2 as wt,a3 as $t,a0 as Tt,a1 as It,as as Vt,aH as St,aI as Dt,ad as At,am as Rt,a4 as zt,a5 as Et,a6 as Bt,_ as Ft}from"./index-a9bbc323.js";import{_ as Mt,a as Ut}from"./grid-view-outline-rounded-9ff0f134.js";import{_ as Nt}from"./sort-rounded-a0681bba.js";import{_ as qt}from"./upload-rounded-8f3d4361.js";import{_ as xt}from"./Breadcrumb-7b5128ab.js";import{u as Ht,a as Lt}from"./tags-7e5964e8.js";import"./vee-validate.esm-d674d968.js";const p=R=>(kt("data-v-b477a944"),R=R(),bt(),R),Qt={class:"v-toolbar"},Gt=p(()=>s("md-ripple",null,null,-1)),Kt=p(()=>s("md-ripple",null,null,-1)),Ot=p(()=>s("md-ripple",null,null,-1)),Wt=["onClick"],Pt=p(()=>s("md-ripple",null,null,-1)),Xt={class:"icon-button btn-sort"},jt=p(()=>s("md-ripple",null,null,-1)),Jt={class:"menu-items"},Yt=["onClick","selected"],Zt={slot:"headline"},es=["onClick"],ts=p(()=>s("md-ripple",null,null,-1)),ss={class:"filters"},os=["label"],ns={class:"form-label"},ls=["label","selected","onClick"],as={class:"buttons"},is=["onClick"],ds={key:0},cs={class:"form-check-label"},us=["checked","indeterminate"],_s={key:1,class:"image-container",style:{"margin-bottom":"24px"}},rs={class:"item"},ps=["checked","onClick"],ms=["src","onClick","onContextmenu"],hs={class:"duration"},gs={key:2,class:"table-responsive"},vs={class:"table"},fs=["checked","indeterminate"],ks=p(()=>s("th",null,"ID",-1)),bs=p(()=>s("th",null,null,-1)),ys=p(()=>s("th",null,null,-1)),Cs=["onClick"],ws=["checked"],$s=["src","onClick"],Ts={class:"nowrap"},Is={class:"action-btns"},Vs=["onClick"],Ss=p(()=>s("md-ripple",null,null,-1)),Ds=["onClick"],As=p(()=>s("md-ripple",null,null,-1)),Rs=["onClick"],zs=p(()=>s("md-ripple",null,null,-1)),Es={class:"nowrap"},Bs={key:0},Fs={colspan:"7"},Ms={class:"no-data-placeholder"},Us={key:3,class:"no-data-placeholder"},A=48,Ns=We({__name:"ImagesView",setup(R){var ce,ue;const fe=Pe(),d=Xe(),{imageSortBy:x}=pe(d),h=D([]),W=D(),{t:T}=je(),P=Je(),{app:X,urlTokenKey:H}=pe(P),f=Ye({text:"",tags:[]}),u=Ze.IMAGE,j=et().query,I=D(parseInt(((ce=j.page)==null?void 0:ce.toString())??"1")),y=D(tt(((ue=j.q)==null?void 0:ue.toString())??"")),V=D(""),{tags:z}=Ht(u,y,f,async t=>{V.value=_t(t),await rt(),Ie()}),{addToTags:ke}=Lt(u,h,z),{deleteItems:be,deleteItem:J}=st(),{allChecked:E,realAllChecked:B,selectRealAll:ye,allCheckedAlertVisible:Ce,clearSelection:F,toggleAllChecked:M,toggleItemChecked:U,toggleRow:Y,total:C,checked:L}=Qe(h),{downloadItems:we}=ot(H,u,h,F,"images.zip"),{downloadFile:Z}=yt(H),$e=Ct(),ee=nt(()=>h.value.map(t=>({src:O(t.fileId),name:q(t.path),duration:0,size:t.size,path:t.path,type:u,data:t})));function te(t){P.lightbox={sources:ee.value,index:t,visible:!0}}function se(t){wt($t,{type:u,tags:z.value,item:{key:t.id,title:t.title,size:t.size},selected:z.value.filter(n=>t.tags.some(w=>w.id===n.id))})}function Te(t,n){x.value=n,t.close()}const{loading:oe,load:Ie,refetch:Q}=lt({handle:async(t,n)=>{if(n)pt(T(n),"error");else if(t){const w=[];for(const S of t.images)w.push({...S,checked:!1,fileId:mt(H.value,S.path)});h.value=w,C.value=t.imageCount}},document:ht,variables:()=>({offset:(I.value-1)*A,limit:A,query:V.value,sortBy:x.value}),appApi:!0});function Ve(){me(d,`/images?page=${I.value}&q=${he(y.value)}`)}at(I,()=>{Ve()});function Se(t){f.tags.includes(t)?Tt(f.tags,n=>n.id===t.id):f.tags.push(t)}function De(){y.value=It(f),ne(),W.value.dismiss()}function ne(){me(d,`/images?q=${he(y.value)}`)}function Ae(){d.imageViewType==="grid"?d.imageViewType="list":d.imageViewType="grid"}function Re(){fe.push("/files"),Vt(St,{message:T("upload_images")})}function ze(t,n){t.preventDefault(),Dt({x:t.x,y:t.y,items:[{label:T("add_to_tags"),onClick:()=>{se(n)}},{label:T("download"),onClick:()=>{Z(n.path,q(n.path).replace(" ","-"))}},{label:T("delete"),onClick:()=>{J(u,n)}}]})}const le=t=>{t.type===u&&(F(),Q())},ae=t=>{t.type===u&&Q()},ie=t=>{t.type===u&&(F(),Q())},de=()=>{C.value--};return it(()=>{b.on("item_tags_updated",ae),b.on("items_tags_updated",le),b.on("media_item_deleted",de),b.on("media_items_deleted",ie)}),dt(()=>{b.off("item_tags_updated",ae),b.off("items_tags_updated",le),b.off("media_item_deleted",de),b.off("media_items_deleted",ie)}),(t,n)=>{const w=xt,S=At,_e=Rt,re=zt,Ee=qt,Be=Nt,Fe=gt,Me=Mt,Ue=Ut,Ne=Ge,qe=Ke,xe=Et,He=Bt,Le=Oe,g=ct("tooltip");return l(),a($,null,[s("div",Qt,[i(w,{current:()=>`${t.$t("page_title.images")} (${e(C)})`},null,8,["current"]),e(L)?(l(),a($,{key:0},[m((l(),a("button",{class:"icon-button",onClick:n[0]||(n[0]=_(o=>e(be)(e(u),h.value,e(B),V.value),["stop"]))},[Gt,i(S)])),[[g,t.$t("delete")]]),m((l(),a("button",{class:"icon-button",onClick:n[1]||(n[1]=_(o=>e(we)(e(B),V.value),["stop"]))},[Kt,i(_e)])),[[g,t.$t("download")]]),m((l(),a("button",{class:"icon-button",onClick:n[2]||(n[2]=_(o=>e(ke)(e(B),V.value),["stop"]))},[Ot,i(re)])),[[g,t.$t("add_to_tags")]])],64)):v("",!0),m((l(),a("button",{class:"icon-button",onClick:_(Re,["prevent"])},[Pt,i(Ee)],8,Wt)),[[g,t.$t("upload")]]),i(Fe,null,{content:G(o=>[s("div",Jt,[(l(!0),a($,null,N(e($e),k=>(l(),a("md-menu-item",{onClick:c=>Te(o,k.value),selected:k.value===e(x)},[s("div",Zt,r(t.$t(k.label)),1)],8,Yt))),256))])]),default:G(()=>[m((l(),a("button",Xt,[jt,i(Be)])),[[g,t.$t("sort")]])]),_:1}),m((l(),a("button",{class:"icon-button",onClick:_(Ae,["stop"])},[ts,e(d).imageViewType==="list"?(l(),K(Me,{key:0})):v("",!0),e(d).imageViewType==="grid"?(l(),K(Ue,{key:1})):v("",!0)],8,es)),[[g,t.$t(e(d).imageViewType==="list"?"view_as_grid":"view_as_list")]]),i(Ne,{ref_key:"searchInputRef",ref:W,modelValue:y.value,"onUpdate:modelValue":n[4]||(n[4]=o=>y.value=o),search:ne},{filters:G(()=>[s("div",ss,[m(s("md-outlined-text-field",{label:t.$t("keywords"),"onUpdate:modelValue":n[3]||(n[3]=o=>f.text=o),"keyup.enter":"applyAndDoSearch"},null,8,os),[[vt,f.text]]),s("label",ns,r(t.$t("tags")),1),s("md-chip-set",null,[(l(!0),a($,null,N(e(z),o=>(l(),a("md-filter-chip",{key:o.id,label:o.name,selected:f.tags.includes(o),onClick:k=>Se(o)},null,8,ls))),128))]),s("div",as,[s("md-filled-button",{onClick:_(De,["stop"])},r(t.$t("search")),9,is)])])]),_:1},8,["modelValue"])]),i(qe,{limit:A,total:e(C),"all-checked-alert-visible":e(Ce),"real-all-checked":e(B),"select-real-all":e(ye),"clear-selection":e(F)},null,8,["total","all-checked-alert-visible","real-all-checked","select-real-all","clear-selection"]),e(d).imageViewType==="grid"?(l(),a("div",ds,[s("label",cs,[s("md-checkbox",{"touch-target":"wrapper",onChange:n[5]||(n[5]=(...o)=>e(M)&&e(M)(...o)),checked:e(E),indeterminate:!e(E)&&e(L)},null,40,us),ut(r(t.$t("select_all")),1)])])):v("",!0),e(d).imageViewType==="grid"?(l(),a("div",_s,[(l(!0),a($,null,N(h.value,(o,k)=>(l(),a("div",rs,[s("md-checkbox",{class:"checkbox","touch-target":"wrapper",onChange:n[6]||(n[6]=(...c)=>e(U)&&e(U)(...c)),checked:o.checked,onClick:_(c=>e(Y)(o),["stop"])},null,40,ps),s("img",{class:"image",src:e(O)(o.fileId)+"&w=300&h=300",onClick:c=>te(k),onContextmenu:c=>ze(c,o)},null,40,ms),s("span",hs,r(e(ge)(o.size)),1)]))),256))])):v("",!0),e(d).imageViewType==="list"?(l(),a("div",gs,[s("table",vs,[s("thead",null,[s("tr",null,[s("th",null,[s("md-checkbox",{"touch-target":"wrapper",onChange:n[7]||(n[7]=(...o)=>e(M)&&e(M)(...o)),checked:e(E),indeterminate:!e(E)&&e(L)},null,40,fs)]),ks,bs,s("th",null,r(t.$t("name")),1),ys,s("th",null,r(t.$t("tags")),1),s("th",null,r(t.$t("file_size")),1)])]),s("tbody",null,[(l(!0),a($,null,N(h.value,(o,k)=>(l(),a("tr",{key:o.id,class:ft({selected:o.checked}),onClick:_(c=>e(Y)(o),["stop"])},[s("td",null,[s("md-checkbox",{"touch-target":"wrapper",onChange:n[8]||(n[8]=(...c)=>e(U)&&e(U)(...c)),checked:o.checked},null,40,ws)]),s("td",null,[i(xe,{id:o.id,raw:o},null,8,["id","raw"])]),s("td",null,[s("img",{src:e(O)(o.fileId)+"&w=300&h=300",width:"50",height:"50",onClick:_(c=>te(k),["stop"]),style:{cursor:"pointer"}},null,8,$s)]),s("td",null,r(e(q)(o.path)),1),s("td",Ts,[s("div",Is,[m((l(),a("button",{class:"icon-button",onClick:_(c=>e(J)(e(u),o),["stop"])},[Ss,i(S)],8,Vs)),[[g,t.$t("delete")]]),m((l(),a("button",{class:"icon-button",onClick:_(c=>e(Z)(o.path,e(q)(o.path).replace(" ","-")),["stop"])},[As,i(_e)],8,Ds)),[[g,t.$t("download")]]),m((l(),a("button",{class:"icon-button",onClick:_(c=>se(o),["stop"])},[zs,i(re)],8,Rs)),[[g,t.$t("add_to_tags")]])])]),s("td",null,[i(He,{tags:o.tags,type:e(u)},null,8,["tags","type"])]),s("td",Es,r(e(ge)(o.size)),1)],10,Cs))),128))]),h.value.length?v("",!0):(l(),a("tfoot",Bs,[s("tr",null,[s("td",Fs,[s("div",Ms,r(t.$t(e(ve)(e(oe),e(X).permissions,"WRITE_EXTERNAL_STORAGE"))),1)])])]))])])):v("",!0),e(d).imageViewType==="grid"&&ee.value.length===0?(l(),a("div",Us,r(t.$t(e(ve)(e(oe),e(X).permissions,"WRITE_EXTERNAL_STORAGE"))),1)):v("",!0),e(C)>A?(l(),K(Le,{key:4,modelValue:I.value,"onUpdate:modelValue":n[9]||(n[9]=o=>I.value=o),total:e(C),limit:A},null,8,["modelValue","total"])):v("",!0)],64)}}});const Ps=Ft(Ns,[["__scopeId","data-v-b477a944"]]);export{Ps as default};
+import{u as Qe,_ as Ge,a as Ke,b as Oe}from"./list-0feac61c.js";import{d as We,aA as Pe,e as Xe,s as pe,r as D,u as je,f as Je,K as Ye,L as Ze,D as et,M as tt,aB as st,af as ot,aC as nt,N as lt,w as at,O as it,P as b,Q as dt,R as ct,c as a,a as s,p as i,j as e,F as $,m,l as _,k as f,H as G,S as K,h as ut,t as r,J as N,T as _t,U as rt,x as pt,aD as mt,aE as ht,C as me,W as he,at as gt,o as l,v as ft,ax as O,z as ge,I as vt,aF as q,$ as fe,A as kt,B as bt,al as yt,aG as Ct,a2 as wt,a3 as $t,a0 as Tt,a1 as It,as as Vt,aH as St,aI as Dt,ad as At,am as Rt,a4 as zt,a5 as Et,a6 as Bt,_ as Ft}from"./index-82e633ff.js";import{_ as Mt,a as Ut}from"./grid-view-outline-rounded-464302fc.js";import{_ as Nt}from"./sort-rounded-36348883.js";import{_ as qt}from"./upload-rounded-b7b0e642.js";import{_ as xt}from"./Breadcrumb-9ca58797.js";import{u as Ht,a as Lt}from"./tags-dce7ef69.js";import"./vee-validate.esm-6643484a.js";const p=R=>(kt("data-v-959116fa"),R=R(),bt(),R),Qt={class:"v-toolbar"},Gt=p(()=>s("md-ripple",null,null,-1)),Kt=p(()=>s("md-ripple",null,null,-1)),Ot=p(()=>s("md-ripple",null,null,-1)),Wt=["onClick"],Pt=p(()=>s("md-ripple",null,null,-1)),Xt={class:"icon-button btn-sort"},jt=p(()=>s("md-ripple",null,null,-1)),Jt={class:"menu-items"},Yt=["onClick","selected"],Zt={slot:"headline"},es=["onClick"],ts=p(()=>s("md-ripple",null,null,-1)),ss={class:"filters"},os=["label"],ns={class:"form-label"},ls=["label","selected","onClick"],as={class:"buttons"},is=["onClick"],ds={key:0},cs={class:"form-check-label"},us=["checked","indeterminate"],_s={key:1,class:"image-container",style:{"margin-bottom":"24px"}},rs={class:"item"},ps=["checked","onClick"],ms=["src","onClick","onContextmenu"],hs={class:"duration"},gs={key:2,class:"table-responsive"},fs={class:"table"},vs=["checked","indeterminate"],ks=p(()=>s("th",null,"ID",-1)),bs=p(()=>s("th",null,null,-1)),ys=p(()=>s("th",null,null,-1)),Cs=["onClick"],ws=["checked"],$s=["src","onClick"],Ts={class:"nowrap"},Is={class:"action-btns"},Vs=["onClick"],Ss=p(()=>s("md-ripple",null,null,-1)),Ds=["onClick"],As=p(()=>s("md-ripple",null,null,-1)),Rs=["onClick"],zs=p(()=>s("md-ripple",null,null,-1)),Es={class:"nowrap"},Bs={key:0},Fs={colspan:"7"},Ms={class:"no-data-placeholder"},Us={key:3,class:"no-data-placeholder"},A=50,Ns=We({__name:"ImagesView",setup(R){var ce,ue;const ve=Pe(),d=Xe(),{imageSortBy:x}=pe(d),h=D([]),W=D(),{t:T}=je(),P=Je(),{app:X,urlTokenKey:H}=pe(P),v=Ye({text:"",tags:[]}),u=Ze.IMAGE,j=et().query,I=D(parseInt(((ce=j.page)==null?void 0:ce.toString())??"1")),y=D(tt(((ue=j.q)==null?void 0:ue.toString())??"")),V=D(""),{tags:z}=Ht(u,y,v,async t=>{V.value=_t(t),await rt(),Ie()}),{addToTags:ke}=Lt(u,h,z),{deleteItems:be,deleteItem:J}=st(),{allChecked:E,realAllChecked:B,selectRealAll:ye,allCheckedAlertVisible:Ce,clearSelection:F,toggleAllChecked:M,toggleItemChecked:U,toggleRow:Y,total:C,checked:L}=Qe(h),{downloadItems:we}=ot(H,u,h,F,"images.zip"),{downloadFile:Z}=yt(H),$e=Ct(),ee=nt(()=>h.value.map(t=>({src:O(t.fileId),name:q(t.path),duration:0,size:t.size,path:t.path,type:u,data:t})));function te(t){P.lightbox={sources:ee.value,index:t,visible:!0}}function se(t){wt($t,{type:u,tags:z.value,item:{key:t.id,title:t.title,size:t.size},selected:z.value.filter(n=>t.tags.some(w=>w.id===n.id))})}function Te(t,n){x.value=n,t.close()}const{loading:oe,load:Ie,refetch:Q}=lt({handle:async(t,n)=>{if(n)pt(T(n),"error");else if(t){const w=[];for(const S of t.images)w.push({...S,checked:!1,fileId:mt(H.value,S.path)});h.value=w,C.value=t.imageCount}},document:ht,variables:()=>({offset:(I.value-1)*A,limit:A,query:V.value,sortBy:x.value}),appApi:!0});function Ve(){me(d,`/images?page=${I.value}&q=${he(y.value)}`)}at(I,()=>{Ve()});function Se(t){v.tags.includes(t)?Tt(v.tags,n=>n.id===t.id):v.tags.push(t)}function De(){y.value=It(v),ne(),W.value.dismiss()}function ne(){me(d,`/images?q=${he(y.value)}`)}function Ae(){d.imageViewType==="grid"?d.imageViewType="list":d.imageViewType="grid"}function Re(){ve.push("/files"),Vt(St,{message:T("upload_images")})}function ze(t,n){t.preventDefault(),Dt({x:t.x,y:t.y,items:[{label:T("add_to_tags"),onClick:()=>{se(n)}},{label:T("download"),onClick:()=>{Z(n.path,q(n.path).replace(" ","-"))}},{label:T("delete"),onClick:()=>{J(u,n)}}]})}const le=t=>{t.type===u&&(F(),Q())},ae=t=>{t.type===u&&Q()},ie=t=>{t.type===u&&(F(),Q())},de=()=>{C.value--};return it(()=>{b.on("item_tags_updated",ae),b.on("items_tags_updated",le),b.on("media_item_deleted",de),b.on("media_items_deleted",ie)}),dt(()=>{b.off("item_tags_updated",ae),b.off("items_tags_updated",le),b.off("media_item_deleted",de),b.off("media_items_deleted",ie)}),(t,n)=>{const w=xt,S=At,_e=Rt,re=zt,Ee=qt,Be=Nt,Fe=gt,Me=Mt,Ue=Ut,Ne=Ge,qe=Ke,xe=Et,He=Bt,Le=Oe,g=ct("tooltip");return l(),a($,null,[s("div",Qt,[i(w,{current:()=>`${t.$t("page_title.images")} (${e(C)})`},null,8,["current"]),e(L)?(l(),a($,{key:0},[m((l(),a("button",{class:"icon-button",onClick:n[0]||(n[0]=_(o=>e(be)(e(u),h.value,e(B),V.value),["stop"]))},[Gt,i(S)])),[[g,t.$t("delete")]]),m((l(),a("button",{class:"icon-button",onClick:n[1]||(n[1]=_(o=>e(we)(e(B),V.value),["stop"]))},[Kt,i(_e)])),[[g,t.$t("download")]]),m((l(),a("button",{class:"icon-button",onClick:n[2]||(n[2]=_(o=>e(ke)(e(B),V.value),["stop"]))},[Ot,i(re)])),[[g,t.$t("add_to_tags")]])],64)):f("",!0),m((l(),a("button",{class:"icon-button",onClick:_(Re,["prevent"])},[Pt,i(Ee)],8,Wt)),[[g,t.$t("upload")]]),i(Fe,null,{content:G(o=>[s("div",Jt,[(l(!0),a($,null,N(e($e),k=>(l(),a("md-menu-item",{onClick:c=>Te(o,k.value),selected:k.value===e(x)},[s("div",Zt,r(t.$t(k.label)),1)],8,Yt))),256))])]),default:G(()=>[m((l(),a("button",Xt,[jt,i(Be)])),[[g,t.$t("sort")]])]),_:1}),m((l(),a("button",{class:"icon-button",onClick:_(Ae,["stop"])},[ts,e(d).imageViewType==="list"?(l(),K(Me,{key:0})):f("",!0),e(d).imageViewType==="grid"?(l(),K(Ue,{key:1})):f("",!0)],8,es)),[[g,t.$t(e(d).imageViewType==="list"?"view_as_grid":"view_as_list")]]),i(Ne,{ref_key:"searchInputRef",ref:W,modelValue:y.value,"onUpdate:modelValue":n[4]||(n[4]=o=>y.value=o),search:ne},{filters:G(()=>[s("div",ss,[m(s("md-outlined-text-field",{label:t.$t("keywords"),"onUpdate:modelValue":n[3]||(n[3]=o=>v.text=o),"keyup.enter":"applyAndDoSearch"},null,8,os),[[ft,v.text]]),s("label",ns,r(t.$t("tags")),1),s("md-chip-set",null,[(l(!0),a($,null,N(e(z),o=>(l(),a("md-filter-chip",{key:o.id,label:o.name,selected:v.tags.includes(o),onClick:k=>Se(o)},null,8,ls))),128))]),s("div",as,[s("md-filled-button",{onClick:_(De,["stop"])},r(t.$t("search")),9,is)])])]),_:1},8,["modelValue"])]),i(qe,{limit:A,total:e(C),"all-checked-alert-visible":e(Ce),"real-all-checked":e(B),"select-real-all":e(ye),"clear-selection":e(F)},null,8,["total","all-checked-alert-visible","real-all-checked","select-real-all","clear-selection"]),e(d).imageViewType==="grid"?(l(),a("div",ds,[s("label",cs,[s("md-checkbox",{"touch-target":"wrapper",onChange:n[5]||(n[5]=(...o)=>e(M)&&e(M)(...o)),checked:e(E),indeterminate:!e(E)&&e(L)},null,40,us),ut(r(t.$t("select_all")),1)])])):f("",!0),e(d).imageViewType==="grid"?(l(),a("div",_s,[(l(!0),a($,null,N(h.value,(o,k)=>(l(),a("div",rs,[s("md-checkbox",{class:"checkbox","touch-target":"wrapper",onChange:n[6]||(n[6]=(...c)=>e(U)&&e(U)(...c)),checked:o.checked,onClick:_(c=>e(Y)(o),["stop"])},null,40,ps),s("img",{class:"image",src:e(O)(o.fileId)+"&w=300&h=300",onClick:c=>te(k),onContextmenu:c=>ze(c,o)},null,40,ms),s("span",hs,r(e(ge)(o.size)),1)]))),256))])):f("",!0),e(d).imageViewType==="list"?(l(),a("div",gs,[s("table",fs,[s("thead",null,[s("tr",null,[s("th",null,[s("md-checkbox",{"touch-target":"wrapper",onChange:n[7]||(n[7]=(...o)=>e(M)&&e(M)(...o)),checked:e(E),indeterminate:!e(E)&&e(L)},null,40,vs)]),ks,bs,s("th",null,r(t.$t("name")),1),ys,s("th",null,r(t.$t("tags")),1),s("th",null,r(t.$t("file_size")),1)])]),s("tbody",null,[(l(!0),a($,null,N(h.value,(o,k)=>(l(),a("tr",{key:o.id,class:vt({selected:o.checked}),onClick:_(c=>e(Y)(o),["stop"])},[s("td",null,[s("md-checkbox",{"touch-target":"wrapper",onChange:n[8]||(n[8]=(...c)=>e(U)&&e(U)(...c)),checked:o.checked},null,40,ws)]),s("td",null,[i(xe,{id:o.id,raw:o},null,8,["id","raw"])]),s("td",null,[s("img",{src:e(O)(o.fileId)+"&w=300&h=300",width:"50",height:"50",onClick:_(c=>te(k),["stop"]),style:{cursor:"pointer"}},null,8,$s)]),s("td",null,r(e(q)(o.path)),1),s("td",Ts,[s("div",Is,[m((l(),a("button",{class:"icon-button",onClick:_(c=>e(J)(e(u),o),["stop"])},[Ss,i(S)],8,Vs)),[[g,t.$t("delete")]]),m((l(),a("button",{class:"icon-button",onClick:_(c=>e(Z)(o.path,e(q)(o.path).replace(" ","-")),["stop"])},[As,i(_e)],8,Ds)),[[g,t.$t("download")]]),m((l(),a("button",{class:"icon-button",onClick:_(c=>se(o),["stop"])},[zs,i(re)],8,Rs)),[[g,t.$t("add_to_tags")]])])]),s("td",null,[i(He,{tags:o.tags,type:e(u)},null,8,["tags","type"])]),s("td",Es,r(e(ge)(o.size)),1)],10,Cs))),128))]),h.value.length?f("",!0):(l(),a("tfoot",Bs,[s("tr",null,[s("td",Fs,[s("div",Ms,r(t.$t(e(fe)(e(oe),e(X).permissions,"WRITE_EXTERNAL_STORAGE"))),1)])])]))])])):f("",!0),e(d).imageViewType==="grid"&&ee.value.length===0?(l(),a("div",Us,r(t.$t(e(fe)(e(oe),e(X).permissions,"WRITE_EXTERNAL_STORAGE"))),1)):f("",!0),e(C)>A?(l(),K(Le,{key:4,modelValue:I.value,"onUpdate:modelValue":n[9]||(n[9]=o=>I.value=o),total:e(C),limit:A},null,8,["modelValue","total"])):f("",!0)],64)}}});const Ps=Ft(Ns,[["__scopeId","data-v-959116fa"]]);export{Ps as default};
diff --git a/app/src/main/resources/web/assets/JsonViewerView-c8bf23f4.js b/app/src/main/resources/web/assets/JsonViewerView-2319b11e.js
similarity index 96%
rename from app/src/main/resources/web/assets/JsonViewerView-c8bf23f4.js
rename to app/src/main/resources/web/assets/JsonViewerView-2319b11e.js
index 3cd8b495..b837633d 100644
--- a/app/src/main/resources/web/assets/JsonViewerView-c8bf23f4.js
+++ b/app/src/main/resources/web/assets/JsonViewerView-2319b11e.js
@@ -1 +1 @@
-import{bs as n,d as b,r as d,O as T,P as _,Q as S,o as f,c as k,a as l,p as r,I as E,s as w,e as D,w as C,l as j,t as x,H as v,j as p,n as R,S as H,k as O,_ as A}from"./index-a9bbc323.js";import{_ as B}from"./MonacoEditor.vuevuetypescriptsetuptruelang-be395bf3.js";import{_ as J}from"./Breadcrumb-7b5128ab.js";import{g as y,M as q}from"./splitpanes.es-37578c0b.js";const z=/^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/,I={name:"JsonString",props:{jsonValue:{type:String,required:!0}},data(){return{expand:!0,canExtend:!1}},mounted(){this.$refs.itemRef.offsetHeight>this.$refs.holderRef.offsetHeight&&(this.canExtend=!0)},methods:{toggle(){this.expand=!this.expand}},render(){let e=this.jsonValue;const t=z.test(e);let s;return this.expand?(s={class:{"jv-item":!0,"jv-string":!0},ref:"itemRef"},t?(e=`${e}`,s.innerHTML=`"${e.toString()}"`):s.innerText=`"${e.toString()}"`):s={class:{"jv-ellipsis":!0},onClick:this.toggle,innerText:"..."},n("span",{},[this.canExtend&&n("span",{class:{"jv-toggle":!0,open:this.expand},onClick:this.toggle}),n("span",{class:{"jv-holder-node":!0},ref:"holderRef"}),n("span",s)])}},M={props:{jsonValue:{type:Object,default:null}},setup(e){return()=>n("span",{class:{"jv-item":!0,"jv-undefined":!0},innerText:e.jsonValue===null?"null":"undefined"})}},L={props:{jsonValue:{type:Number,required:!0}},setup(e){const t=Number.isInteger(e.jsonValue);return()=>n("span",{class:{"jv-item":!0,"jv-number":!0,"jv-number-integer":t,"jv-number-float":!t},innerText:e.jsonValue.toString()})}},P={props:{jsonValue:Boolean},setup(e){return()=>n("span",{class:{"jv-item":!0,"jv-boolean":!0},innerText:e.jsonValue.toString()})}},Z={name:"JsonObject",props:{jsonValue:{type:Object,required:!0},expandDepth:{type:Number,default:1},keyName:{type:String,default:""},depth:{type:Number,default:0},expand:Boolean},data(){return{value:{}}},computed:{ordered(){const e={};return Object.keys(this.value).sort().forEach(t=>{e[t]=this.value[t]}),e}},watch:{jsonValue(e){this.setValue(e)}},mounted(){this.setValue(this.jsonValue)},methods:{setValue(e){setTimeout(()=>{this.value=e},0)},toggle(){this.$emit("update:expand",!this.expand),this.dispatchEvent()},dispatchEvent(){try{this.$el.dispatchEvent(new Event("resized"))}catch{}}},render(){const e=[];this.keyName||e.push(n("span",{class:{"jv-toggle":!0,open:!!this.expand},onClick:this.toggle})),e.push(n("span",{class:{"jv-item":!0,"jv-object":!0},innerText:"{"}));const t=Object.keys(this.value).length;if(t>0&&e.push(n("span",{class:{"jv-ellipsis":!0},onClick:this.toggle,innerText:t===1?"1 prop":`${t} props`})),this.expand){for(const s in this.ordered)if(this.ordered.hasOwnProperty(s)){const a=this.ordered[s];e.push(n(m,{key:s,style:{display:this.expand?void 0:"none"},keyName:s,expandDepth:this.expandDepth,depth:this.depth+1,value:a}))}}return e.push(n("span",{class:{"jv-item":!0,"jv-object":!0},innerText:"}"})),n("span",e)}},F={name:"JsonArray",props:{jsonValue:{type:Array,required:!0},expandDepth:{type:Number,default:1},keyName:{type:String,default:""},depth:{type:Number,default:0},expand:Boolean},data(){return{value:[]}},watch:{jsonValue(e){this.setValue(e)}},mounted(){this.setValue(this.jsonValue)},methods:{setValue(e,t=0){t===0&&(this.value=[]),setTimeout(()=>{e.length>t&&(this.value.push(e[t]),this.setValue(e,t+1))},0)},toggle(){this.$emit("update:expand",!this.expand);try{this.$el.dispatchEvent(new Event("resized"))}catch{}}},render(){const e=[];this.keyName||e.push(n("span",{class:{"jv-toggle":!0,open:!!this.expand},onClick:this.toggle})),e.push(n("span",{class:{"jv-item":!0,"jv-array":!0},innerText:"["}));const t=this.value.length;return t>0&&e.push(n("span",{class:{"jv-ellipsis":!0},onClick:this.toggle,innerText:t==1?"1 item":`${t} items`})),this.expand&&this.value.forEach((s,a)=>{e.push(n(m,{key:a,style:{display:this.expand?void 0:"none"},expandDepth:this.expandDepth,depth:this.depth+1,value:s}))}),e.push(n("span",{class:{"jv-item":!0,"jv-array":!0},innerText:"]"})),n("span",e)}},K={props:{jsonValue:{type:Function,required:!0}},setup(e){return()=>n("span",{class:{"jv-item":!0,"jv-function":!0},attrs:{title:e.jsonValue.toString()},innerHTML:"<function>"})}},U={props:{jsonValue:{type:Date,required:!0}},setup(e){const t=e.jsonValue;return()=>n("span",{class:{"jv-item":!0,"jv-string":!0},innerText:`"${t.toLocaleString()}"`})}},G=/^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/,Q={name:"JsonString",props:{jsonValue:{type:RegExp,required:!0}},data(){return{expand:!0,canExtend:!1}},mounted(){this.$refs.itemRef.offsetHeight>this.$refs.holderRef.offsetHeight&&(this.canExtend=!0)},methods:{toggle(){this.expand=!this.expand}},render(){let e=this.jsonValue;const t=G.test(e);let s;return this.expand?(s={class:{"jv-item":!0,"jv-string":!0},ref:"itemRef"},t?(e=`${e}`,s.innerHTML=`${e.toString()}`):s.innerText=`${e.toString()}`):s={class:{"jv-ellipsis":!0},onClick:this.toggle,innerText:"..."},n("span",{},[this.canExtend&&n("span",{class:{"jv-toggle":!0,open:this.expand},onClick:this.toggle}),n("span",{class:{"jv-holder-node":!0},ref:"holderRef"}),n("span",s)])}};const m={name:"JsonBox",props:{value:{type:[Object,Array,String,Number,Boolean,Function,Date],default:null},expandDepth:{type:Number,default:1},keyName:{type:String,default:""},depth:{type:Number,default:0}},data(){return{expand:!0}},mounted(){this.expand=!(this.depth>=this.expandDepth)},methods:{toggle(){this.expand=!this.expand;try{this.$el.dispatchEvent(new Event("resized"))}catch{}}},render(){let e;this.value===null||this.value===void 0?e=M:Array.isArray(this.value)?e=F:Object.prototype.toString.call(this.value)==="[object Date]"?e=U:typeof this.value=="object"?e=Z:typeof this.value=="number"?e=L:typeof this.value=="string"?e=I:typeof this.value=="boolean"?e=P:typeof this.value=="function"&&(e=K),this.value&&this.value.constructor===RegExp&&(e=Q);let t=!1;if(this.keyName&&this.value){if(Array.isArray(this.value)&&this.value.length)t=!0;else if(typeof this.value=="object"){const a=Object.prototype.toString.call(this.value);!["[]","[object Date]"].includes(a)&&Object.keys(this.value).length&&(t=!0)}}const s=[];return t&&s.push(n("span",{class:{"jv-toggle":!0,open:this.expand},onClick:this.toggle})),this.keyName&&s.push(n("span",{class:{"jv-key":!0},onClick:()=>{console.log(this.keyName)},innerText:`${this.keyName}:`})),s.push(n(e,{class:{"jv-push":!0},jsonValue:this.value,keyName:this.keyName,depth:this.depth,expand:this.expand,expandDepth:this.expandDepth,"onUpdate:expand":a=>{this.expand=a}})),n("div",{class:{"jv-node":!0,"jv-key-node":!!this.keyName&&!t,toggle:t}},s)}},W={class:"jv-code"},X=b({__name:"json-viewer",props:{value:{type:[Object,Array,String,Number,Boolean,Function],required:!0},expandDepth:{type:Number,default:1}},setup(e){const t=d("light"),s=()=>{t.value=document.documentElement.classList[0]==="dark"?"dark":"light"};return T(()=>{_.on("color_mode_changed",s)}),S(()=>{_.off("color_mode_changed",s)}),(a,h)=>{const u=m;return f(),k("div",{class:E(["jv-container",t.value])},[l("div",W,[r(u,{value:e.value,"expand-depth":e.expandDepth},null,8,["value","expand-depth"])])],2)}}});const Y={class:"page-container"},ee={class:"main"},te={class:"v-toolbar"},se=b({__name:"JsonViewerView",setup(e){const{json:t}=w(D()),s=d(null),a=d(1),h=d(1),u=()=>{try{const o=JSON.parse(t.value);s.value=o}catch(o){console.error(o)}};C(t,u),u();function g(o){o?a.value=1e3:a.value=1,h.value++}return(o,i)=>{const V=J,$=B,N=X;return f(),k("div",Y,[l("div",ee,[l("div",te,[r(V,{current:()=>o.$t("json_viewer")},null,8,["current"]),l("md-outlined-button",{onClick:i[0]||(i[0]=j(c=>g(!0),["prevent"]))},x(o.$t("expand_all")),1),l("md-outlined-button",{onClick:i[1]||(i[1]=j(c=>g(!1),["prevent"]))},x(o.$t("collapse_all")),1)]),r(p(q),{class:"panel-container"},{default:v(()=>[r(p(y),null,{default:v(()=>[r($,{language:"json",modelValue:p(t),"onUpdate:modelValue":i[2]||(i[2]=c=>R(t)?t.value=c:null)},null,8,["modelValue"])]),_:1}),r(p(y),null,{default:v(()=>[s.value?(f(),H(N,{value:s.value,"expand-depth":a.value,key:h.value},null,8,["value","expand-depth"])):O("",!0)]),_:1})]),_:1})])])}}});const re=A(se,[["__scopeId","data-v-862c219a"]]);export{re as default};
+import{bs as n,d as b,r as d,O as T,P as _,Q as S,o as f,c as k,a as l,p as r,I as E,s as w,e as D,w as C,l as j,t as x,H as v,j as p,n as R,S as H,k as O,_ as A}from"./index-82e633ff.js";import{_ as B}from"./MonacoEditor.vuevuetypescriptsetuptruelang-86bf597d.js";import{_ as J}from"./Breadcrumb-9ca58797.js";import{g as y,M as q}from"./splitpanes.es-de3e6852.js";const z=/^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/,I={name:"JsonString",props:{jsonValue:{type:String,required:!0}},data(){return{expand:!0,canExtend:!1}},mounted(){this.$refs.itemRef.offsetHeight>this.$refs.holderRef.offsetHeight&&(this.canExtend=!0)},methods:{toggle(){this.expand=!this.expand}},render(){let e=this.jsonValue;const t=z.test(e);let s;return this.expand?(s={class:{"jv-item":!0,"jv-string":!0},ref:"itemRef"},t?(e=`${e}`,s.innerHTML=`"${e.toString()}"`):s.innerText=`"${e.toString()}"`):s={class:{"jv-ellipsis":!0},onClick:this.toggle,innerText:"..."},n("span",{},[this.canExtend&&n("span",{class:{"jv-toggle":!0,open:this.expand},onClick:this.toggle}),n("span",{class:{"jv-holder-node":!0},ref:"holderRef"}),n("span",s)])}},M={props:{jsonValue:{type:Object,default:null}},setup(e){return()=>n("span",{class:{"jv-item":!0,"jv-undefined":!0},innerText:e.jsonValue===null?"null":"undefined"})}},L={props:{jsonValue:{type:Number,required:!0}},setup(e){const t=Number.isInteger(e.jsonValue);return()=>n("span",{class:{"jv-item":!0,"jv-number":!0,"jv-number-integer":t,"jv-number-float":!t},innerText:e.jsonValue.toString()})}},P={props:{jsonValue:Boolean},setup(e){return()=>n("span",{class:{"jv-item":!0,"jv-boolean":!0},innerText:e.jsonValue.toString()})}},Z={name:"JsonObject",props:{jsonValue:{type:Object,required:!0},expandDepth:{type:Number,default:1},keyName:{type:String,default:""},depth:{type:Number,default:0},expand:Boolean},data(){return{value:{}}},computed:{ordered(){const e={};return Object.keys(this.value).sort().forEach(t=>{e[t]=this.value[t]}),e}},watch:{jsonValue(e){this.setValue(e)}},mounted(){this.setValue(this.jsonValue)},methods:{setValue(e){setTimeout(()=>{this.value=e},0)},toggle(){this.$emit("update:expand",!this.expand),this.dispatchEvent()},dispatchEvent(){try{this.$el.dispatchEvent(new Event("resized"))}catch{}}},render(){const e=[];this.keyName||e.push(n("span",{class:{"jv-toggle":!0,open:!!this.expand},onClick:this.toggle})),e.push(n("span",{class:{"jv-item":!0,"jv-object":!0},innerText:"{"}));const t=Object.keys(this.value).length;if(t>0&&e.push(n("span",{class:{"jv-ellipsis":!0},onClick:this.toggle,innerText:t===1?"1 prop":`${t} props`})),this.expand){for(const s in this.ordered)if(this.ordered.hasOwnProperty(s)){const a=this.ordered[s];e.push(n(m,{key:s,style:{display:this.expand?void 0:"none"},keyName:s,expandDepth:this.expandDepth,depth:this.depth+1,value:a}))}}return e.push(n("span",{class:{"jv-item":!0,"jv-object":!0},innerText:"}"})),n("span",e)}},F={name:"JsonArray",props:{jsonValue:{type:Array,required:!0},expandDepth:{type:Number,default:1},keyName:{type:String,default:""},depth:{type:Number,default:0},expand:Boolean},data(){return{value:[]}},watch:{jsonValue(e){this.setValue(e)}},mounted(){this.setValue(this.jsonValue)},methods:{setValue(e,t=0){t===0&&(this.value=[]),setTimeout(()=>{e.length>t&&(this.value.push(e[t]),this.setValue(e,t+1))},0)},toggle(){this.$emit("update:expand",!this.expand);try{this.$el.dispatchEvent(new Event("resized"))}catch{}}},render(){const e=[];this.keyName||e.push(n("span",{class:{"jv-toggle":!0,open:!!this.expand},onClick:this.toggle})),e.push(n("span",{class:{"jv-item":!0,"jv-array":!0},innerText:"["}));const t=this.value.length;return t>0&&e.push(n("span",{class:{"jv-ellipsis":!0},onClick:this.toggle,innerText:t==1?"1 item":`${t} items`})),this.expand&&this.value.forEach((s,a)=>{e.push(n(m,{key:a,style:{display:this.expand?void 0:"none"},expandDepth:this.expandDepth,depth:this.depth+1,value:s}))}),e.push(n("span",{class:{"jv-item":!0,"jv-array":!0},innerText:"]"})),n("span",e)}},K={props:{jsonValue:{type:Function,required:!0}},setup(e){return()=>n("span",{class:{"jv-item":!0,"jv-function":!0},attrs:{title:e.jsonValue.toString()},innerHTML:"<function>"})}},U={props:{jsonValue:{type:Date,required:!0}},setup(e){const t=e.jsonValue;return()=>n("span",{class:{"jv-item":!0,"jv-string":!0},innerText:`"${t.toLocaleString()}"`})}},G=/^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/,Q={name:"JsonString",props:{jsonValue:{type:RegExp,required:!0}},data(){return{expand:!0,canExtend:!1}},mounted(){this.$refs.itemRef.offsetHeight>this.$refs.holderRef.offsetHeight&&(this.canExtend=!0)},methods:{toggle(){this.expand=!this.expand}},render(){let e=this.jsonValue;const t=G.test(e);let s;return this.expand?(s={class:{"jv-item":!0,"jv-string":!0},ref:"itemRef"},t?(e=`${e}`,s.innerHTML=`${e.toString()}`):s.innerText=`${e.toString()}`):s={class:{"jv-ellipsis":!0},onClick:this.toggle,innerText:"..."},n("span",{},[this.canExtend&&n("span",{class:{"jv-toggle":!0,open:this.expand},onClick:this.toggle}),n("span",{class:{"jv-holder-node":!0},ref:"holderRef"}),n("span",s)])}};const m={name:"JsonBox",props:{value:{type:[Object,Array,String,Number,Boolean,Function,Date],default:null},expandDepth:{type:Number,default:1},keyName:{type:String,default:""},depth:{type:Number,default:0}},data(){return{expand:!0}},mounted(){this.expand=!(this.depth>=this.expandDepth)},methods:{toggle(){this.expand=!this.expand;try{this.$el.dispatchEvent(new Event("resized"))}catch{}}},render(){let e;this.value===null||this.value===void 0?e=M:Array.isArray(this.value)?e=F:Object.prototype.toString.call(this.value)==="[object Date]"?e=U:typeof this.value=="object"?e=Z:typeof this.value=="number"?e=L:typeof this.value=="string"?e=I:typeof this.value=="boolean"?e=P:typeof this.value=="function"&&(e=K),this.value&&this.value.constructor===RegExp&&(e=Q);let t=!1;if(this.keyName&&this.value){if(Array.isArray(this.value)&&this.value.length)t=!0;else if(typeof this.value=="object"){const a=Object.prototype.toString.call(this.value);!["[]","[object Date]"].includes(a)&&Object.keys(this.value).length&&(t=!0)}}const s=[];return t&&s.push(n("span",{class:{"jv-toggle":!0,open:this.expand},onClick:this.toggle})),this.keyName&&s.push(n("span",{class:{"jv-key":!0},onClick:()=>{console.log(this.keyName)},innerText:`${this.keyName}:`})),s.push(n(e,{class:{"jv-push":!0},jsonValue:this.value,keyName:this.keyName,depth:this.depth,expand:this.expand,expandDepth:this.expandDepth,"onUpdate:expand":a=>{this.expand=a}})),n("div",{class:{"jv-node":!0,"jv-key-node":!!this.keyName&&!t,toggle:t}},s)}},W={class:"jv-code"},X=b({__name:"json-viewer",props:{value:{type:[Object,Array,String,Number,Boolean,Function],required:!0},expandDepth:{type:Number,default:1}},setup(e){const t=d("light"),s=()=>{t.value=document.documentElement.classList[0]==="dark"?"dark":"light"};return T(()=>{_.on("color_mode_changed",s)}),S(()=>{_.off("color_mode_changed",s)}),(a,h)=>{const u=m;return f(),k("div",{class:E(["jv-container",t.value])},[l("div",W,[r(u,{value:e.value,"expand-depth":e.expandDepth},null,8,["value","expand-depth"])])],2)}}});const Y={class:"page-container"},ee={class:"main"},te={class:"v-toolbar"},se=b({__name:"JsonViewerView",setup(e){const{json:t}=w(D()),s=d(null),a=d(1),h=d(1),u=()=>{try{const o=JSON.parse(t.value);s.value=o}catch(o){console.error(o)}};C(t,u),u();function g(o){o?a.value=1e3:a.value=1,h.value++}return(o,i)=>{const V=J,$=B,N=X;return f(),k("div",Y,[l("div",ee,[l("div",te,[r(V,{current:()=>o.$t("json_viewer")},null,8,["current"]),l("md-outlined-button",{onClick:i[0]||(i[0]=j(c=>g(!0),["prevent"]))},x(o.$t("expand_all")),1),l("md-outlined-button",{onClick:i[1]||(i[1]=j(c=>g(!1),["prevent"]))},x(o.$t("collapse_all")),1)]),r(p(q),{class:"panel-container"},{default:v(()=>[r(p(y),null,{default:v(()=>[r($,{language:"json",modelValue:p(t),"onUpdate:modelValue":i[2]||(i[2]=c=>R(t)?t.value=c:null)},null,8,["modelValue"])]),_:1}),r(p(y),null,{default:v(()=>[s.value?(f(),H(N,{value:s.value,"expand-depth":a.value,key:h.value},null,8,["value","expand-depth"])):O("",!0)]),_:1})]),_:1})])])}}});const re=A(se,[["__scopeId","data-v-862c219a"]]);export{re as default};
diff --git a/app/src/main/resources/web/assets/LoginView-dd88aaba.js b/app/src/main/resources/web/assets/LoginView-457162c8.js
similarity index 98%
rename from app/src/main/resources/web/assets/LoginView-dd88aaba.js
rename to app/src/main/resources/web/assets/LoginView-457162c8.js
index bd37acf6..26796cff 100644
--- a/app/src/main/resources/web/assets/LoginView-dd88aaba.js
+++ b/app/src/main/resources/web/assets/LoginView-457162c8.js
@@ -1 +1 @@
-import{d as G,r as h,u as Z,an as Q,co as X,cp as Y,cq as ee,cr as se,cs as ne,ct as te,cu as oe,aZ as re,cv as M,c as A,a as v,p as N,t as g,m as E,aW as x,l as ie,j as c,n as ae,ap as le,v as ue,k as P,F as ce,cw as de,o as T,cx as me,cy as we,_ as fe}from"./index-a9bbc323.js";import{u as ve,a as be}from"./vee-validate.esm-d674d968.js";function W(n){let t=n;if(typeof t>"u"){if(typeof navigator>"u"||!navigator)return"";t=navigator.userAgent||""}return t.toLowerCase()}function L(n,t){try{return new RegExp(n,"g").exec(t)}catch{return null}}function D(){if(typeof navigator>"u"||!navigator||!navigator.userAgentData)return!1;const t=navigator.userAgentData.brands;return!!(t&&t.length)}function pe(n,t){const o=L(`(${n})((?:\\/|\\s|:)([0-9|\\.|_]+))`,t);return o?o[3]:""}function $(n){return n.replace(/_/g,".")}function V(n,t){let o=null,e="-1";return n.some(r=>{const a=L(`(${r.test})((?:\\/|\\s|:)([0-9|\\.|_]+))?`,t);return!a||r.brand?!1:(o=r,e=a[3]||"-1",r.versionAlias?e=r.versionAlias:r.versionTest&&(e=pe(r.versionTest.toLowerCase(),t)||e),e=$(e),!0)}),{preset:o,version:e}}function _(n,t){const o={brand:"",version:"-1"};return n.some(e=>{const r=F(t,e);return r?(o.brand=e.id,o.version=e.versionAlias||r.version,o.version!=="-1"):!1}),o}function F(n,t){return n.find(o=>L(`${t.test}`,o.brand.toLowerCase()))}const I=[{test:"phantomjs",id:"phantomjs"},{test:"whale",id:"whale"},{test:"edgios|edge|edg",id:"edge"},{test:"msie|trident|windows phone",id:"ie",versionTest:"iemobile|msie|rv"},{test:"miuibrowser",id:"miui browser"},{test:"samsungbrowser",id:"samsung internet"},{test:"samsung",id:"samsung internet",versionTest:"version"},{test:"chrome|crios",id:"chrome"},{test:"firefox|fxios",id:"firefox"},{test:"android",id:"android browser",versionTest:"version"},{test:"safari|iphone|ipad|ipod",id:"safari",versionTest:"version"}],O=[{test:"(?=.*applewebkit/(53[0-7]|5[0-2]|[0-4]))(?=.*\\schrome)",id:"chrome",versionTest:"chrome"},{test:"chromium",id:"chrome"},{test:"whale",id:"chrome",versionAlias:"-1",brand:!0}],R=[{test:"applewebkit",id:"webkit",versionTest:"applewebkit|safari"}],U=[{test:"(?=(iphone|ipad))(?!(.*version))",id:"webview"},{test:"(?=(android|iphone|ipad))(?=.*(naver|daum|; wv))",id:"webview"},{test:"webview",id:"webview"}],H=[{test:"windows phone",id:"windows phone"},{test:"windows 2000",id:"window",versionAlias:"5.0"},{test:"windows nt",id:"window"},{test:"win32|windows",id:"window"},{test:"iphone|ipad|ipod",id:"ios",versionTest:"iphone os|cpu os"},{test:"macos|macintel|mac os x",id:"mac"},{test:"android|linux armv81",id:"android"},{test:"tizen",id:"tizen"},{test:"webos|web0s",id:"webos"}];function K(n){return!!V(U,n).preset}function ge(n){const t=W(n),o=!!/mobi/g.exec(t),e={name:"unknown",version:"-1",majorVersion:-1,webview:K(t),chromium:!1,chromiumVersion:"-1",webkit:!1,webkitVersion:"-1"},r={name:"unknown",version:"-1",majorVersion:-1},{preset:a,version:f}=V(I,t),{preset:s,version:l}=V(H,t),p=V(O,t);if(e.chromium=!!p.preset,e.chromiumVersion=p.version,!e.chromium){const m=V(R,t);e.webkit=!!m.preset,e.webkitVersion=m.version}return s&&(r.name=s.id,r.version=l,r.majorVersion=parseInt(l,10)),a&&(e.name=a.id,e.version=f,e.webview&&r.name==="ios"&&e.name!=="safari"&&(e.webview=!1)),e.majorVersion=parseInt(e.version,10),{browser:e,os:r,isMobile:o,isHints:!1}}function q(n){const t=navigator.userAgentData,o=[...t.brands],e=n&&n.fullVersionList,r=t.mobile||!1,a=o[0],f=(n&&n.platform||t.platform||navigator.platform).toLowerCase(),s={name:a.brand,version:a.version,majorVersion:-1,webkit:!1,webkitVersion:"-1",chromium:!1,chromiumVersion:"-1",webview:!!_(U,o).brand||K(W())},l={name:"unknown",version:"-1",majorVersion:-1};s.webkit=!s.chromium&&R.some(i=>F(o,i));const p=_(O,o);if(s.chromium=!!p.brand,s.chromiumVersion=p.version,!s.chromium){const i=_(R,o);s.webkit=!!i.brand,s.webkitVersion=i.version}const m=H.find(i=>new RegExp(`${i.test}`,"g").exec(f));if(l.name=m?m.id:"",n&&(l.version=n.platformVersion),e&&e.length){const i=_(I,e);s.name=i.brand||s.name,s.version=i.version||s.version}else{const i=_(I,o);s.name=i.brand||s.name,s.version=i.brand&&n?n.uaFullVersion:i.version}return s.webkit&&(l.name=r?"ios":"mac"),l.name==="ios"&&s.webview&&(s.version="-1"),l.version=$(l.version),s.version=$(s.version),l.majorVersion=parseInt(l.version,10),s.majorVersion=parseInt(s.version,10),{browser:s,os:l,isMobile:r,isHints:!0}}async function he(){if(D()){const n=await navigator.userAgentData.getHighEntropyValues(["architecture","model","platform","platformVersion","uaFullVersion","fullVersionList"]);return q(n)}return _e()}function _e(n){return typeof n>"u"&&D()?q():ge(n)}const Ve={class:"header"},ye={class:"login-block"},ke=["label","error","error-text"],Se=["disabled"],Ae={class:"tap-phone"},Ee={class:"tap-phone-text"},Te={key:0,class:"tips"},Be=G({__name:"LoginView",setup(n){const{handleSubmit:t,isSubmitting:o}=ve(),e=h(!1),r=h(!0),a=h(!1),f=h("");let s;const l=window.location.protocol==="http:"?!1:!window.navigator.userAgentData,{t:p}=Z(),{value:m,errorMessage:i}=be("password",Q().required()),B=h(!1);async function z(){const d=await fetch(`${M()}/init`,{method:"POST",headers:de()});if(d.status===403){e.value=!0,r.value=!0,f.value="web_access_disabled";return}r.value=!1;const w=await d.text();w?(m.value=w,B.value=!1):B.value=!0}z();const y=t(async()=>{const d=localStorage.getItem("client_id");s=new WebSocket(`${X()}?cid=${d}&auth=1`);const w=m.value??"",k=Y(w),b=ee(k);f.value="",e.value=!1,s.onopen=async()=>{o.value=!0;const u=await he(),S=se(b,JSON.stringify({password:k,browserName:u.browser.name,browserVersion:u.browser.version,osName:u.os.name,osVersion:u.os.version,isMobile:u.isMobile}));s.send(ne(S))},s.onmessage=async u=>{var C;const S=te(b,oe(await u.data.arrayBuffer())),j=JSON.parse(S);j.status==="PENDING"?a.value=!0:(localStorage.setItem("auth_token",j.token),s.close(),window.location.href=((C=re.currentRoute.value.query.redirect)==null?void 0:C.toString())??"/")},s.onclose=async u=>{if(!(u.reason==="abort"||u.reason==="OK")){if(o.value=!1,e.value=!0,a.value=!1,!u.reason&&(await fetch(`${M()}/health_check`)).status===200){f.value="failed_connect_ws";return}f.value=`login.${u.reason?u.reason:"failed"}`}},window.setTimeout(function(){s.readyState!==1&&s.close(3001,"timeout")},2e3)});function J(){a.value=!1,e.value=!1,o.value=!1,s.close(3001,"abort")}return(d,w)=>{const k=we;return T(),A(ce,null,[v("header",Ve,[N(k,{"logged-in":!1})]),v("h1",null,g(d.$t("app_name")),1),v("div",ye,[E(v("form",{onSubmit:w[2]||(w[2]=ie((...b)=>c(y)&&c(y)(...b),["prevent"]))},[E(v("div",{class:"alert alert-danger",role:"alert"},g(f.value?d.$t(f.value):""),513),[[x,e.value]]),B.value?E((T(),A("md-outlined-text-field",{key:0,label:c(p)("password"),"onUpdate:modelValue":w[0]||(w[0]=b=>ae(m)?m.value=b:null),onKeydown:w[1]||(w[1]=le((...b)=>c(y)&&c(y)(...b),["enter"])),type:"password",class:"form-control",error:c(i),autocomplete:"current-password","error-text":c(i)?d.$t(c(i)):""},null,40,ke)),[[ue,c(m)]]):P("",!0),r.value?P("",!0):(T(),A("md-filled-button",{key:1,disabled:c(o)},g(d.$t(c(o)?"logging_in":"log_in")),9,Se))],544),[[x,!a.value]]),E(v("div",null,[v("div",Ae,[N(c(me))]),v("div",Ee,g(d.$t("login.to_continue")),1),v("md-outlined-button",{onClick:J},g(d.$t("cancel")),1)],512),[[x,a.value]])]),c(l)?(T(),A("div",Te,g(d.$t("browser_warning")),1)):P("",!0)],64)}}});const $e=fe(Be,[["__scopeId","data-v-c473a0b7"]]);export{$e as default};
+import{d as G,r as h,u as Z,an as Q,co as X,cp as Y,cq as ee,cr as se,cs as ne,ct as te,cu as oe,aZ as re,cv as M,c as A,a as v,p as N,t as g,m as E,aW as x,l as ie,j as c,n as ae,ap as le,v as ue,k as P,F as ce,cw as de,o as T,cx as me,cy as we,_ as fe}from"./index-82e633ff.js";import{u as ve,a as be}from"./vee-validate.esm-6643484a.js";function W(n){let t=n;if(typeof t>"u"){if(typeof navigator>"u"||!navigator)return"";t=navigator.userAgent||""}return t.toLowerCase()}function L(n,t){try{return new RegExp(n,"g").exec(t)}catch{return null}}function D(){if(typeof navigator>"u"||!navigator||!navigator.userAgentData)return!1;const t=navigator.userAgentData.brands;return!!(t&&t.length)}function pe(n,t){const o=L(`(${n})((?:\\/|\\s|:)([0-9|\\.|_]+))`,t);return o?o[3]:""}function $(n){return n.replace(/_/g,".")}function V(n,t){let o=null,e="-1";return n.some(r=>{const a=L(`(${r.test})((?:\\/|\\s|:)([0-9|\\.|_]+))?`,t);return!a||r.brand?!1:(o=r,e=a[3]||"-1",r.versionAlias?e=r.versionAlias:r.versionTest&&(e=pe(r.versionTest.toLowerCase(),t)||e),e=$(e),!0)}),{preset:o,version:e}}function _(n,t){const o={brand:"",version:"-1"};return n.some(e=>{const r=F(t,e);return r?(o.brand=e.id,o.version=e.versionAlias||r.version,o.version!=="-1"):!1}),o}function F(n,t){return n.find(o=>L(`${t.test}`,o.brand.toLowerCase()))}const I=[{test:"phantomjs",id:"phantomjs"},{test:"whale",id:"whale"},{test:"edgios|edge|edg",id:"edge"},{test:"msie|trident|windows phone",id:"ie",versionTest:"iemobile|msie|rv"},{test:"miuibrowser",id:"miui browser"},{test:"samsungbrowser",id:"samsung internet"},{test:"samsung",id:"samsung internet",versionTest:"version"},{test:"chrome|crios",id:"chrome"},{test:"firefox|fxios",id:"firefox"},{test:"android",id:"android browser",versionTest:"version"},{test:"safari|iphone|ipad|ipod",id:"safari",versionTest:"version"}],O=[{test:"(?=.*applewebkit/(53[0-7]|5[0-2]|[0-4]))(?=.*\\schrome)",id:"chrome",versionTest:"chrome"},{test:"chromium",id:"chrome"},{test:"whale",id:"chrome",versionAlias:"-1",brand:!0}],R=[{test:"applewebkit",id:"webkit",versionTest:"applewebkit|safari"}],U=[{test:"(?=(iphone|ipad))(?!(.*version))",id:"webview"},{test:"(?=(android|iphone|ipad))(?=.*(naver|daum|; wv))",id:"webview"},{test:"webview",id:"webview"}],H=[{test:"windows phone",id:"windows phone"},{test:"windows 2000",id:"window",versionAlias:"5.0"},{test:"windows nt",id:"window"},{test:"win32|windows",id:"window"},{test:"iphone|ipad|ipod",id:"ios",versionTest:"iphone os|cpu os"},{test:"macos|macintel|mac os x",id:"mac"},{test:"android|linux armv81",id:"android"},{test:"tizen",id:"tizen"},{test:"webos|web0s",id:"webos"}];function K(n){return!!V(U,n).preset}function ge(n){const t=W(n),o=!!/mobi/g.exec(t),e={name:"unknown",version:"-1",majorVersion:-1,webview:K(t),chromium:!1,chromiumVersion:"-1",webkit:!1,webkitVersion:"-1"},r={name:"unknown",version:"-1",majorVersion:-1},{preset:a,version:f}=V(I,t),{preset:s,version:l}=V(H,t),p=V(O,t);if(e.chromium=!!p.preset,e.chromiumVersion=p.version,!e.chromium){const m=V(R,t);e.webkit=!!m.preset,e.webkitVersion=m.version}return s&&(r.name=s.id,r.version=l,r.majorVersion=parseInt(l,10)),a&&(e.name=a.id,e.version=f,e.webview&&r.name==="ios"&&e.name!=="safari"&&(e.webview=!1)),e.majorVersion=parseInt(e.version,10),{browser:e,os:r,isMobile:o,isHints:!1}}function q(n){const t=navigator.userAgentData,o=[...t.brands],e=n&&n.fullVersionList,r=t.mobile||!1,a=o[0],f=(n&&n.platform||t.platform||navigator.platform).toLowerCase(),s={name:a.brand,version:a.version,majorVersion:-1,webkit:!1,webkitVersion:"-1",chromium:!1,chromiumVersion:"-1",webview:!!_(U,o).brand||K(W())},l={name:"unknown",version:"-1",majorVersion:-1};s.webkit=!s.chromium&&R.some(i=>F(o,i));const p=_(O,o);if(s.chromium=!!p.brand,s.chromiumVersion=p.version,!s.chromium){const i=_(R,o);s.webkit=!!i.brand,s.webkitVersion=i.version}const m=H.find(i=>new RegExp(`${i.test}`,"g").exec(f));if(l.name=m?m.id:"",n&&(l.version=n.platformVersion),e&&e.length){const i=_(I,e);s.name=i.brand||s.name,s.version=i.version||s.version}else{const i=_(I,o);s.name=i.brand||s.name,s.version=i.brand&&n?n.uaFullVersion:i.version}return s.webkit&&(l.name=r?"ios":"mac"),l.name==="ios"&&s.webview&&(s.version="-1"),l.version=$(l.version),s.version=$(s.version),l.majorVersion=parseInt(l.version,10),s.majorVersion=parseInt(s.version,10),{browser:s,os:l,isMobile:r,isHints:!0}}async function he(){if(D()){const n=await navigator.userAgentData.getHighEntropyValues(["architecture","model","platform","platformVersion","uaFullVersion","fullVersionList"]);return q(n)}return _e()}function _e(n){return typeof n>"u"&&D()?q():ge(n)}const Ve={class:"header"},ye={class:"login-block"},ke=["label","error","error-text"],Se=["disabled"],Ae={class:"tap-phone"},Ee={class:"tap-phone-text"},Te={key:0,class:"tips"},Be=G({__name:"LoginView",setup(n){const{handleSubmit:t,isSubmitting:o}=ve(),e=h(!1),r=h(!0),a=h(!1),f=h("");let s;const l=window.location.protocol==="http:"?!1:!window.navigator.userAgentData,{t:p}=Z(),{value:m,errorMessage:i}=be("password",Q().required()),B=h(!1);async function z(){const d=await fetch(`${M()}/init`,{method:"POST",headers:de()});if(d.status===403){e.value=!0,r.value=!0,f.value="web_access_disabled";return}r.value=!1;const w=await d.text();w?(m.value=w,B.value=!1):B.value=!0}z();const y=t(async()=>{const d=localStorage.getItem("client_id");s=new WebSocket(`${X()}?cid=${d}&auth=1`);const w=m.value??"",k=Y(w),b=ee(k);f.value="",e.value=!1,s.onopen=async()=>{o.value=!0;const u=await he(),S=se(b,JSON.stringify({password:k,browserName:u.browser.name,browserVersion:u.browser.version,osName:u.os.name,osVersion:u.os.version,isMobile:u.isMobile}));s.send(ne(S))},s.onmessage=async u=>{var C;const S=te(b,oe(await u.data.arrayBuffer())),j=JSON.parse(S);j.status==="PENDING"?a.value=!0:(localStorage.setItem("auth_token",j.token),s.close(),window.location.href=((C=re.currentRoute.value.query.redirect)==null?void 0:C.toString())??"/")},s.onclose=async u=>{if(!(u.reason==="abort"||u.reason==="OK")){if(o.value=!1,e.value=!0,a.value=!1,!u.reason&&(await fetch(`${M()}/health_check`)).status===200){f.value="failed_connect_ws";return}f.value=`login.${u.reason?u.reason:"failed"}`}},window.setTimeout(function(){s.readyState!==1&&s.close(3001,"timeout")},2e3)});function J(){a.value=!1,e.value=!1,o.value=!1,s.close(3001,"abort")}return(d,w)=>{const k=we;return T(),A(ce,null,[v("header",Ve,[N(k,{"logged-in":!1})]),v("h1",null,g(d.$t("app_name")),1),v("div",ye,[E(v("form",{onSubmit:w[2]||(w[2]=ie((...b)=>c(y)&&c(y)(...b),["prevent"]))},[E(v("div",{class:"alert alert-danger",role:"alert"},g(f.value?d.$t(f.value):""),513),[[x,e.value]]),B.value?E((T(),A("md-outlined-text-field",{key:0,label:c(p)("password"),"onUpdate:modelValue":w[0]||(w[0]=b=>ae(m)?m.value=b:null),onKeydown:w[1]||(w[1]=le((...b)=>c(y)&&c(y)(...b),["enter"])),type:"password",class:"form-control",error:c(i),autocomplete:"current-password","error-text":c(i)?d.$t(c(i)):""},null,40,ke)),[[ue,c(m)]]):P("",!0),r.value?P("",!0):(T(),A("md-filled-button",{key:1,disabled:c(o)},g(d.$t(c(o)?"logging_in":"log_in")),9,Se))],544),[[x,!a.value]]),E(v("div",null,[v("div",Ae,[N(c(me))]),v("div",Ee,g(d.$t("login.to_continue")),1),v("md-outlined-button",{onClick:J},g(d.$t("cancel")),1)],512),[[x,a.value]])]),c(l)?(T(),A("div",Te,g(d.$t("browser_warning")),1)):P("",!0)],64)}}});const $e=fe(Be,[["__scopeId","data-v-c473a0b7"]]);export{$e as default};
diff --git a/app/src/main/resources/web/assets/MessagesRootView-b8b96994.js b/app/src/main/resources/web/assets/MessagesRootView-bb69e025.js
similarity index 75%
rename from app/src/main/resources/web/assets/MessagesRootView-b8b96994.js
rename to app/src/main/resources/web/assets/MessagesRootView-bb69e025.js
index a4a751e5..b52b32bf 100644
--- a/app/src/main/resources/web/assets/MessagesRootView-b8b96994.js
+++ b/app/src/main/resources/web/assets/MessagesRootView-bb69e025.js
@@ -1 +1 @@
-import{_ as $}from"./TagFilter.vuevuetypescriptsetuptruelang-d0de30fc.js";import{d as w,D as M,e as S,E as B,G as N,c as p,p as a,H as i,j as e,o as m,a as s,t as c,l as d,I as u,F as z,J as T,C as f}from"./index-a9bbc323.js";import{g,M as V}from"./splitpanes.es-37578c0b.js";import"./EditValueModal-8c79ab9c.js";import"./vee-validate.esm-d674d968.js";const b={class:"page-container"},D={class:"sidebar"},E={class:"nav-title"},F={class:"nav"},R=["onClick"],j=["onClick"],q={class:"main"},K=w({__name:"MessagesRootView",setup(x){const n=M(),l=S(),r=n.params.type,_=r?"":B(n.query);function h(t){f(l,`/messages/${t}`)}const v=["inbox","sent","drafts"];function y(){f(l,"/messages")}return(t,G)=>{const C=$,k=N("router-view");return m(),p("div",b,[a(e(V),null,{default:i(()=>[a(e(g),{size:"20","min-size":"10"},{default:i(()=>[s("div",D,[s("h2",E,c(t.$t("page_title.messages")),1),s("ul",F,[s("li",{onClick:d(y,["prevent"]),class:u({active:e(n).path==="/messages"&&!e(_)})},c(t.$t("all")),11,R),(m(),p(z,null,T(v,o=>s("li",{key:o,onClick:d(H=>h(o),["prevent"]),class:u({active:o===e(r)})},c(t.$t(`message_type.${o}`)),11,j)),64))]),a(C,{type:"SMS",selected:e(_)},null,8,["selected"])])]),_:1}),a(e(g),null,{default:i(()=>[s("div",q,[a(k)])]),_:1})]),_:1})])}}});export{K as default};
+import{_ as $}from"./TagFilter.vuevuetypescriptsetuptruelang-10776836.js";import{d as w,D as M,e as S,E as B,G as N,c as p,p as a,H as i,j as e,o as m,a as s,t as c,l as d,I as u,F as z,J as T,C as f}from"./index-82e633ff.js";import{g,M as V}from"./splitpanes.es-de3e6852.js";import"./EditValueModal-df390030.js";import"./vee-validate.esm-6643484a.js";const b={class:"page-container"},D={class:"sidebar"},E={class:"nav-title"},F={class:"nav"},R=["onClick"],j=["onClick"],q={class:"main"},K=w({__name:"MessagesRootView",setup(x){const n=M(),l=S(),r=n.params.type,_=r?"":B(n.query);function h(t){f(l,`/messages/${t}`)}const v=["inbox","sent","drafts"];function y(){f(l,"/messages")}return(t,G)=>{const C=$,k=N("router-view");return m(),p("div",b,[a(e(V),null,{default:i(()=>[a(e(g),{size:"20","min-size":"10"},{default:i(()=>[s("div",D,[s("h2",E,c(t.$t("page_title.messages")),1),s("ul",F,[s("li",{onClick:d(y,["prevent"]),class:u({active:e(n).path==="/messages"&&!e(_)})},c(t.$t("all")),11,R),(m(),p(z,null,T(v,o=>s("li",{key:o,onClick:d(H=>h(o),["prevent"]),class:u({active:o===e(r)})},c(t.$t(`message_type.${o}`)),11,j)),64))]),a(C,{type:"SMS",selected:e(_)},null,8,["selected"])])]),_:1}),a(e(g),null,{default:i(()=>[s("div",q,[a(k)])]),_:1})]),_:1})])}}});export{K as default};
diff --git a/app/src/main/resources/web/assets/MessagesView-df01269c.js b/app/src/main/resources/web/assets/MessagesView-5223930b.js
similarity index 95%
rename from app/src/main/resources/web/assets/MessagesView-df01269c.js
rename to app/src/main/resources/web/assets/MessagesView-5223930b.js
index 72ef1883..0fae8ecf 100644
--- a/app/src/main/resources/web/assets/MessagesView-df01269c.js
+++ b/app/src/main/resources/web/assets/MessagesView-5223930b.js
@@ -1 +1 @@
-import{u as ue,_ as _e,a as pe,b as me}from"./list-be40ed35.js";import{d as he,e as ge,s as fe,f as ke,r as g,u as ve,K as ye,L as be,D as $e,M as Te,N as Ce,w as Se,O as we,P as $,Q as Ve,R as De,c as d,a as e,p as r,j as a,m as T,l as C,k as M,H as Me,t as o,F as q,J as G,S as qe,T as Ae,U as Re,x as Ie,V as Le,C as S,W as w,o as n,v as Ue,I as Be,X as Qe,Y as He,h as Ne,Z as Fe,$ as ze,a0 as xe,a1 as Ee,a2 as Ke,a3 as Pe,a4 as je,a5 as Ge,a6 as Je}from"./index-a9bbc323.js";import{_ as Oe}from"./Breadcrumb-7b5128ab.js";import{u as We,a as Xe}from"./tags-7e5964e8.js";import"./vee-validate.esm-d674d968.js";const Ye={class:"v-toolbar"},Ze=e("md-ripple",null,null,-1),et={class:"filters"},tt=["label"],st={class:"form-label"},at=["label","selected","onClick"],lt={class:"buttons"},ot=["onClick"],nt={class:"table-responsive"},dt={class:"table"},ct=["checked","indeterminate"],it=e("th",null,"ID",-1),rt=e("th",null,null,-1),ut=["onClick"],_t=["checked"],pt=["innerHTML"],mt={class:"nowrap"},ht={class:"action-btns"},gt=["onClick"],ft=e("md-ripple",null,null,-1),kt={class:"nowrap"},vt={class:"nowrap"},yt={class:"nowrap"},bt={key:0},$t={colspan:"8"},Tt={class:"no-data-placeholder"},f=50,qt=he({__name:"MessagesView",setup(Ct){var K,P;const k=ge(),{app:J}=fe(ke()),p=g([]),A=g(),{t:O}=ve(),c=ye({text:"",tags:[]}),u=be.SMS,R=$e(),I=R.query,v=g(parseInt(((K=I.page)==null?void 0:K.toString())??"1")),i=g(Te(((P=I.q)==null?void 0:P.toString())??"")),V=g(""),{tags:y}=We(u,i,c,async t=>{_&&t.push({name:"type",op:"",value:se[_].toString()}),V.value=Ae(t),await Re(),te()}),{addToTags:W}=Xe(u,p,y),{allChecked:L,realAllChecked:U,selectRealAll:X,allCheckedAlertVisible:Y,clearSelection:B,toggleAllChecked:Q,toggleItemChecked:H,toggleRow:Z,total:m,checked:N}=ue(p),{loading:ee,load:te,refetch:F}=Ce({handle:(t,l)=>{l?Ie(O(l),"error"):t&&(p.value=t.messages.map(h=>({...h,checked:!1})),m.value=t.messageCount)},document:Le,variables:()=>({offset:(v.value-1)*f,limit:f,query:V.value}),appApi:!0}),_=R.params.type,se={inbox:1,sent:2,drafts:3,outbox:4};Se(v,t=>{_?S(k,`/messages/${_}?page=${t}&q=${w(i.value)}`):S(k,`/messages?page=${t}&q=${w(i.value)}`)});function ae(t){c.tags.includes(t)?xe(c.tags,l=>l.id===t.id):c.tags.push(t)}function le(){i.value=Ee(c),z(),A.value.dismiss()}function oe(t){Ke(Pe,{type:u,tags:y.value,item:{key:t.id,title:"",size:0},selected:y.value.filter(l=>t.tags.some(h=>h.id===l.id))})}function z(){_?S(k,`/messages/${_}?q=${w(i.value)}`):S(k,`/messages?q=${w(i.value)}`)}const x=t=>{t.type===u&&(B(),F())},E=t=>{t.type===u&&F()};return we(()=>{$.on("item_tags_updated",E),$.on("items_tags_updated",x)}),Ve(()=>{$.off("item_tags_updated",E),$.off("items_tags_updated",x)}),(t,l)=>{const h=Oe,j=je,ne=_e,de=pe,ce=Ge,ie=Je,re=me,D=De("tooltip");return n(),d(q,null,[e("div",Ye,[r(h,{current:()=>`${t.$t("page_title.messages")} (${a(m)})`},null,8,["current"]),a(N)?T((n(),d("button",{key:0,class:"icon-button",onClick:l[0]||(l[0]=C(s=>a(W)(a(U),V.value),["stop"]))},[Ze,r(j)])),[[D,t.$t("add_to_tags")]]):M("",!0),r(ne,{ref_key:"searchInputRef",ref:A,modelValue:i.value,"onUpdate:modelValue":l[2]||(l[2]=s=>i.value=s),search:z},{filters:Me(()=>[e("div",et,[T(e("md-outlined-text-field",{label:t.$t("keywords"),"onUpdate:modelValue":l[1]||(l[1]=s=>c.text=s),"keyup.enter":"applyAndDoSearch"},null,8,tt),[[Ue,c.text]]),e("label",st,o(t.$t("tags")),1),e("md-chip-set",null,[(n(!0),d(q,null,G(a(y),s=>(n(),d("md-filter-chip",{key:s.id,label:s.name,selected:c.tags.includes(s),onClick:b=>ae(s)},null,8,at))),128))]),e("div",lt,[e("md-filled-button",{onClick:C(le,["stop"])},o(t.$t("search")),9,ot)])])]),_:1},8,["modelValue"])]),r(de,{limit:f,total:a(m),"all-checked-alert-visible":a(Y),"real-all-checked":a(U),"select-real-all":a(X),"clear-selection":a(B)},null,8,["total","all-checked-alert-visible","real-all-checked","select-real-all","clear-selection"]),e("div",nt,[e("table",dt,[e("thead",null,[e("tr",null,[e("th",null,[e("md-checkbox",{"touch-target":"wrapper",onChange:l[3]||(l[3]=(...s)=>a(Q)&&a(Q)(...s)),checked:a(L),indeterminate:!a(L)&&a(N)},null,40,ct)]),it,e("th",null,o(t.$t("content")),1),rt,e("th",null,o(t.$t("sms_address")),1),e("th",null,o(t.$t("type")),1),e("th",null,o(t.$t("tags")),1),e("th",null,o(t.$t("time")),1)])]),e("tbody",null,[(n(!0),d(q,null,G(p.value,s=>(n(),d("tr",{key:s.id,class:Be({selected:s.checked}),onClick:C(b=>a(Z)(s),["stop"])},[e("td",null,[e("md-checkbox",{"touch-target":"wrapper",onChange:l[4]||(l[4]=(...b)=>a(H)&&a(H)(...b)),checked:s.checked},null,40,_t)]),e("td",null,[r(ce,{id:s.id,raw:s},null,8,["id","raw"])]),e("td",{innerHTML:a(Qe)(s.body)},null,8,pt),e("td",mt,[e("div",ht,[T((n(),d("button",{class:"icon-button",onClick:C(b=>oe(s),["stop"])},[ft,r(j)],8,gt)),[[D,t.$t("add_to_tags")]])])]),e("td",kt,o(s.address),1),e("td",vt,o(t.$t(`message_type.${s.type}`)),1),e("td",null,[r(ie,{tags:s.tags,type:a(u)},null,8,["tags","type"])]),e("td",yt,[T((n(),d("span",null,[Ne(o(a(Fe)(s.date)),1)])),[[D,a(He)(s.date)]])])],10,ut))),128))]),p.value.length?M("",!0):(n(),d("tfoot",bt,[e("tr",null,[e("td",$t,[e("div",Tt,o(t.$t(a(ze)(a(ee),a(J).permissions,"READ_SMS"))),1)])])]))])]),a(m)>f?(n(),qe(re,{key:0,modelValue:v.value,"onUpdate:modelValue":l[5]||(l[5]=s=>v.value=s),total:a(m),limit:f},null,8,["modelValue","total"])):M("",!0)],64)}}});export{qt as default};
+import{u as ue,_ as _e,a as pe,b as me}from"./list-0feac61c.js";import{d as he,e as ge,s as fe,f as ke,r as g,u as ve,K as ye,L as be,D as $e,M as Te,N as Ce,w as Se,O as we,P as $,Q as Ve,R as De,c as d,a as e,p as r,j as a,m as T,l as C,k as M,H as Me,t as o,F as q,J as G,S as qe,T as Ae,U as Re,x as Ie,V as Le,C as S,W as w,o as n,v as Ue,I as Be,X as Qe,Y as He,h as Ne,Z as Fe,$ as ze,a0 as xe,a1 as Ee,a2 as Ke,a3 as Pe,a4 as je,a5 as Ge,a6 as Je}from"./index-82e633ff.js";import{_ as Oe}from"./Breadcrumb-9ca58797.js";import{u as We,a as Xe}from"./tags-dce7ef69.js";import"./vee-validate.esm-6643484a.js";const Ye={class:"v-toolbar"},Ze=e("md-ripple",null,null,-1),et={class:"filters"},tt=["label"],st={class:"form-label"},at=["label","selected","onClick"],lt={class:"buttons"},ot=["onClick"],nt={class:"table-responsive"},dt={class:"table"},ct=["checked","indeterminate"],it=e("th",null,"ID",-1),rt=e("th",null,null,-1),ut=["onClick"],_t=["checked"],pt=["innerHTML"],mt={class:"nowrap"},ht={class:"action-btns"},gt=["onClick"],ft=e("md-ripple",null,null,-1),kt={class:"nowrap"},vt={class:"nowrap"},yt={class:"nowrap"},bt={key:0},$t={colspan:"8"},Tt={class:"no-data-placeholder"},f=50,qt=he({__name:"MessagesView",setup(Ct){var K,P;const k=ge(),{app:J}=fe(ke()),p=g([]),A=g(),{t:O}=ve(),c=ye({text:"",tags:[]}),u=be.SMS,R=$e(),I=R.query,v=g(parseInt(((K=I.page)==null?void 0:K.toString())??"1")),i=g(Te(((P=I.q)==null?void 0:P.toString())??"")),V=g(""),{tags:y}=We(u,i,c,async t=>{_&&t.push({name:"type",op:"",value:se[_].toString()}),V.value=Ae(t),await Re(),te()}),{addToTags:W}=Xe(u,p,y),{allChecked:L,realAllChecked:U,selectRealAll:X,allCheckedAlertVisible:Y,clearSelection:B,toggleAllChecked:Q,toggleItemChecked:H,toggleRow:Z,total:m,checked:N}=ue(p),{loading:ee,load:te,refetch:F}=Ce({handle:(t,l)=>{l?Ie(O(l),"error"):t&&(p.value=t.messages.map(h=>({...h,checked:!1})),m.value=t.messageCount)},document:Le,variables:()=>({offset:(v.value-1)*f,limit:f,query:V.value}),appApi:!0}),_=R.params.type,se={inbox:1,sent:2,drafts:3,outbox:4};Se(v,t=>{_?S(k,`/messages/${_}?page=${t}&q=${w(i.value)}`):S(k,`/messages?page=${t}&q=${w(i.value)}`)});function ae(t){c.tags.includes(t)?xe(c.tags,l=>l.id===t.id):c.tags.push(t)}function le(){i.value=Ee(c),z(),A.value.dismiss()}function oe(t){Ke(Pe,{type:u,tags:y.value,item:{key:t.id,title:"",size:0},selected:y.value.filter(l=>t.tags.some(h=>h.id===l.id))})}function z(){_?S(k,`/messages/${_}?q=${w(i.value)}`):S(k,`/messages?q=${w(i.value)}`)}const x=t=>{t.type===u&&(B(),F())},E=t=>{t.type===u&&F()};return we(()=>{$.on("item_tags_updated",E),$.on("items_tags_updated",x)}),Ve(()=>{$.off("item_tags_updated",E),$.off("items_tags_updated",x)}),(t,l)=>{const h=Oe,j=je,ne=_e,de=pe,ce=Ge,ie=Je,re=me,D=De("tooltip");return n(),d(q,null,[e("div",Ye,[r(h,{current:()=>`${t.$t("page_title.messages")} (${a(m)})`},null,8,["current"]),a(N)?T((n(),d("button",{key:0,class:"icon-button",onClick:l[0]||(l[0]=C(s=>a(W)(a(U),V.value),["stop"]))},[Ze,r(j)])),[[D,t.$t("add_to_tags")]]):M("",!0),r(ne,{ref_key:"searchInputRef",ref:A,modelValue:i.value,"onUpdate:modelValue":l[2]||(l[2]=s=>i.value=s),search:z},{filters:Me(()=>[e("div",et,[T(e("md-outlined-text-field",{label:t.$t("keywords"),"onUpdate:modelValue":l[1]||(l[1]=s=>c.text=s),"keyup.enter":"applyAndDoSearch"},null,8,tt),[[Ue,c.text]]),e("label",st,o(t.$t("tags")),1),e("md-chip-set",null,[(n(!0),d(q,null,G(a(y),s=>(n(),d("md-filter-chip",{key:s.id,label:s.name,selected:c.tags.includes(s),onClick:b=>ae(s)},null,8,at))),128))]),e("div",lt,[e("md-filled-button",{onClick:C(le,["stop"])},o(t.$t("search")),9,ot)])])]),_:1},8,["modelValue"])]),r(de,{limit:f,total:a(m),"all-checked-alert-visible":a(Y),"real-all-checked":a(U),"select-real-all":a(X),"clear-selection":a(B)},null,8,["total","all-checked-alert-visible","real-all-checked","select-real-all","clear-selection"]),e("div",nt,[e("table",dt,[e("thead",null,[e("tr",null,[e("th",null,[e("md-checkbox",{"touch-target":"wrapper",onChange:l[3]||(l[3]=(...s)=>a(Q)&&a(Q)(...s)),checked:a(L),indeterminate:!a(L)&&a(N)},null,40,ct)]),it,e("th",null,o(t.$t("content")),1),rt,e("th",null,o(t.$t("sms_address")),1),e("th",null,o(t.$t("type")),1),e("th",null,o(t.$t("tags")),1),e("th",null,o(t.$t("time")),1)])]),e("tbody",null,[(n(!0),d(q,null,G(p.value,s=>(n(),d("tr",{key:s.id,class:Be({selected:s.checked}),onClick:C(b=>a(Z)(s),["stop"])},[e("td",null,[e("md-checkbox",{"touch-target":"wrapper",onChange:l[4]||(l[4]=(...b)=>a(H)&&a(H)(...b)),checked:s.checked},null,40,_t)]),e("td",null,[r(ce,{id:s.id,raw:s},null,8,["id","raw"])]),e("td",{innerHTML:a(Qe)(s.body)},null,8,pt),e("td",mt,[e("div",ht,[T((n(),d("button",{class:"icon-button",onClick:C(b=>oe(s),["stop"])},[ft,r(j)],8,gt)),[[D,t.$t("add_to_tags")]])])]),e("td",kt,o(s.address),1),e("td",vt,o(t.$t(`message_type.${s.type}`)),1),e("td",null,[r(ie,{tags:s.tags,type:a(u)},null,8,["tags","type"])]),e("td",yt,[T((n(),d("span",null,[Ne(o(a(Fe)(s.date)),1)])),[[D,a(He)(s.date)]])])],10,ut))),128))]),p.value.length?M("",!0):(n(),d("tfoot",bt,[e("tr",null,[e("td",$t,[e("div",Tt,o(t.$t(a(ze)(a(ee),a(J).permissions,"READ_SMS"))),1)])])]))])]),a(m)>f?(n(),qe(re,{key:0,modelValue:v.value,"onUpdate:modelValue":l[5]||(l[5]=s=>v.value=s),total:a(m),limit:f},null,8,["modelValue","total"])):M("",!0)],64)}}});export{qt as default};
diff --git a/app/src/main/resources/web/assets/MonacoEditor.vuevuetypescriptsetuptruelang-be395bf3.js b/app/src/main/resources/web/assets/MonacoEditor.vuevuetypescriptsetuptruelang-86bf597d.js
similarity index 99%
rename from app/src/main/resources/web/assets/MonacoEditor.vuevuetypescriptsetuptruelang-be395bf3.js
rename to app/src/main/resources/web/assets/MonacoEditor.vuevuetypescriptsetuptruelang-86bf597d.js
index 32b98425..7adc0f79 100644
--- a/app/src/main/resources/web/assets/MonacoEditor.vuevuetypescriptsetuptruelang-be395bf3.js
+++ b/app/src/main/resources/web/assets/MonacoEditor.vuevuetypescriptsetuptruelang-86bf597d.js
@@ -1,4 +1,4 @@
-var c6=Object.defineProperty;var d6=(o,e,t)=>e in o?c6(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var Zt=(o,e,t)=>(d6(o,typeof e!="symbol"?e+"":e,t),t);import{bW as me,d as h6,bX as u6,aC as g6,bK as f6,r as p6,O as D2,w as kb,P as x2,Q as m6,o as _6,c as b6,bI as v6}from"./index-a9bbc323.js";globalThis&&globalThis.__awaiter;let C6=typeof document<"u"&&document.location&&document.location.hash.indexOf("pseudo=true")>=0;function w6(o,e){let t;return e.length===0?t=o:t=o.replace(/\{(\d+)\}/g,(i,n)=>{const s=n[0],r=e[s];let a=i;return typeof r=="string"?a=r:(typeof r=="number"||typeof r=="boolean"||r===void 0||r===null)&&(a=String(r)),a}),C6&&(t="["+t.replace(/[aouei]/g,"$&$&")+"]"),t}function f(o,e,...t){return w6(e,t)}var ES;const mp="en";let Iv=!1,Ev=!1,U0=!1,d4=!1,mE=!1,_E=!1,h4=!1,Ib,$0=mp,S6,Zo;const di=typeof self=="object"?self:typeof global=="object"?global:{};let Rn;typeof di.vscode<"u"&&typeof di.vscode.process<"u"?Rn=di.vscode.process:typeof process<"u"&&(Rn=process);const y6=typeof((ES=Rn==null?void 0:Rn.versions)===null||ES===void 0?void 0:ES.electron)=="string",L6=y6&&(Rn==null?void 0:Rn.type)==="renderer";if(typeof navigator=="object"&&!L6)Zo=navigator.userAgent,Iv=Zo.indexOf("Windows")>=0,Ev=Zo.indexOf("Macintosh")>=0,_E=(Zo.indexOf("Macintosh")>=0||Zo.indexOf("iPad")>=0||Zo.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,U0=Zo.indexOf("Linux")>=0,h4=(Zo==null?void 0:Zo.indexOf("Mobi"))>=0,mE=!0,f({key:"ensureLoaderPluginIsLoaded",comment:["{Locked}"]},"_"),Ib=mp,$0=Ib;else if(typeof Rn=="object"){Iv=Rn.platform==="win32",Ev=Rn.platform==="darwin",U0=Rn.platform==="linux",U0&&Rn.env.SNAP&&Rn.env.SNAP_REVISION,Rn.env.CI||Rn.env.BUILD_ARTIFACTSTAGINGDIRECTORY,Ib=mp,$0=mp;const o=Rn.env.VSCODE_NLS_CONFIG;if(o)try{const e=JSON.parse(o),t=e.availableLanguages["*"];Ib=e.locale,$0=t||mp,S6=e._translationsConfigFile}catch{}d4=!0}else console.error("Unable to resolve platform.");const Qi=Iv,Ke=Ev,hn=U0,ur=d4,Kc=mE,D6=mE&&typeof di.importScripts=="function",ga=_E,x6=h4,fa=Zo,k6=$0,I6=typeof di.postMessage=="function"&&!di.importScripts,u4=(()=>{if(I6){const o=[];di.addEventListener("message",t=>{if(t.data&&t.data.vscodeScheduleAsyncWork)for(let i=0,n=o.length;i{const i=++e;o.push({id:i,callback:t}),di.postMessage({vscodeScheduleAsyncWork:i},"*")}}return o=>setTimeout(o)})(),Ps=Ev||_E?2:Iv?1:3;let k2=!0,I2=!1;function g4(){if(!I2){I2=!0;const o=new Uint8Array(2);o[0]=1,o[1]=2,k2=new Uint16Array(o.buffer)[0]===512+1}return k2}const f4=!!(fa&&fa.indexOf("Chrome")>=0),E6=!!(fa&&fa.indexOf("Firefox")>=0),T6=!!(!f4&&fa&&fa.indexOf("Safari")>=0),N6=!!(fa&&fa.indexOf("Edg/")>=0);fa&&fa.indexOf("Android")>=0;var it;(function(o){function e(v){return v&&typeof v=="object"&&typeof v[Symbol.iterator]=="function"}o.is=e;const t=Object.freeze([]);function i(){return t}o.empty=i;function*n(v){yield v}o.single=n;function s(v){return e(v)?v:n(v)}o.wrap=s;function r(v){return v||t}o.from=r;function a(v){return!v||v[Symbol.iterator]().next().done===!0}o.isEmpty=a;function l(v){return v[Symbol.iterator]().next().value}o.first=l;function c(v,b){for(const C of v)if(b(C))return!0;return!1}o.some=c;function d(v,b){for(const C of v)if(b(C))return C}o.find=d;function*h(v,b){for(const C of v)b(C)&&(yield C)}o.filter=h;function*u(v,b){let C=0;for(const S of v)yield b(S,C++)}o.map=u;function*g(...v){for(const b of v)for(const C of b)yield C}o.concat=g;function p(v,b,C){let S=C;for(const x of v)S=b(S,x);return S}o.reduce=p;function*m(v,b,C=v.length){for(b<0&&(b+=v.length),C<0?C+=v.length:C>v.length&&(C=v.length);b{n||(n=!0,this._remove(i))}}shift(){if(this._first!==bi.Undefined){const e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last!==bi.Undefined){const e=this._last.element;return this._remove(this._last),e}}_remove(e){if(e.prev!==bi.Undefined&&e.next!==bi.Undefined){const t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===bi.Undefined&&e.next===bi.Undefined?(this._first=bi.Undefined,this._last=bi.Undefined):e.next===bi.Undefined?(this._last=this._last.prev,this._last.next=bi.Undefined):e.prev===bi.Undefined&&(this._first=this._first.next,this._first.prev=bi.Undefined);this._size-=1}*[Symbol.iterator](){let e=this._first;for(;e!==bi.Undefined;)yield e.element,e=e.next}}const p4="`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?";function M6(o=""){let e="(-?\\d*\\.\\d\\w*)|([^";for(const t of p4)o.indexOf(t)>=0||(e+="\\"+t);return e+="\\s]+)",new RegExp(e,"g")}const bE=M6();function m4(o){let e=bE;if(o&&o instanceof RegExp)if(o.global)e=o;else{let t="g";o.ignoreCase&&(t+="i"),o.multiline&&(t+="m"),o.unicode&&(t+="u"),e=new RegExp(o.source,t)}return e.lastIndex=0,e}const _4=new ln;_4.unshift({maxLen:1e3,windowSize:15,timeBudget:150});function _m(o,e,t,i,n){if(n||(n=it.first(_4)),t.length>n.maxLen){let c=o-n.maxLen/2;return c<0?c=0:i+=c,t=t.substring(c,o+n.maxLen/2),_m(o,e,t,i,n)}const s=Date.now(),r=o-1-i;let a=-1,l=null;for(let c=1;!(Date.now()-s>=n.timeBudget);c++){const d=r-n.windowSize*c;e.lastIndex=Math.max(0,d);const h=A6(e,t,r,a);if(!h&&l||(l=h,d<=0))break;a=d}if(l){const c={word:l[0],startColumn:i+1+l.index,endColumn:i+1+l.index+l[0].length};return e.lastIndex=0,c}return null}function A6(o,e,t,i){let n;for(;n=o.exec(e);){const s=n.index||0;if(s<=t&&o.lastIndex>=t)return n;if(i>0&&s>i)return null}return null}function Zs(o,e=0){return o[o.length-(1+e)]}function R6(o){if(o.length===0)throw new Error("Invalid tail call");return[o.slice(0,o.length-1),o[o.length-1]]}function Bn(o,e,t=(i,n)=>i===n){if(o===e)return!0;if(!o||!e||o.length!==e.length)return!1;for(let i=0,n=o.length;it(o[i],e))}function O6(o,e){let t=0,i=o-1;for(;t<=i;){const n=(t+i)/2|0,s=e(n);if(s<0)t=n+1;else if(s>0)i=n-1;else return n}return-(t+1)}function b4(o,e){let t=0,i=o.length;if(i===0)return 0;for(;t=e.length)throw new TypeError("invalid index");const i=e[Math.floor(e.length*Math.random())],n=[],s=[],r=[];for(const a of e){const l=t(a,i);l<0?n.push(a):l>0?s.push(a):r.push(a)}return o!!e)}function T2(o){let e=0;for(let t=0;t0}function Dc(o,e=t=>t){const t=new Set;return o.filter(i=>{const n=e(i);return t.has(n)?!1:(t.add(n),!0)})}function C4(o,e){const t=F6(o,e);if(t!==-1)return o[t]}function F6(o,e){for(let t=o.length-1;t>=0;t--){const i=o[t];if(e(i))return t}return-1}function w4(o,e){return o.length>0?o[0]:e}function Mn(o,e){let t=typeof e=="number"?o:0;typeof e=="number"?t=o:(t=0,e=o);const i=[];if(t<=e)for(let n=t;ne;n--)i.push(n);return i}function L1(o,e,t){const i=o.slice(0,e),n=o.slice(e);return i.concat(t,n)}function TS(o,e){const t=o.indexOf(e);t>-1&&(o.splice(t,1),o.unshift(e))}function Eb(o,e){const t=o.indexOf(e);t>-1&&(o.splice(t,1),o.push(e))}function N2(o,e){for(const t of e)o.push(t)}function vE(o){return Array.isArray(o)?o:[o]}function B6(o,e,t){const i=S4(o,e),n=o.length,s=t.length;o.length=n+s;for(let r=n-1;r>=i;r--)o[r+s]=o[r];for(let r=0;r0}o.isGreaterThan=t;function i(n){return n===0}o.isNeitherLessOrGreaterThan=i,o.greaterThan=1,o.lessThan=-1,o.neitherLessOrGreaterThan=0})(jL||(jL={}));function Vp(o,e){return(t,i)=>e(o(t),o(i))}const W6=(o,e)=>o-e;function y4(o,e){if(o.length===0)return;let t=o[0];for(let i=1;i0&&(t=n)}return t}function V6(o,e){if(o.length===0)return;let t=o[0];for(let i=1;i=0&&(t=n)}return t}function H6(o,e){return y4(o,(t,i)=>-e(t,i))}class Eg{constructor(e){this.items=e,this.firstIdx=0,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(e){let t=this.firstIdx;for(;t=0&&e(this.items[t]);)t--;const i=t===this.lastIdx?null:this.items.slice(t+1,this.lastIdx+1);return this.lastIdx=t,i}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){const e=this.items[this.firstIdx];return this.firstIdx++,e}takeCount(e){const t=this.items.slice(this.firstIdx,this.firstIdx+e);return this.firstIdx+=e,t}}class aa{constructor(e){this.iterate=e}toArray(){const e=[];return this.iterate(t=>(e.push(t),!0)),e}filter(e){return new aa(t=>this.iterate(i=>e(i)?t(i):!0))}map(e){return new aa(t=>this.iterate(i=>t(e(i))))}findLast(e){let t;return this.iterate(i=>(e(i)&&(t=i),!0)),t}findLastMaxBy(e){let t,i=!0;return this.iterate(n=>((i||jL.isGreaterThan(e(n,t)))&&(i=!1,t=n),!0)),t}}aa.empty=new aa(o=>{});function Wn(o){return typeof o=="string"}function Xn(o){return typeof o=="object"&&o!==null&&!Array.isArray(o)&&!(o instanceof RegExp)&&!(o instanceof Date)}function z6(o){const e=Object.getPrototypeOf(Uint8Array);return typeof o=="object"&&o instanceof e}function xc(o){return typeof o=="number"&&!isNaN(o)}function A2(o){return!!o&&typeof o[Symbol.iterator]=="function"}function L4(o){return o===!0||o===!1}function us(o){return typeof o>"u"}function U6(o){return!Ms(o)}function Ms(o){return us(o)||o===null}function _t(o,e){if(!o)throw new Error(e?`Unexpected type, expected '${e}'`:"Unexpected type")}function Fu(o){if(Ms(o))throw new Error("Assertion Failed: argument is undefined or null");return o}function Tv(o){return typeof o=="function"}function $6(o,e){const t=Math.min(o.length,e.length);for(let i=0;i{e[t]=i&&typeof i=="object"?qa(i):i}),e}function K6(o){if(!o||typeof o!="object")return o;const e=[o];for(;e.length>0;){const t=e.shift();Object.freeze(t);for(const i in t)if(D4.call(t,i)){const n=t[i];typeof n=="object"&&!Object.isFrozen(n)&&!z6(n)&&e.push(n)}}return o}const D4=Object.prototype.hasOwnProperty;function x4(o,e){return KL(o,e,new Set)}function KL(o,e,t){if(Ms(o))return o;const i=e(o);if(typeof i<"u")return i;if(Array.isArray(o)){const n=[];for(const s of o)n.push(KL(s,e,t));return n}if(Xn(o)){if(t.has(o))throw new Error("Cannot clone recursive data-structure");t.add(o);const n={};for(const s in o)D4.call(o,s)&&(n[s]=KL(o[s],e,t));return t.delete(o),n}return o}function B_(o,e,t=!0){return Xn(o)?(Xn(e)&&Object.keys(e).forEach(i=>{i in o?t&&(Xn(o[i])&&Xn(e[i])?B_(o[i],e[i],t):o[i]=e[i]):o[i]=e[i]}),o):e}function so(o,e){if(o===e)return!0;if(o==null||e===null||e===void 0||typeof o!=typeof e||typeof o!="object"||Array.isArray(o)!==Array.isArray(e))return!1;let t,i;if(Array.isArray(o)){if(o.length!==e.length)return!1;for(t=0;tfunction(){const s=Array.prototype.slice.call(arguments,0);return e(n,s)},i={};for(const n of o)i[n]=t(n);return i}const _n={tabSize:4,indentSize:4,insertSpaces:!0,detectIndentation:!0,trimAutoWhitespace:!0,largeFileOptimizations:!0,bracketPairColorizationOptions:{enabled:!0,independentColorPoolPerBracketType:!1}},Vl=8;class k4{constructor(e){this._values=e}hasChanged(e){return this._values[e]}}class I4{constructor(){this.stableMinimapLayoutInput=null,this.stableFitMaxMinimapScale=0,this.stableFitRemainingWidth=0}}class Jt{constructor(e,t,i,n){this.id=e,this.name=t,this.defaultValue=i,this.schema=n}applyUpdate(e,t){return D1(e,t)}compute(e,t,i){return i}}class Hp{constructor(e,t){this.newValue=e,this.didChange=t}}function D1(o,e){if(typeof o!="object"||typeof e!="object"||!o||!e)return new Hp(e,o!==e);if(Array.isArray(o)||Array.isArray(e)){const i=Array.isArray(o)&&Array.isArray(e)&&Bn(o,e);return new Hp(e,!i)}let t=!1;for(const i in e)if(e.hasOwnProperty(i)){const n=D1(o[i],e[i]);n.didChange&&(o[i]=n.newValue,t=!0)}return new Hp(o,t)}class _f{constructor(e){this.schema=void 0,this.id=e,this.name="_never_",this.defaultValue=void 0}applyUpdate(e,t){return D1(e,t)}validate(e){return this.defaultValue}}class bf{constructor(e,t,i,n){this.id=e,this.name=t,this.defaultValue=i,this.schema=n}applyUpdate(e,t){return D1(e,t)}validate(e){return typeof e>"u"?this.defaultValue:e}compute(e,t,i){return i}}function Le(o,e){return typeof o>"u"?e:o==="false"?!1:!!o}class ct extends bf{constructor(e,t,i,n=void 0){typeof n<"u"&&(n.type="boolean",n.default=i),super(e,t,i,n)}validate(e){return Le(e,this.defaultValue)}}function qL(o,e,t,i){if(typeof o>"u")return e;let n=parseInt(o,10);return isNaN(n)?e:(n=Math.max(t,n),n=Math.min(i,n),n|0)}class Lt extends bf{static clampedInt(e,t,i,n){return qL(e,t,i,n)}constructor(e,t,i,n,s,r=void 0){typeof r<"u"&&(r.type="integer",r.default=i,r.minimum=n,r.maximum=s),super(e,t,i,r),this.minimum=n,this.maximum=s}validate(e){return Lt.clampedInt(e,this.defaultValue,this.minimum,this.maximum)}}class Xr extends bf{static clamp(e,t,i){return ei?i:e}static float(e,t){if(typeof e=="number")return e;if(typeof e>"u")return t;const i=parseFloat(e);return isNaN(i)?t:i}constructor(e,t,i,n,s){typeof s<"u"&&(s.type="number",s.default=i),super(e,t,i,s),this.validationFn=n}validate(e){return this.validationFn(Xr.float(e,this.defaultValue))}}class ds extends bf{static string(e,t){return typeof e!="string"?t:e}constructor(e,t,i,n=void 0){typeof n<"u"&&(n.type="string",n.default=i),super(e,t,i,n)}validate(e){return ds.string(e,this.defaultValue)}}function Di(o,e,t){return typeof o!="string"||t.indexOf(o)===-1?e:o}class ai extends bf{constructor(e,t,i,n,s=void 0){typeof s<"u"&&(s.type="string",s.enum=n,s.default=i),super(e,t,i,s),this._allowedValues=n}validate(e){return Di(e,this.defaultValue,this._allowedValues)}}class Tb extends Jt{constructor(e,t,i,n,s,r,a=void 0){typeof a<"u"&&(a.type="string",a.enum=s,a.default=n),super(e,t,i,a),this._allowedValues=s,this._convert=r}validate(e){return typeof e!="string"?this.defaultValue:this._allowedValues.indexOf(e)===-1?this.defaultValue:this._convert(e)}}function Z6(o){switch(o){case"none":return 0;case"keep":return 1;case"brackets":return 2;case"advanced":return 3;case"full":return 4}}class Y6 extends Jt{constructor(){super(2,"accessibilitySupport",0,{type:"string",enum:["auto","on","off"],enumDescriptions:[f("accessibilitySupport.auto","Use platform APIs to detect when a Screen Reader is attached"),f("accessibilitySupport.on","Optimize for usage with a Screen Reader"),f("accessibilitySupport.off","Assume a screen reader is not attached")],default:"auto",tags:["accessibility"],description:f("accessibilitySupport","Controls if the UI should run in a mode where it is optimized for screen readers.")})}validate(e){switch(e){case"auto":return 0;case"off":return 1;case"on":return 2}return this.defaultValue}compute(e,t,i){return i===0?e.accessibilitySupport:i}}class Q6 extends Jt{constructor(){const e={insertSpace:!0,ignoreEmptyLines:!0};super(20,"comments",e,{"editor.comments.insertSpace":{type:"boolean",default:e.insertSpace,description:f("comments.insertSpace","Controls whether a space character is inserted when commenting.")},"editor.comments.ignoreEmptyLines":{type:"boolean",default:e.ignoreEmptyLines,description:f("comments.ignoreEmptyLines","Controls if empty lines should be ignored with toggle, add or remove actions for line comments.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{insertSpace:Le(t.insertSpace,this.defaultValue.insertSpace),ignoreEmptyLines:Le(t.ignoreEmptyLines,this.defaultValue.ignoreEmptyLines)}}}function X6(o){switch(o){case"blink":return 1;case"smooth":return 2;case"phase":return 3;case"expand":return 4;case"solid":return 5}}var Gi;(function(o){o[o.Line=1]="Line",o[o.Block=2]="Block",o[o.Underline=3]="Underline",o[o.LineThin=4]="LineThin",o[o.BlockOutline=5]="BlockOutline",o[o.UnderlineThin=6]="UnderlineThin"})(Gi||(Gi={}));function J6(o){switch(o){case"line":return Gi.Line;case"block":return Gi.Block;case"underline":return Gi.Underline;case"line-thin":return Gi.LineThin;case"block-outline":return Gi.BlockOutline;case"underline-thin":return Gi.UnderlineThin}}class eW extends _f{constructor(){super(135)}compute(e,t,i){const n=["monaco-editor"];return t.get(36)&&n.push(t.get(36)),e.extraEditorClassName&&n.push(e.extraEditorClassName),t.get(70)==="default"?n.push("mouse-default"):t.get(70)==="copy"&&n.push("mouse-copy"),t.get(105)&&n.push("showUnused"),t.get(133)&&n.push("showDeprecated"),n.join(" ")}}class tW extends ct{constructor(){super(34,"emptySelectionClipboard",!0,{description:f("emptySelectionClipboard","Controls whether copying without a selection copies the current line.")})}compute(e,t,i){return i&&e.emptySelectionClipboard}}class iW extends Jt{constructor(){const e={cursorMoveOnType:!0,seedSearchStringFromSelection:"always",autoFindInSelection:"never",globalFindClipboard:!1,addExtraSpaceOnTop:!0,loop:!0};super(38,"find",e,{"editor.find.cursorMoveOnType":{type:"boolean",default:e.cursorMoveOnType,description:f("find.cursorMoveOnType","Controls whether the cursor should jump to find matches while typing.")},"editor.find.seedSearchStringFromSelection":{type:"string",enum:["never","always","selection"],default:e.seedSearchStringFromSelection,enumDescriptions:[f("editor.find.seedSearchStringFromSelection.never","Never seed search string from the editor selection."),f("editor.find.seedSearchStringFromSelection.always","Always seed search string from the editor selection, including word at cursor position."),f("editor.find.seedSearchStringFromSelection.selection","Only seed search string from the editor selection.")],description:f("find.seedSearchStringFromSelection","Controls whether the search string in the Find Widget is seeded from the editor selection.")},"editor.find.autoFindInSelection":{type:"string",enum:["never","always","multiline"],default:e.autoFindInSelection,enumDescriptions:[f("editor.find.autoFindInSelection.never","Never turn on Find in Selection automatically (default)."),f("editor.find.autoFindInSelection.always","Always turn on Find in Selection automatically."),f("editor.find.autoFindInSelection.multiline","Turn on Find in Selection automatically when multiple lines of content are selected.")],description:f("find.autoFindInSelection","Controls the condition for turning on Find in Selection automatically.")},"editor.find.globalFindClipboard":{type:"boolean",default:e.globalFindClipboard,description:f("find.globalFindClipboard","Controls whether the Find Widget should read or modify the shared find clipboard on macOS."),included:Ke},"editor.find.addExtraSpaceOnTop":{type:"boolean",default:e.addExtraSpaceOnTop,description:f("find.addExtraSpaceOnTop","Controls whether the Find Widget should add extra lines on top of the editor. When true, you can scroll beyond the first line when the Find Widget is visible.")},"editor.find.loop":{type:"boolean",default:e.loop,description:f("find.loop","Controls whether the search automatically restarts from the beginning (or the end) when no further matches can be found.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{cursorMoveOnType:Le(t.cursorMoveOnType,this.defaultValue.cursorMoveOnType),seedSearchStringFromSelection:typeof e.seedSearchStringFromSelection=="boolean"?e.seedSearchStringFromSelection?"always":"never":Di(t.seedSearchStringFromSelection,this.defaultValue.seedSearchStringFromSelection,["never","always","selection"]),autoFindInSelection:typeof e.autoFindInSelection=="boolean"?e.autoFindInSelection?"always":"never":Di(t.autoFindInSelection,this.defaultValue.autoFindInSelection,["never","always","multiline"]),globalFindClipboard:Le(t.globalFindClipboard,this.defaultValue.globalFindClipboard),addExtraSpaceOnTop:Le(t.addExtraSpaceOnTop,this.defaultValue.addExtraSpaceOnTop),loop:Le(t.loop,this.defaultValue.loop)}}}class As extends Jt{constructor(){super(48,"fontLigatures",As.OFF,{anyOf:[{type:"boolean",description:f("fontLigatures","Enables/Disables font ligatures ('calt' and 'liga' font features). Change this to a string for fine-grained control of the 'font-feature-settings' CSS property.")},{type:"string",description:f("fontFeatureSettings","Explicit 'font-feature-settings' CSS property. A boolean can be passed instead if one only needs to turn on/off ligatures.")}],description:f("fontLigaturesGeneral","Configures font ligatures or font features. Can be either a boolean to enable/disable ligatures or a string for the value of the CSS 'font-feature-settings' property."),default:!1})}validate(e){return typeof e>"u"?this.defaultValue:typeof e=="string"?e==="false"?As.OFF:e==="true"?As.ON:e:e?As.ON:As.OFF}}As.OFF='"liga" off, "calt" off';As.ON='"liga" on, "calt" on';class or extends Jt{constructor(){super(51,"fontVariations",or.OFF,{anyOf:[{type:"boolean",description:f("fontVariations","Enables/Disables the translation from font-weight to font-variation-settings. Change this to a string for fine-grained control of the 'font-variation-settings' CSS property.")},{type:"string",description:f("fontVariationSettings","Explicit 'font-variation-settings' CSS property. A boolean can be passed instead if one only needs to translate font-weight to font-variation-settings.")}],description:f("fontVariationsGeneral","Configures font variations. Can be either a boolean to enable/disable the translation from font-weight to font-variation-settings or a string for the value of the CSS 'font-variation-settings' property."),default:!1})}validate(e){return typeof e>"u"?this.defaultValue:typeof e=="string"?e==="false"?or.OFF:e==="true"?or.TRANSLATE:e:e?or.TRANSLATE:or.OFF}compute(e,t,i){return e.fontInfo.fontVariationSettings}}or.OFF="normal";or.TRANSLATE="translate";class nW extends _f{constructor(){super(47)}compute(e,t,i){return e.fontInfo}}class sW extends bf{constructor(){super(49,"fontSize",ps.fontSize,{type:"number",minimum:6,maximum:100,default:ps.fontSize,description:f("fontSize","Controls the font size in pixels.")})}validate(e){const t=Xr.float(e,this.defaultValue);return t===0?ps.fontSize:Xr.clamp(t,6,100)}compute(e,t,i){return e.fontInfo.fontSize}}class Ur extends Jt{constructor(){super(50,"fontWeight",ps.fontWeight,{anyOf:[{type:"number",minimum:Ur.MINIMUM_VALUE,maximum:Ur.MAXIMUM_VALUE,errorMessage:f("fontWeightErrorMessage",'Only "normal" and "bold" keywords or numbers between 1 and 1000 are allowed.')},{type:"string",pattern:"^(normal|bold|1000|[1-9][0-9]{0,2})$"},{enum:Ur.SUGGESTION_VALUES}],default:ps.fontWeight,description:f("fontWeight",'Controls the font weight. Accepts "normal" and "bold" keywords or numbers between 1 and 1000.')})}validate(e){return e==="normal"||e==="bold"?e:String(Lt.clampedInt(e,ps.fontWeight,Ur.MINIMUM_VALUE,Ur.MAXIMUM_VALUE))}}Ur.SUGGESTION_VALUES=["normal","bold","100","200","300","400","500","600","700","800","900"];Ur.MINIMUM_VALUE=1;Ur.MAXIMUM_VALUE=1e3;class oW extends Jt{constructor(){const e={multiple:"peek",multipleDefinitions:"peek",multipleTypeDefinitions:"peek",multipleDeclarations:"peek",multipleImplementations:"peek",multipleReferences:"peek",alternativeDefinitionCommand:"editor.action.goToReferences",alternativeTypeDefinitionCommand:"editor.action.goToReferences",alternativeDeclarationCommand:"editor.action.goToReferences",alternativeImplementationCommand:"",alternativeReferenceCommand:""},t={type:"string",enum:["peek","gotoAndPeek","goto"],default:e.multiple,enumDescriptions:[f("editor.gotoLocation.multiple.peek","Show Peek view of the results (default)"),f("editor.gotoLocation.multiple.gotoAndPeek","Go to the primary result and show a Peek view"),f("editor.gotoLocation.multiple.goto","Go to the primary result and enable Peek-less navigation to others")]},i=["","editor.action.referenceSearch.trigger","editor.action.goToReferences","editor.action.peekImplementation","editor.action.goToImplementation","editor.action.peekTypeDefinition","editor.action.goToTypeDefinition","editor.action.peekDeclaration","editor.action.revealDeclaration","editor.action.peekDefinition","editor.action.revealDefinitionAside","editor.action.revealDefinition"];super(55,"gotoLocation",e,{"editor.gotoLocation.multiple":{deprecationMessage:f("editor.gotoLocation.multiple.deprecated","This setting is deprecated, please use separate settings like 'editor.editor.gotoLocation.multipleDefinitions' or 'editor.editor.gotoLocation.multipleImplementations' instead.")},"editor.gotoLocation.multipleDefinitions":Object.assign({description:f("editor.editor.gotoLocation.multipleDefinitions","Controls the behavior the 'Go to Definition'-command when multiple target locations exist.")},t),"editor.gotoLocation.multipleTypeDefinitions":Object.assign({description:f("editor.editor.gotoLocation.multipleTypeDefinitions","Controls the behavior the 'Go to Type Definition'-command when multiple target locations exist.")},t),"editor.gotoLocation.multipleDeclarations":Object.assign({description:f("editor.editor.gotoLocation.multipleDeclarations","Controls the behavior the 'Go to Declaration'-command when multiple target locations exist.")},t),"editor.gotoLocation.multipleImplementations":Object.assign({description:f("editor.editor.gotoLocation.multipleImplemenattions","Controls the behavior the 'Go to Implementations'-command when multiple target locations exist.")},t),"editor.gotoLocation.multipleReferences":Object.assign({description:f("editor.editor.gotoLocation.multipleReferences","Controls the behavior the 'Go to References'-command when multiple target locations exist.")},t),"editor.gotoLocation.alternativeDefinitionCommand":{type:"string",default:e.alternativeDefinitionCommand,enum:i,description:f("alternativeDefinitionCommand","Alternative command id that is being executed when the result of 'Go to Definition' is the current location.")},"editor.gotoLocation.alternativeTypeDefinitionCommand":{type:"string",default:e.alternativeTypeDefinitionCommand,enum:i,description:f("alternativeTypeDefinitionCommand","Alternative command id that is being executed when the result of 'Go to Type Definition' is the current location.")},"editor.gotoLocation.alternativeDeclarationCommand":{type:"string",default:e.alternativeDeclarationCommand,enum:i,description:f("alternativeDeclarationCommand","Alternative command id that is being executed when the result of 'Go to Declaration' is the current location.")},"editor.gotoLocation.alternativeImplementationCommand":{type:"string",default:e.alternativeImplementationCommand,enum:i,description:f("alternativeImplementationCommand","Alternative command id that is being executed when the result of 'Go to Implementation' is the current location.")},"editor.gotoLocation.alternativeReferenceCommand":{type:"string",default:e.alternativeReferenceCommand,enum:i,description:f("alternativeReferenceCommand","Alternative command id that is being executed when the result of 'Go to Reference' is the current location.")}})}validate(e){var t,i,n,s,r;if(!e||typeof e!="object")return this.defaultValue;const a=e;return{multiple:Di(a.multiple,this.defaultValue.multiple,["peek","gotoAndPeek","goto"]),multipleDefinitions:(t=a.multipleDefinitions)!==null&&t!==void 0?t:Di(a.multipleDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleTypeDefinitions:(i=a.multipleTypeDefinitions)!==null&&i!==void 0?i:Di(a.multipleTypeDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleDeclarations:(n=a.multipleDeclarations)!==null&&n!==void 0?n:Di(a.multipleDeclarations,"peek",["peek","gotoAndPeek","goto"]),multipleImplementations:(s=a.multipleImplementations)!==null&&s!==void 0?s:Di(a.multipleImplementations,"peek",["peek","gotoAndPeek","goto"]),multipleReferences:(r=a.multipleReferences)!==null&&r!==void 0?r:Di(a.multipleReferences,"peek",["peek","gotoAndPeek","goto"]),alternativeDefinitionCommand:ds.string(a.alternativeDefinitionCommand,this.defaultValue.alternativeDefinitionCommand),alternativeTypeDefinitionCommand:ds.string(a.alternativeTypeDefinitionCommand,this.defaultValue.alternativeTypeDefinitionCommand),alternativeDeclarationCommand:ds.string(a.alternativeDeclarationCommand,this.defaultValue.alternativeDeclarationCommand),alternativeImplementationCommand:ds.string(a.alternativeImplementationCommand,this.defaultValue.alternativeImplementationCommand),alternativeReferenceCommand:ds.string(a.alternativeReferenceCommand,this.defaultValue.alternativeReferenceCommand)}}}class rW extends Jt{constructor(){const e={enabled:!0,delay:300,sticky:!0,above:!0};super(57,"hover",e,{"editor.hover.enabled":{type:"boolean",default:e.enabled,description:f("hover.enabled","Controls whether the hover is shown.")},"editor.hover.delay":{type:"number",default:e.delay,minimum:0,maximum:1e4,description:f("hover.delay","Controls the delay in milliseconds after which the hover is shown.")},"editor.hover.sticky":{type:"boolean",default:e.sticky,description:f("hover.sticky","Controls whether the hover should remain visible when mouse is moved over it.")},"editor.hover.above":{type:"boolean",default:e.above,description:f("hover.above","Prefer showing hovers above the line, if there's space.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{enabled:Le(t.enabled,this.defaultValue.enabled),delay:Lt.clampedInt(t.delay,this.defaultValue.delay,0,1e4),sticky:Le(t.sticky,this.defaultValue.sticky),above:Le(t.above,this.defaultValue.above)}}}class ag extends _f{constructor(){super(138)}compute(e,t,i){return ag.computeLayout(t,{memory:e.memory,outerWidth:e.outerWidth,outerHeight:e.outerHeight,isDominatedByLongLines:e.isDominatedByLongLines,lineHeight:e.fontInfo.lineHeight,viewLineCount:e.viewLineCount,lineNumbersDigitCount:e.lineNumbersDigitCount,typicalHalfwidthCharacterWidth:e.fontInfo.typicalHalfwidthCharacterWidth,maxDigitWidth:e.fontInfo.maxDigitWidth,pixelRatio:e.pixelRatio})}static computeContainedMinimapLineCount(e){const t=e.height/e.lineHeight,i=Math.floor(e.paddingTop/e.lineHeight);let n=Math.floor(e.paddingBottom/e.lineHeight);e.scrollBeyondLastLine&&(n=Math.max(n,t-1));const s=(i+e.viewLineCount+n)/(e.pixelRatio*e.height),r=Math.floor(e.viewLineCount/s);return{typicalViewportLineCount:t,extraLinesBeforeFirstLine:i,extraLinesBeyondLastLine:n,desiredRatio:s,minimapLineCount:r}}static _computeMinimapLayout(e,t){const i=e.outerWidth,n=e.outerHeight,s=e.pixelRatio;if(!e.minimap.enabled)return{renderMinimap:0,minimapLeft:0,minimapWidth:0,minimapHeightIsEditorHeight:!1,minimapIsSampling:!1,minimapScale:1,minimapLineHeight:1,minimapCanvasInnerWidth:0,minimapCanvasInnerHeight:Math.floor(s*n),minimapCanvasOuterWidth:0,minimapCanvasOuterHeight:n};const r=t.stableMinimapLayoutInput,a=r&&e.outerHeight===r.outerHeight&&e.lineHeight===r.lineHeight&&e.typicalHalfwidthCharacterWidth===r.typicalHalfwidthCharacterWidth&&e.pixelRatio===r.pixelRatio&&e.scrollBeyondLastLine===r.scrollBeyondLastLine&&e.paddingTop===r.paddingTop&&e.paddingBottom===r.paddingBottom&&e.minimap.enabled===r.minimap.enabled&&e.minimap.side===r.minimap.side&&e.minimap.size===r.minimap.size&&e.minimap.showSlider===r.minimap.showSlider&&e.minimap.renderCharacters===r.minimap.renderCharacters&&e.minimap.maxColumn===r.minimap.maxColumn&&e.minimap.scale===r.minimap.scale&&e.verticalScrollbarWidth===r.verticalScrollbarWidth&&e.isViewportWrapping===r.isViewportWrapping,l=e.lineHeight,c=e.typicalHalfwidthCharacterWidth,d=e.scrollBeyondLastLine,h=e.minimap.renderCharacters;let u=s>=2?Math.round(e.minimap.scale*2):e.minimap.scale;const g=e.minimap.maxColumn,p=e.minimap.size,m=e.minimap.side,_=e.verticalScrollbarWidth,v=e.viewLineCount,b=e.remainingWidth,C=e.isViewportWrapping,S=h?2:3;let x=Math.floor(s*n);const E=x/s;let L=!1,D=!1,k=S*u,R=u/s,P=1;if(p==="fill"||p==="fit"){const{typicalViewportLineCount:je,extraLinesBeforeFirstLine:Ie,extraLinesBeyondLastLine:Qe,desiredRatio:Xe,minimapLineCount:fe}=ag.computeContainedMinimapLineCount({viewLineCount:v,scrollBeyondLastLine:d,paddingTop:e.paddingTop,paddingBottom:e.paddingBottom,height:n,lineHeight:l,pixelRatio:s});if(v/fe>1)L=!0,D=!0,u=1,k=1,R=u/s;else{let yt=!1,ws=u+1;if(p==="fit"){const zi=Math.ceil((Ie+v+Qe)*k);C&&a&&b<=t.stableFitRemainingWidth?(yt=!0,ws=t.stableFitMaxMinimapScale):yt=zi>x}if(p==="fill"||yt){L=!0;const zi=u;k=Math.min(l*s,Math.max(1,Math.floor(1/Xe))),C&&a&&b<=t.stableFitRemainingWidth&&(ws=t.stableFitMaxMinimapScale),u=Math.min(ws,Math.max(1,Math.floor(k/S))),u>zi&&(P=Math.min(2,u/zi)),R=u/s/P,x=Math.ceil(Math.max(je,Ie+v+Qe)*k),C?(t.stableMinimapLayoutInput=e,t.stableFitRemainingWidth=b,t.stableFitMaxMinimapScale=u):(t.stableMinimapLayoutInput=null,t.stableFitRemainingWidth=0)}}}const B=Math.floor(g*R),z=Math.min(B,Math.max(0,Math.floor((b-_-2)*R/(c+R)))+Vl);let ne=Math.floor(s*z);const ue=ne/s;ne=Math.floor(ne*P);const ye=h?1:2,Fe=m==="left"?0:i-z-_;return{renderMinimap:ye,minimapLeft:Fe,minimapWidth:z,minimapHeightIsEditorHeight:L,minimapIsSampling:D,minimapScale:u,minimapLineHeight:k,minimapCanvasInnerWidth:ne,minimapCanvasInnerHeight:x,minimapCanvasOuterWidth:ue,minimapCanvasOuterHeight:E}}static computeLayout(e,t){const i=t.outerWidth|0,n=t.outerHeight|0,s=t.lineHeight|0,r=t.lineNumbersDigitCount|0,a=t.typicalHalfwidthCharacterWidth,l=t.maxDigitWidth,c=t.pixelRatio,d=t.viewLineCount,h=e.get(130),u=h==="inherit"?e.get(129):h,g=u==="inherit"?e.get(125):u,p=e.get(128),m=t.isDominatedByLongLines,_=e.get(54),v=e.get(64).renderType!==0,b=e.get(65),C=e.get(99),S=e.get(80),x=e.get(69),E=e.get(97),L=E.verticalScrollbarSize,D=E.verticalHasArrows,k=E.arrowSize,R=E.horizontalScrollbarSize,P=e.get(40),B=e.get(104)!=="never";let z=e.get(62);P&&B&&(z+=16);let ne=0;if(v){const El=Math.max(r,b);ne=Math.round(El*l)}let ue=0;_&&(ue=s);let ye=0,Fe=ye+ue,je=Fe+ne,Ie=je+z;const Qe=i-ue-ne-z;let Xe=!1,fe=!1,Se=-1;u==="inherit"&&m?(Xe=!0,fe=!0):g==="on"||g==="bounded"?fe=!0:g==="wordWrapColumn"&&(Se=p);const yt=ag._computeMinimapLayout({outerWidth:i,outerHeight:n,lineHeight:s,typicalHalfwidthCharacterWidth:a,pixelRatio:c,scrollBeyondLastLine:C,paddingTop:S.top,paddingBottom:S.bottom,minimap:x,verticalScrollbarWidth:L,viewLineCount:d,remainingWidth:Qe,isViewportWrapping:fe},t.memory||new I4);yt.renderMinimap!==0&&yt.minimapLeft===0&&(ye+=yt.minimapWidth,Fe+=yt.minimapWidth,je+=yt.minimapWidth,Ie+=yt.minimapWidth);const ws=Qe-yt.minimapWidth,zi=Math.max(1,Math.floor((ws-L-2)/a)),Ko=D?k:0;return fe&&(Se=Math.max(1,zi),g==="bounded"&&(Se=Math.min(Se,p))),{width:i,height:n,glyphMarginLeft:ye,glyphMarginWidth:ue,lineNumbersLeft:Fe,lineNumbersWidth:ne,decorationsLeft:je,decorationsWidth:z,contentLeft:Ie,contentWidth:ws,minimap:yt,viewportColumn:zi,isWordWrapMinified:Xe,isViewportWrapping:fe,wrappingColumn:Se,verticalScrollbarWidth:L,horizontalScrollbarHeight:R,overviewRuler:{top:Ko,width:L,height:n-2*Ko,right:0}}}}class aW extends Jt{constructor(){super(132,"wrappingStrategy","simple",{"editor.wrappingStrategy":{enumDescriptions:[f("wrappingStrategy.simple","Assumes that all characters are of the same width. This is a fast algorithm that works correctly for monospace fonts and certain scripts (like Latin characters) where glyphs are of equal width."),f("wrappingStrategy.advanced","Delegates wrapping points computation to the browser. This is a slow algorithm, that might cause freezes for large files, but it works correctly in all cases.")],type:"string",enum:["simple","advanced"],default:"simple",description:f("wrappingStrategy","Controls the algorithm that computes wrapping points. Note that when in accessibility mode, advanced will be used for the best experience.")}})}validate(e){return Di(e,"simple",["simple","advanced"])}compute(e,t,i){return t.get(2)===2?"advanced":i}}class lW extends Jt{constructor(){const e={enabled:!0};super(61,"lightbulb",e,{"editor.lightbulb.enabled":{type:"boolean",default:e.enabled,description:f("codeActions","Enables the Code Action lightbulb in the editor.")}})}validate(e){return!e||typeof e!="object"?this.defaultValue:{enabled:Le(e.enabled,this.defaultValue.enabled)}}}class cW extends Jt{constructor(){const e={enabled:!1,maxLineCount:5};super(109,"stickyScroll",e,{"editor.stickyScroll.enabled":{type:"boolean",default:e.enabled,description:f("editor.stickyScroll","Shows the nested current scopes during the scroll at the top of the editor.")},"editor.stickyScroll.maxLineCount":{type:"number",default:e.maxLineCount,minimum:1,maximum:10,description:f("editor.stickyScroll.","Defines the maximum number of sticky lines to show.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{enabled:Le(t.enabled,this.defaultValue.enabled),maxLineCount:Lt.clampedInt(t.maxLineCount,this.defaultValue.maxLineCount,1,10)}}}class dW extends Jt{constructor(){const e={enabled:"on",fontSize:0,fontFamily:"",padding:!1};super(134,"inlayHints",e,{"editor.inlayHints.enabled":{type:"string",default:e.enabled,description:f("inlayHints.enable","Enables the inlay hints in the editor."),enum:["on","onUnlessPressed","offUnlessPressed","off"],markdownEnumDescriptions:[f("editor.inlayHints.on","Inlay hints are enabled"),f("editor.inlayHints.onUnlessPressed","Inlay hints are showing by default and hide when holding {0}",Ke?"Ctrl+Option":"Ctrl+Alt"),f("editor.inlayHints.offUnlessPressed","Inlay hints are hidden by default and show when holding {0}",Ke?"Ctrl+Option":"Ctrl+Alt"),f("editor.inlayHints.off","Inlay hints are disabled")]},"editor.inlayHints.fontSize":{type:"number",default:e.fontSize,markdownDescription:f("inlayHints.fontSize","Controls font size of inlay hints in the editor. As default the {0} is used when the configured value is less than {1} or greater than the editor font size.","`#editor.fontSize#`","`5`")},"editor.inlayHints.fontFamily":{type:"string",default:e.fontFamily,markdownDescription:f("inlayHints.fontFamily","Controls font family of inlay hints in the editor. When set to empty, the {0} is used.","`#editor.fontFamily#`")},"editor.inlayHints.padding":{type:"boolean",default:e.padding,description:f("inlayHints.padding","Enables the padding around the inlay hints in the editor.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return typeof t.enabled=="boolean"&&(t.enabled=t.enabled?"on":"off"),{enabled:Di(t.enabled,this.defaultValue.enabled,["on","off","offUnlessPressed","onUnlessPressed"]),fontSize:Lt.clampedInt(t.fontSize,this.defaultValue.fontSize,0,100),fontFamily:ds.string(t.fontFamily,this.defaultValue.fontFamily),padding:Le(t.padding,this.defaultValue.padding)}}}class hW extends Jt{constructor(){super(62,"lineDecorationsWidth",10)}validate(e){return typeof e=="string"&&/^\d+(\.\d+)?ch$/.test(e)?-parseFloat(e.substring(0,e.length-2)):Lt.clampedInt(e,this.defaultValue,0,1e3)}compute(e,t,i){return i<0?Lt.clampedInt(-i*e.fontInfo.typicalHalfwidthCharacterWidth,this.defaultValue,0,1e3):i}}class uW extends Xr{constructor(){super(63,"lineHeight",ps.lineHeight,e=>Xr.clamp(e,0,150),{markdownDescription:f("lineHeight",`Controls the line height.
+var c6=Object.defineProperty;var d6=(o,e,t)=>e in o?c6(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var Zt=(o,e,t)=>(d6(o,typeof e!="symbol"?e+"":e,t),t);import{bW as me,d as h6,bX as u6,aC as g6,bK as f6,r as p6,O as D2,w as kb,P as x2,Q as m6,o as _6,c as b6,bI as v6}from"./index-82e633ff.js";globalThis&&globalThis.__awaiter;let C6=typeof document<"u"&&document.location&&document.location.hash.indexOf("pseudo=true")>=0;function w6(o,e){let t;return e.length===0?t=o:t=o.replace(/\{(\d+)\}/g,(i,n)=>{const s=n[0],r=e[s];let a=i;return typeof r=="string"?a=r:(typeof r=="number"||typeof r=="boolean"||r===void 0||r===null)&&(a=String(r)),a}),C6&&(t="["+t.replace(/[aouei]/g,"$&$&")+"]"),t}function f(o,e,...t){return w6(e,t)}var ES;const mp="en";let Iv=!1,Ev=!1,U0=!1,d4=!1,mE=!1,_E=!1,h4=!1,Ib,$0=mp,S6,Zo;const di=typeof self=="object"?self:typeof global=="object"?global:{};let Rn;typeof di.vscode<"u"&&typeof di.vscode.process<"u"?Rn=di.vscode.process:typeof process<"u"&&(Rn=process);const y6=typeof((ES=Rn==null?void 0:Rn.versions)===null||ES===void 0?void 0:ES.electron)=="string",L6=y6&&(Rn==null?void 0:Rn.type)==="renderer";if(typeof navigator=="object"&&!L6)Zo=navigator.userAgent,Iv=Zo.indexOf("Windows")>=0,Ev=Zo.indexOf("Macintosh")>=0,_E=(Zo.indexOf("Macintosh")>=0||Zo.indexOf("iPad")>=0||Zo.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,U0=Zo.indexOf("Linux")>=0,h4=(Zo==null?void 0:Zo.indexOf("Mobi"))>=0,mE=!0,f({key:"ensureLoaderPluginIsLoaded",comment:["{Locked}"]},"_"),Ib=mp,$0=Ib;else if(typeof Rn=="object"){Iv=Rn.platform==="win32",Ev=Rn.platform==="darwin",U0=Rn.platform==="linux",U0&&Rn.env.SNAP&&Rn.env.SNAP_REVISION,Rn.env.CI||Rn.env.BUILD_ARTIFACTSTAGINGDIRECTORY,Ib=mp,$0=mp;const o=Rn.env.VSCODE_NLS_CONFIG;if(o)try{const e=JSON.parse(o),t=e.availableLanguages["*"];Ib=e.locale,$0=t||mp,S6=e._translationsConfigFile}catch{}d4=!0}else console.error("Unable to resolve platform.");const Qi=Iv,Ke=Ev,hn=U0,ur=d4,Kc=mE,D6=mE&&typeof di.importScripts=="function",ga=_E,x6=h4,fa=Zo,k6=$0,I6=typeof di.postMessage=="function"&&!di.importScripts,u4=(()=>{if(I6){const o=[];di.addEventListener("message",t=>{if(t.data&&t.data.vscodeScheduleAsyncWork)for(let i=0,n=o.length;i{const i=++e;o.push({id:i,callback:t}),di.postMessage({vscodeScheduleAsyncWork:i},"*")}}return o=>setTimeout(o)})(),Ps=Ev||_E?2:Iv?1:3;let k2=!0,I2=!1;function g4(){if(!I2){I2=!0;const o=new Uint8Array(2);o[0]=1,o[1]=2,k2=new Uint16Array(o.buffer)[0]===512+1}return k2}const f4=!!(fa&&fa.indexOf("Chrome")>=0),E6=!!(fa&&fa.indexOf("Firefox")>=0),T6=!!(!f4&&fa&&fa.indexOf("Safari")>=0),N6=!!(fa&&fa.indexOf("Edg/")>=0);fa&&fa.indexOf("Android")>=0;var it;(function(o){function e(v){return v&&typeof v=="object"&&typeof v[Symbol.iterator]=="function"}o.is=e;const t=Object.freeze([]);function i(){return t}o.empty=i;function*n(v){yield v}o.single=n;function s(v){return e(v)?v:n(v)}o.wrap=s;function r(v){return v||t}o.from=r;function a(v){return!v||v[Symbol.iterator]().next().done===!0}o.isEmpty=a;function l(v){return v[Symbol.iterator]().next().value}o.first=l;function c(v,b){for(const C of v)if(b(C))return!0;return!1}o.some=c;function d(v,b){for(const C of v)if(b(C))return C}o.find=d;function*h(v,b){for(const C of v)b(C)&&(yield C)}o.filter=h;function*u(v,b){let C=0;for(const S of v)yield b(S,C++)}o.map=u;function*g(...v){for(const b of v)for(const C of b)yield C}o.concat=g;function p(v,b,C){let S=C;for(const x of v)S=b(S,x);return S}o.reduce=p;function*m(v,b,C=v.length){for(b<0&&(b+=v.length),C<0?C+=v.length:C>v.length&&(C=v.length);b{n||(n=!0,this._remove(i))}}shift(){if(this._first!==bi.Undefined){const e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last!==bi.Undefined){const e=this._last.element;return this._remove(this._last),e}}_remove(e){if(e.prev!==bi.Undefined&&e.next!==bi.Undefined){const t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===bi.Undefined&&e.next===bi.Undefined?(this._first=bi.Undefined,this._last=bi.Undefined):e.next===bi.Undefined?(this._last=this._last.prev,this._last.next=bi.Undefined):e.prev===bi.Undefined&&(this._first=this._first.next,this._first.prev=bi.Undefined);this._size-=1}*[Symbol.iterator](){let e=this._first;for(;e!==bi.Undefined;)yield e.element,e=e.next}}const p4="`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?";function M6(o=""){let e="(-?\\d*\\.\\d\\w*)|([^";for(const t of p4)o.indexOf(t)>=0||(e+="\\"+t);return e+="\\s]+)",new RegExp(e,"g")}const bE=M6();function m4(o){let e=bE;if(o&&o instanceof RegExp)if(o.global)e=o;else{let t="g";o.ignoreCase&&(t+="i"),o.multiline&&(t+="m"),o.unicode&&(t+="u"),e=new RegExp(o.source,t)}return e.lastIndex=0,e}const _4=new ln;_4.unshift({maxLen:1e3,windowSize:15,timeBudget:150});function _m(o,e,t,i,n){if(n||(n=it.first(_4)),t.length>n.maxLen){let c=o-n.maxLen/2;return c<0?c=0:i+=c,t=t.substring(c,o+n.maxLen/2),_m(o,e,t,i,n)}const s=Date.now(),r=o-1-i;let a=-1,l=null;for(let c=1;!(Date.now()-s>=n.timeBudget);c++){const d=r-n.windowSize*c;e.lastIndex=Math.max(0,d);const h=A6(e,t,r,a);if(!h&&l||(l=h,d<=0))break;a=d}if(l){const c={word:l[0],startColumn:i+1+l.index,endColumn:i+1+l.index+l[0].length};return e.lastIndex=0,c}return null}function A6(o,e,t,i){let n;for(;n=o.exec(e);){const s=n.index||0;if(s<=t&&o.lastIndex>=t)return n;if(i>0&&s>i)return null}return null}function Zs(o,e=0){return o[o.length-(1+e)]}function R6(o){if(o.length===0)throw new Error("Invalid tail call");return[o.slice(0,o.length-1),o[o.length-1]]}function Bn(o,e,t=(i,n)=>i===n){if(o===e)return!0;if(!o||!e||o.length!==e.length)return!1;for(let i=0,n=o.length;it(o[i],e))}function O6(o,e){let t=0,i=o-1;for(;t<=i;){const n=(t+i)/2|0,s=e(n);if(s<0)t=n+1;else if(s>0)i=n-1;else return n}return-(t+1)}function b4(o,e){let t=0,i=o.length;if(i===0)return 0;for(;t=e.length)throw new TypeError("invalid index");const i=e[Math.floor(e.length*Math.random())],n=[],s=[],r=[];for(const a of e){const l=t(a,i);l<0?n.push(a):l>0?s.push(a):r.push(a)}return o!!e)}function T2(o){let e=0;for(let t=0;t0}function Dc(o,e=t=>t){const t=new Set;return o.filter(i=>{const n=e(i);return t.has(n)?!1:(t.add(n),!0)})}function C4(o,e){const t=F6(o,e);if(t!==-1)return o[t]}function F6(o,e){for(let t=o.length-1;t>=0;t--){const i=o[t];if(e(i))return t}return-1}function w4(o,e){return o.length>0?o[0]:e}function Mn(o,e){let t=typeof e=="number"?o:0;typeof e=="number"?t=o:(t=0,e=o);const i=[];if(t<=e)for(let n=t;ne;n--)i.push(n);return i}function L1(o,e,t){const i=o.slice(0,e),n=o.slice(e);return i.concat(t,n)}function TS(o,e){const t=o.indexOf(e);t>-1&&(o.splice(t,1),o.unshift(e))}function Eb(o,e){const t=o.indexOf(e);t>-1&&(o.splice(t,1),o.push(e))}function N2(o,e){for(const t of e)o.push(t)}function vE(o){return Array.isArray(o)?o:[o]}function B6(o,e,t){const i=S4(o,e),n=o.length,s=t.length;o.length=n+s;for(let r=n-1;r>=i;r--)o[r+s]=o[r];for(let r=0;r0}o.isGreaterThan=t;function i(n){return n===0}o.isNeitherLessOrGreaterThan=i,o.greaterThan=1,o.lessThan=-1,o.neitherLessOrGreaterThan=0})(jL||(jL={}));function Vp(o,e){return(t,i)=>e(o(t),o(i))}const W6=(o,e)=>o-e;function y4(o,e){if(o.length===0)return;let t=o[0];for(let i=1;i0&&(t=n)}return t}function V6(o,e){if(o.length===0)return;let t=o[0];for(let i=1;i=0&&(t=n)}return t}function H6(o,e){return y4(o,(t,i)=>-e(t,i))}class Eg{constructor(e){this.items=e,this.firstIdx=0,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(e){let t=this.firstIdx;for(;t=0&&e(this.items[t]);)t--;const i=t===this.lastIdx?null:this.items.slice(t+1,this.lastIdx+1);return this.lastIdx=t,i}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){const e=this.items[this.firstIdx];return this.firstIdx++,e}takeCount(e){const t=this.items.slice(this.firstIdx,this.firstIdx+e);return this.firstIdx+=e,t}}class aa{constructor(e){this.iterate=e}toArray(){const e=[];return this.iterate(t=>(e.push(t),!0)),e}filter(e){return new aa(t=>this.iterate(i=>e(i)?t(i):!0))}map(e){return new aa(t=>this.iterate(i=>t(e(i))))}findLast(e){let t;return this.iterate(i=>(e(i)&&(t=i),!0)),t}findLastMaxBy(e){let t,i=!0;return this.iterate(n=>((i||jL.isGreaterThan(e(n,t)))&&(i=!1,t=n),!0)),t}}aa.empty=new aa(o=>{});function Wn(o){return typeof o=="string"}function Xn(o){return typeof o=="object"&&o!==null&&!Array.isArray(o)&&!(o instanceof RegExp)&&!(o instanceof Date)}function z6(o){const e=Object.getPrototypeOf(Uint8Array);return typeof o=="object"&&o instanceof e}function xc(o){return typeof o=="number"&&!isNaN(o)}function A2(o){return!!o&&typeof o[Symbol.iterator]=="function"}function L4(o){return o===!0||o===!1}function us(o){return typeof o>"u"}function U6(o){return!Ms(o)}function Ms(o){return us(o)||o===null}function _t(o,e){if(!o)throw new Error(e?`Unexpected type, expected '${e}'`:"Unexpected type")}function Fu(o){if(Ms(o))throw new Error("Assertion Failed: argument is undefined or null");return o}function Tv(o){return typeof o=="function"}function $6(o,e){const t=Math.min(o.length,e.length);for(let i=0;i{e[t]=i&&typeof i=="object"?qa(i):i}),e}function K6(o){if(!o||typeof o!="object")return o;const e=[o];for(;e.length>0;){const t=e.shift();Object.freeze(t);for(const i in t)if(D4.call(t,i)){const n=t[i];typeof n=="object"&&!Object.isFrozen(n)&&!z6(n)&&e.push(n)}}return o}const D4=Object.prototype.hasOwnProperty;function x4(o,e){return KL(o,e,new Set)}function KL(o,e,t){if(Ms(o))return o;const i=e(o);if(typeof i<"u")return i;if(Array.isArray(o)){const n=[];for(const s of o)n.push(KL(s,e,t));return n}if(Xn(o)){if(t.has(o))throw new Error("Cannot clone recursive data-structure");t.add(o);const n={};for(const s in o)D4.call(o,s)&&(n[s]=KL(o[s],e,t));return t.delete(o),n}return o}function B_(o,e,t=!0){return Xn(o)?(Xn(e)&&Object.keys(e).forEach(i=>{i in o?t&&(Xn(o[i])&&Xn(e[i])?B_(o[i],e[i],t):o[i]=e[i]):o[i]=e[i]}),o):e}function so(o,e){if(o===e)return!0;if(o==null||e===null||e===void 0||typeof o!=typeof e||typeof o!="object"||Array.isArray(o)!==Array.isArray(e))return!1;let t,i;if(Array.isArray(o)){if(o.length!==e.length)return!1;for(t=0;tfunction(){const s=Array.prototype.slice.call(arguments,0);return e(n,s)},i={};for(const n of o)i[n]=t(n);return i}const _n={tabSize:4,indentSize:4,insertSpaces:!0,detectIndentation:!0,trimAutoWhitespace:!0,largeFileOptimizations:!0,bracketPairColorizationOptions:{enabled:!0,independentColorPoolPerBracketType:!1}},Vl=8;class k4{constructor(e){this._values=e}hasChanged(e){return this._values[e]}}class I4{constructor(){this.stableMinimapLayoutInput=null,this.stableFitMaxMinimapScale=0,this.stableFitRemainingWidth=0}}class Jt{constructor(e,t,i,n){this.id=e,this.name=t,this.defaultValue=i,this.schema=n}applyUpdate(e,t){return D1(e,t)}compute(e,t,i){return i}}class Hp{constructor(e,t){this.newValue=e,this.didChange=t}}function D1(o,e){if(typeof o!="object"||typeof e!="object"||!o||!e)return new Hp(e,o!==e);if(Array.isArray(o)||Array.isArray(e)){const i=Array.isArray(o)&&Array.isArray(e)&&Bn(o,e);return new Hp(e,!i)}let t=!1;for(const i in e)if(e.hasOwnProperty(i)){const n=D1(o[i],e[i]);n.didChange&&(o[i]=n.newValue,t=!0)}return new Hp(o,t)}class _f{constructor(e){this.schema=void 0,this.id=e,this.name="_never_",this.defaultValue=void 0}applyUpdate(e,t){return D1(e,t)}validate(e){return this.defaultValue}}class bf{constructor(e,t,i,n){this.id=e,this.name=t,this.defaultValue=i,this.schema=n}applyUpdate(e,t){return D1(e,t)}validate(e){return typeof e>"u"?this.defaultValue:e}compute(e,t,i){return i}}function Le(o,e){return typeof o>"u"?e:o==="false"?!1:!!o}class ct extends bf{constructor(e,t,i,n=void 0){typeof n<"u"&&(n.type="boolean",n.default=i),super(e,t,i,n)}validate(e){return Le(e,this.defaultValue)}}function qL(o,e,t,i){if(typeof o>"u")return e;let n=parseInt(o,10);return isNaN(n)?e:(n=Math.max(t,n),n=Math.min(i,n),n|0)}class Lt extends bf{static clampedInt(e,t,i,n){return qL(e,t,i,n)}constructor(e,t,i,n,s,r=void 0){typeof r<"u"&&(r.type="integer",r.default=i,r.minimum=n,r.maximum=s),super(e,t,i,r),this.minimum=n,this.maximum=s}validate(e){return Lt.clampedInt(e,this.defaultValue,this.minimum,this.maximum)}}class Xr extends bf{static clamp(e,t,i){return ei?i:e}static float(e,t){if(typeof e=="number")return e;if(typeof e>"u")return t;const i=parseFloat(e);return isNaN(i)?t:i}constructor(e,t,i,n,s){typeof s<"u"&&(s.type="number",s.default=i),super(e,t,i,s),this.validationFn=n}validate(e){return this.validationFn(Xr.float(e,this.defaultValue))}}class ds extends bf{static string(e,t){return typeof e!="string"?t:e}constructor(e,t,i,n=void 0){typeof n<"u"&&(n.type="string",n.default=i),super(e,t,i,n)}validate(e){return ds.string(e,this.defaultValue)}}function Di(o,e,t){return typeof o!="string"||t.indexOf(o)===-1?e:o}class ai extends bf{constructor(e,t,i,n,s=void 0){typeof s<"u"&&(s.type="string",s.enum=n,s.default=i),super(e,t,i,s),this._allowedValues=n}validate(e){return Di(e,this.defaultValue,this._allowedValues)}}class Tb extends Jt{constructor(e,t,i,n,s,r,a=void 0){typeof a<"u"&&(a.type="string",a.enum=s,a.default=n),super(e,t,i,a),this._allowedValues=s,this._convert=r}validate(e){return typeof e!="string"?this.defaultValue:this._allowedValues.indexOf(e)===-1?this.defaultValue:this._convert(e)}}function Z6(o){switch(o){case"none":return 0;case"keep":return 1;case"brackets":return 2;case"advanced":return 3;case"full":return 4}}class Y6 extends Jt{constructor(){super(2,"accessibilitySupport",0,{type:"string",enum:["auto","on","off"],enumDescriptions:[f("accessibilitySupport.auto","Use platform APIs to detect when a Screen Reader is attached"),f("accessibilitySupport.on","Optimize for usage with a Screen Reader"),f("accessibilitySupport.off","Assume a screen reader is not attached")],default:"auto",tags:["accessibility"],description:f("accessibilitySupport","Controls if the UI should run in a mode where it is optimized for screen readers.")})}validate(e){switch(e){case"auto":return 0;case"off":return 1;case"on":return 2}return this.defaultValue}compute(e,t,i){return i===0?e.accessibilitySupport:i}}class Q6 extends Jt{constructor(){const e={insertSpace:!0,ignoreEmptyLines:!0};super(20,"comments",e,{"editor.comments.insertSpace":{type:"boolean",default:e.insertSpace,description:f("comments.insertSpace","Controls whether a space character is inserted when commenting.")},"editor.comments.ignoreEmptyLines":{type:"boolean",default:e.ignoreEmptyLines,description:f("comments.ignoreEmptyLines","Controls if empty lines should be ignored with toggle, add or remove actions for line comments.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{insertSpace:Le(t.insertSpace,this.defaultValue.insertSpace),ignoreEmptyLines:Le(t.ignoreEmptyLines,this.defaultValue.ignoreEmptyLines)}}}function X6(o){switch(o){case"blink":return 1;case"smooth":return 2;case"phase":return 3;case"expand":return 4;case"solid":return 5}}var Gi;(function(o){o[o.Line=1]="Line",o[o.Block=2]="Block",o[o.Underline=3]="Underline",o[o.LineThin=4]="LineThin",o[o.BlockOutline=5]="BlockOutline",o[o.UnderlineThin=6]="UnderlineThin"})(Gi||(Gi={}));function J6(o){switch(o){case"line":return Gi.Line;case"block":return Gi.Block;case"underline":return Gi.Underline;case"line-thin":return Gi.LineThin;case"block-outline":return Gi.BlockOutline;case"underline-thin":return Gi.UnderlineThin}}class eW extends _f{constructor(){super(135)}compute(e,t,i){const n=["monaco-editor"];return t.get(36)&&n.push(t.get(36)),e.extraEditorClassName&&n.push(e.extraEditorClassName),t.get(70)==="default"?n.push("mouse-default"):t.get(70)==="copy"&&n.push("mouse-copy"),t.get(105)&&n.push("showUnused"),t.get(133)&&n.push("showDeprecated"),n.join(" ")}}class tW extends ct{constructor(){super(34,"emptySelectionClipboard",!0,{description:f("emptySelectionClipboard","Controls whether copying without a selection copies the current line.")})}compute(e,t,i){return i&&e.emptySelectionClipboard}}class iW extends Jt{constructor(){const e={cursorMoveOnType:!0,seedSearchStringFromSelection:"always",autoFindInSelection:"never",globalFindClipboard:!1,addExtraSpaceOnTop:!0,loop:!0};super(38,"find",e,{"editor.find.cursorMoveOnType":{type:"boolean",default:e.cursorMoveOnType,description:f("find.cursorMoveOnType","Controls whether the cursor should jump to find matches while typing.")},"editor.find.seedSearchStringFromSelection":{type:"string",enum:["never","always","selection"],default:e.seedSearchStringFromSelection,enumDescriptions:[f("editor.find.seedSearchStringFromSelection.never","Never seed search string from the editor selection."),f("editor.find.seedSearchStringFromSelection.always","Always seed search string from the editor selection, including word at cursor position."),f("editor.find.seedSearchStringFromSelection.selection","Only seed search string from the editor selection.")],description:f("find.seedSearchStringFromSelection","Controls whether the search string in the Find Widget is seeded from the editor selection.")},"editor.find.autoFindInSelection":{type:"string",enum:["never","always","multiline"],default:e.autoFindInSelection,enumDescriptions:[f("editor.find.autoFindInSelection.never","Never turn on Find in Selection automatically (default)."),f("editor.find.autoFindInSelection.always","Always turn on Find in Selection automatically."),f("editor.find.autoFindInSelection.multiline","Turn on Find in Selection automatically when multiple lines of content are selected.")],description:f("find.autoFindInSelection","Controls the condition for turning on Find in Selection automatically.")},"editor.find.globalFindClipboard":{type:"boolean",default:e.globalFindClipboard,description:f("find.globalFindClipboard","Controls whether the Find Widget should read or modify the shared find clipboard on macOS."),included:Ke},"editor.find.addExtraSpaceOnTop":{type:"boolean",default:e.addExtraSpaceOnTop,description:f("find.addExtraSpaceOnTop","Controls whether the Find Widget should add extra lines on top of the editor. When true, you can scroll beyond the first line when the Find Widget is visible.")},"editor.find.loop":{type:"boolean",default:e.loop,description:f("find.loop","Controls whether the search automatically restarts from the beginning (or the end) when no further matches can be found.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{cursorMoveOnType:Le(t.cursorMoveOnType,this.defaultValue.cursorMoveOnType),seedSearchStringFromSelection:typeof e.seedSearchStringFromSelection=="boolean"?e.seedSearchStringFromSelection?"always":"never":Di(t.seedSearchStringFromSelection,this.defaultValue.seedSearchStringFromSelection,["never","always","selection"]),autoFindInSelection:typeof e.autoFindInSelection=="boolean"?e.autoFindInSelection?"always":"never":Di(t.autoFindInSelection,this.defaultValue.autoFindInSelection,["never","always","multiline"]),globalFindClipboard:Le(t.globalFindClipboard,this.defaultValue.globalFindClipboard),addExtraSpaceOnTop:Le(t.addExtraSpaceOnTop,this.defaultValue.addExtraSpaceOnTop),loop:Le(t.loop,this.defaultValue.loop)}}}class As extends Jt{constructor(){super(48,"fontLigatures",As.OFF,{anyOf:[{type:"boolean",description:f("fontLigatures","Enables/Disables font ligatures ('calt' and 'liga' font features). Change this to a string for fine-grained control of the 'font-feature-settings' CSS property.")},{type:"string",description:f("fontFeatureSettings","Explicit 'font-feature-settings' CSS property. A boolean can be passed instead if one only needs to turn on/off ligatures.")}],description:f("fontLigaturesGeneral","Configures font ligatures or font features. Can be either a boolean to enable/disable ligatures or a string for the value of the CSS 'font-feature-settings' property."),default:!1})}validate(e){return typeof e>"u"?this.defaultValue:typeof e=="string"?e==="false"?As.OFF:e==="true"?As.ON:e:e?As.ON:As.OFF}}As.OFF='"liga" off, "calt" off';As.ON='"liga" on, "calt" on';class or extends Jt{constructor(){super(51,"fontVariations",or.OFF,{anyOf:[{type:"boolean",description:f("fontVariations","Enables/Disables the translation from font-weight to font-variation-settings. Change this to a string for fine-grained control of the 'font-variation-settings' CSS property.")},{type:"string",description:f("fontVariationSettings","Explicit 'font-variation-settings' CSS property. A boolean can be passed instead if one only needs to translate font-weight to font-variation-settings.")}],description:f("fontVariationsGeneral","Configures font variations. Can be either a boolean to enable/disable the translation from font-weight to font-variation-settings or a string for the value of the CSS 'font-variation-settings' property."),default:!1})}validate(e){return typeof e>"u"?this.defaultValue:typeof e=="string"?e==="false"?or.OFF:e==="true"?or.TRANSLATE:e:e?or.TRANSLATE:or.OFF}compute(e,t,i){return e.fontInfo.fontVariationSettings}}or.OFF="normal";or.TRANSLATE="translate";class nW extends _f{constructor(){super(47)}compute(e,t,i){return e.fontInfo}}class sW extends bf{constructor(){super(49,"fontSize",ps.fontSize,{type:"number",minimum:6,maximum:100,default:ps.fontSize,description:f("fontSize","Controls the font size in pixels.")})}validate(e){const t=Xr.float(e,this.defaultValue);return t===0?ps.fontSize:Xr.clamp(t,6,100)}compute(e,t,i){return e.fontInfo.fontSize}}class Ur extends Jt{constructor(){super(50,"fontWeight",ps.fontWeight,{anyOf:[{type:"number",minimum:Ur.MINIMUM_VALUE,maximum:Ur.MAXIMUM_VALUE,errorMessage:f("fontWeightErrorMessage",'Only "normal" and "bold" keywords or numbers between 1 and 1000 are allowed.')},{type:"string",pattern:"^(normal|bold|1000|[1-9][0-9]{0,2})$"},{enum:Ur.SUGGESTION_VALUES}],default:ps.fontWeight,description:f("fontWeight",'Controls the font weight. Accepts "normal" and "bold" keywords or numbers between 1 and 1000.')})}validate(e){return e==="normal"||e==="bold"?e:String(Lt.clampedInt(e,ps.fontWeight,Ur.MINIMUM_VALUE,Ur.MAXIMUM_VALUE))}}Ur.SUGGESTION_VALUES=["normal","bold","100","200","300","400","500","600","700","800","900"];Ur.MINIMUM_VALUE=1;Ur.MAXIMUM_VALUE=1e3;class oW extends Jt{constructor(){const e={multiple:"peek",multipleDefinitions:"peek",multipleTypeDefinitions:"peek",multipleDeclarations:"peek",multipleImplementations:"peek",multipleReferences:"peek",alternativeDefinitionCommand:"editor.action.goToReferences",alternativeTypeDefinitionCommand:"editor.action.goToReferences",alternativeDeclarationCommand:"editor.action.goToReferences",alternativeImplementationCommand:"",alternativeReferenceCommand:""},t={type:"string",enum:["peek","gotoAndPeek","goto"],default:e.multiple,enumDescriptions:[f("editor.gotoLocation.multiple.peek","Show Peek view of the results (default)"),f("editor.gotoLocation.multiple.gotoAndPeek","Go to the primary result and show a Peek view"),f("editor.gotoLocation.multiple.goto","Go to the primary result and enable Peek-less navigation to others")]},i=["","editor.action.referenceSearch.trigger","editor.action.goToReferences","editor.action.peekImplementation","editor.action.goToImplementation","editor.action.peekTypeDefinition","editor.action.goToTypeDefinition","editor.action.peekDeclaration","editor.action.revealDeclaration","editor.action.peekDefinition","editor.action.revealDefinitionAside","editor.action.revealDefinition"];super(55,"gotoLocation",e,{"editor.gotoLocation.multiple":{deprecationMessage:f("editor.gotoLocation.multiple.deprecated","This setting is deprecated, please use separate settings like 'editor.editor.gotoLocation.multipleDefinitions' or 'editor.editor.gotoLocation.multipleImplementations' instead.")},"editor.gotoLocation.multipleDefinitions":Object.assign({description:f("editor.editor.gotoLocation.multipleDefinitions","Controls the behavior the 'Go to Definition'-command when multiple target locations exist.")},t),"editor.gotoLocation.multipleTypeDefinitions":Object.assign({description:f("editor.editor.gotoLocation.multipleTypeDefinitions","Controls the behavior the 'Go to Type Definition'-command when multiple target locations exist.")},t),"editor.gotoLocation.multipleDeclarations":Object.assign({description:f("editor.editor.gotoLocation.multipleDeclarations","Controls the behavior the 'Go to Declaration'-command when multiple target locations exist.")},t),"editor.gotoLocation.multipleImplementations":Object.assign({description:f("editor.editor.gotoLocation.multipleImplemenattions","Controls the behavior the 'Go to Implementations'-command when multiple target locations exist.")},t),"editor.gotoLocation.multipleReferences":Object.assign({description:f("editor.editor.gotoLocation.multipleReferences","Controls the behavior the 'Go to References'-command when multiple target locations exist.")},t),"editor.gotoLocation.alternativeDefinitionCommand":{type:"string",default:e.alternativeDefinitionCommand,enum:i,description:f("alternativeDefinitionCommand","Alternative command id that is being executed when the result of 'Go to Definition' is the current location.")},"editor.gotoLocation.alternativeTypeDefinitionCommand":{type:"string",default:e.alternativeTypeDefinitionCommand,enum:i,description:f("alternativeTypeDefinitionCommand","Alternative command id that is being executed when the result of 'Go to Type Definition' is the current location.")},"editor.gotoLocation.alternativeDeclarationCommand":{type:"string",default:e.alternativeDeclarationCommand,enum:i,description:f("alternativeDeclarationCommand","Alternative command id that is being executed when the result of 'Go to Declaration' is the current location.")},"editor.gotoLocation.alternativeImplementationCommand":{type:"string",default:e.alternativeImplementationCommand,enum:i,description:f("alternativeImplementationCommand","Alternative command id that is being executed when the result of 'Go to Implementation' is the current location.")},"editor.gotoLocation.alternativeReferenceCommand":{type:"string",default:e.alternativeReferenceCommand,enum:i,description:f("alternativeReferenceCommand","Alternative command id that is being executed when the result of 'Go to Reference' is the current location.")}})}validate(e){var t,i,n,s,r;if(!e||typeof e!="object")return this.defaultValue;const a=e;return{multiple:Di(a.multiple,this.defaultValue.multiple,["peek","gotoAndPeek","goto"]),multipleDefinitions:(t=a.multipleDefinitions)!==null&&t!==void 0?t:Di(a.multipleDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleTypeDefinitions:(i=a.multipleTypeDefinitions)!==null&&i!==void 0?i:Di(a.multipleTypeDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleDeclarations:(n=a.multipleDeclarations)!==null&&n!==void 0?n:Di(a.multipleDeclarations,"peek",["peek","gotoAndPeek","goto"]),multipleImplementations:(s=a.multipleImplementations)!==null&&s!==void 0?s:Di(a.multipleImplementations,"peek",["peek","gotoAndPeek","goto"]),multipleReferences:(r=a.multipleReferences)!==null&&r!==void 0?r:Di(a.multipleReferences,"peek",["peek","gotoAndPeek","goto"]),alternativeDefinitionCommand:ds.string(a.alternativeDefinitionCommand,this.defaultValue.alternativeDefinitionCommand),alternativeTypeDefinitionCommand:ds.string(a.alternativeTypeDefinitionCommand,this.defaultValue.alternativeTypeDefinitionCommand),alternativeDeclarationCommand:ds.string(a.alternativeDeclarationCommand,this.defaultValue.alternativeDeclarationCommand),alternativeImplementationCommand:ds.string(a.alternativeImplementationCommand,this.defaultValue.alternativeImplementationCommand),alternativeReferenceCommand:ds.string(a.alternativeReferenceCommand,this.defaultValue.alternativeReferenceCommand)}}}class rW extends Jt{constructor(){const e={enabled:!0,delay:300,sticky:!0,above:!0};super(57,"hover",e,{"editor.hover.enabled":{type:"boolean",default:e.enabled,description:f("hover.enabled","Controls whether the hover is shown.")},"editor.hover.delay":{type:"number",default:e.delay,minimum:0,maximum:1e4,description:f("hover.delay","Controls the delay in milliseconds after which the hover is shown.")},"editor.hover.sticky":{type:"boolean",default:e.sticky,description:f("hover.sticky","Controls whether the hover should remain visible when mouse is moved over it.")},"editor.hover.above":{type:"boolean",default:e.above,description:f("hover.above","Prefer showing hovers above the line, if there's space.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{enabled:Le(t.enabled,this.defaultValue.enabled),delay:Lt.clampedInt(t.delay,this.defaultValue.delay,0,1e4),sticky:Le(t.sticky,this.defaultValue.sticky),above:Le(t.above,this.defaultValue.above)}}}class ag extends _f{constructor(){super(138)}compute(e,t,i){return ag.computeLayout(t,{memory:e.memory,outerWidth:e.outerWidth,outerHeight:e.outerHeight,isDominatedByLongLines:e.isDominatedByLongLines,lineHeight:e.fontInfo.lineHeight,viewLineCount:e.viewLineCount,lineNumbersDigitCount:e.lineNumbersDigitCount,typicalHalfwidthCharacterWidth:e.fontInfo.typicalHalfwidthCharacterWidth,maxDigitWidth:e.fontInfo.maxDigitWidth,pixelRatio:e.pixelRatio})}static computeContainedMinimapLineCount(e){const t=e.height/e.lineHeight,i=Math.floor(e.paddingTop/e.lineHeight);let n=Math.floor(e.paddingBottom/e.lineHeight);e.scrollBeyondLastLine&&(n=Math.max(n,t-1));const s=(i+e.viewLineCount+n)/(e.pixelRatio*e.height),r=Math.floor(e.viewLineCount/s);return{typicalViewportLineCount:t,extraLinesBeforeFirstLine:i,extraLinesBeyondLastLine:n,desiredRatio:s,minimapLineCount:r}}static _computeMinimapLayout(e,t){const i=e.outerWidth,n=e.outerHeight,s=e.pixelRatio;if(!e.minimap.enabled)return{renderMinimap:0,minimapLeft:0,minimapWidth:0,minimapHeightIsEditorHeight:!1,minimapIsSampling:!1,minimapScale:1,minimapLineHeight:1,minimapCanvasInnerWidth:0,minimapCanvasInnerHeight:Math.floor(s*n),minimapCanvasOuterWidth:0,minimapCanvasOuterHeight:n};const r=t.stableMinimapLayoutInput,a=r&&e.outerHeight===r.outerHeight&&e.lineHeight===r.lineHeight&&e.typicalHalfwidthCharacterWidth===r.typicalHalfwidthCharacterWidth&&e.pixelRatio===r.pixelRatio&&e.scrollBeyondLastLine===r.scrollBeyondLastLine&&e.paddingTop===r.paddingTop&&e.paddingBottom===r.paddingBottom&&e.minimap.enabled===r.minimap.enabled&&e.minimap.side===r.minimap.side&&e.minimap.size===r.minimap.size&&e.minimap.showSlider===r.minimap.showSlider&&e.minimap.renderCharacters===r.minimap.renderCharacters&&e.minimap.maxColumn===r.minimap.maxColumn&&e.minimap.scale===r.minimap.scale&&e.verticalScrollbarWidth===r.verticalScrollbarWidth&&e.isViewportWrapping===r.isViewportWrapping,l=e.lineHeight,c=e.typicalHalfwidthCharacterWidth,d=e.scrollBeyondLastLine,h=e.minimap.renderCharacters;let u=s>=2?Math.round(e.minimap.scale*2):e.minimap.scale;const g=e.minimap.maxColumn,p=e.minimap.size,m=e.minimap.side,_=e.verticalScrollbarWidth,v=e.viewLineCount,b=e.remainingWidth,C=e.isViewportWrapping,S=h?2:3;let x=Math.floor(s*n);const E=x/s;let L=!1,D=!1,k=S*u,R=u/s,P=1;if(p==="fill"||p==="fit"){const{typicalViewportLineCount:je,extraLinesBeforeFirstLine:Ie,extraLinesBeyondLastLine:Qe,desiredRatio:Xe,minimapLineCount:fe}=ag.computeContainedMinimapLineCount({viewLineCount:v,scrollBeyondLastLine:d,paddingTop:e.paddingTop,paddingBottom:e.paddingBottom,height:n,lineHeight:l,pixelRatio:s});if(v/fe>1)L=!0,D=!0,u=1,k=1,R=u/s;else{let yt=!1,ws=u+1;if(p==="fit"){const zi=Math.ceil((Ie+v+Qe)*k);C&&a&&b<=t.stableFitRemainingWidth?(yt=!0,ws=t.stableFitMaxMinimapScale):yt=zi>x}if(p==="fill"||yt){L=!0;const zi=u;k=Math.min(l*s,Math.max(1,Math.floor(1/Xe))),C&&a&&b<=t.stableFitRemainingWidth&&(ws=t.stableFitMaxMinimapScale),u=Math.min(ws,Math.max(1,Math.floor(k/S))),u>zi&&(P=Math.min(2,u/zi)),R=u/s/P,x=Math.ceil(Math.max(je,Ie+v+Qe)*k),C?(t.stableMinimapLayoutInput=e,t.stableFitRemainingWidth=b,t.stableFitMaxMinimapScale=u):(t.stableMinimapLayoutInput=null,t.stableFitRemainingWidth=0)}}}const B=Math.floor(g*R),z=Math.min(B,Math.max(0,Math.floor((b-_-2)*R/(c+R)))+Vl);let ne=Math.floor(s*z);const ue=ne/s;ne=Math.floor(ne*P);const ye=h?1:2,Fe=m==="left"?0:i-z-_;return{renderMinimap:ye,minimapLeft:Fe,minimapWidth:z,minimapHeightIsEditorHeight:L,minimapIsSampling:D,minimapScale:u,minimapLineHeight:k,minimapCanvasInnerWidth:ne,minimapCanvasInnerHeight:x,minimapCanvasOuterWidth:ue,minimapCanvasOuterHeight:E}}static computeLayout(e,t){const i=t.outerWidth|0,n=t.outerHeight|0,s=t.lineHeight|0,r=t.lineNumbersDigitCount|0,a=t.typicalHalfwidthCharacterWidth,l=t.maxDigitWidth,c=t.pixelRatio,d=t.viewLineCount,h=e.get(130),u=h==="inherit"?e.get(129):h,g=u==="inherit"?e.get(125):u,p=e.get(128),m=t.isDominatedByLongLines,_=e.get(54),v=e.get(64).renderType!==0,b=e.get(65),C=e.get(99),S=e.get(80),x=e.get(69),E=e.get(97),L=E.verticalScrollbarSize,D=E.verticalHasArrows,k=E.arrowSize,R=E.horizontalScrollbarSize,P=e.get(40),B=e.get(104)!=="never";let z=e.get(62);P&&B&&(z+=16);let ne=0;if(v){const El=Math.max(r,b);ne=Math.round(El*l)}let ue=0;_&&(ue=s);let ye=0,Fe=ye+ue,je=Fe+ne,Ie=je+z;const Qe=i-ue-ne-z;let Xe=!1,fe=!1,Se=-1;u==="inherit"&&m?(Xe=!0,fe=!0):g==="on"||g==="bounded"?fe=!0:g==="wordWrapColumn"&&(Se=p);const yt=ag._computeMinimapLayout({outerWidth:i,outerHeight:n,lineHeight:s,typicalHalfwidthCharacterWidth:a,pixelRatio:c,scrollBeyondLastLine:C,paddingTop:S.top,paddingBottom:S.bottom,minimap:x,verticalScrollbarWidth:L,viewLineCount:d,remainingWidth:Qe,isViewportWrapping:fe},t.memory||new I4);yt.renderMinimap!==0&&yt.minimapLeft===0&&(ye+=yt.minimapWidth,Fe+=yt.minimapWidth,je+=yt.minimapWidth,Ie+=yt.minimapWidth);const ws=Qe-yt.minimapWidth,zi=Math.max(1,Math.floor((ws-L-2)/a)),Ko=D?k:0;return fe&&(Se=Math.max(1,zi),g==="bounded"&&(Se=Math.min(Se,p))),{width:i,height:n,glyphMarginLeft:ye,glyphMarginWidth:ue,lineNumbersLeft:Fe,lineNumbersWidth:ne,decorationsLeft:je,decorationsWidth:z,contentLeft:Ie,contentWidth:ws,minimap:yt,viewportColumn:zi,isWordWrapMinified:Xe,isViewportWrapping:fe,wrappingColumn:Se,verticalScrollbarWidth:L,horizontalScrollbarHeight:R,overviewRuler:{top:Ko,width:L,height:n-2*Ko,right:0}}}}class aW extends Jt{constructor(){super(132,"wrappingStrategy","simple",{"editor.wrappingStrategy":{enumDescriptions:[f("wrappingStrategy.simple","Assumes that all characters are of the same width. This is a fast algorithm that works correctly for monospace fonts and certain scripts (like Latin characters) where glyphs are of equal width."),f("wrappingStrategy.advanced","Delegates wrapping points computation to the browser. This is a slow algorithm, that might cause freezes for large files, but it works correctly in all cases.")],type:"string",enum:["simple","advanced"],default:"simple",description:f("wrappingStrategy","Controls the algorithm that computes wrapping points. Note that when in accessibility mode, advanced will be used for the best experience.")}})}validate(e){return Di(e,"simple",["simple","advanced"])}compute(e,t,i){return t.get(2)===2?"advanced":i}}class lW extends Jt{constructor(){const e={enabled:!0};super(61,"lightbulb",e,{"editor.lightbulb.enabled":{type:"boolean",default:e.enabled,description:f("codeActions","Enables the Code Action lightbulb in the editor.")}})}validate(e){return!e||typeof e!="object"?this.defaultValue:{enabled:Le(e.enabled,this.defaultValue.enabled)}}}class cW extends Jt{constructor(){const e={enabled:!1,maxLineCount:5};super(109,"stickyScroll",e,{"editor.stickyScroll.enabled":{type:"boolean",default:e.enabled,description:f("editor.stickyScroll","Shows the nested current scopes during the scroll at the top of the editor.")},"editor.stickyScroll.maxLineCount":{type:"number",default:e.maxLineCount,minimum:1,maximum:10,description:f("editor.stickyScroll.","Defines the maximum number of sticky lines to show.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{enabled:Le(t.enabled,this.defaultValue.enabled),maxLineCount:Lt.clampedInt(t.maxLineCount,this.defaultValue.maxLineCount,1,10)}}}class dW extends Jt{constructor(){const e={enabled:"on",fontSize:0,fontFamily:"",padding:!1};super(134,"inlayHints",e,{"editor.inlayHints.enabled":{type:"string",default:e.enabled,description:f("inlayHints.enable","Enables the inlay hints in the editor."),enum:["on","onUnlessPressed","offUnlessPressed","off"],markdownEnumDescriptions:[f("editor.inlayHints.on","Inlay hints are enabled"),f("editor.inlayHints.onUnlessPressed","Inlay hints are showing by default and hide when holding {0}",Ke?"Ctrl+Option":"Ctrl+Alt"),f("editor.inlayHints.offUnlessPressed","Inlay hints are hidden by default and show when holding {0}",Ke?"Ctrl+Option":"Ctrl+Alt"),f("editor.inlayHints.off","Inlay hints are disabled")]},"editor.inlayHints.fontSize":{type:"number",default:e.fontSize,markdownDescription:f("inlayHints.fontSize","Controls font size of inlay hints in the editor. As default the {0} is used when the configured value is less than {1} or greater than the editor font size.","`#editor.fontSize#`","`5`")},"editor.inlayHints.fontFamily":{type:"string",default:e.fontFamily,markdownDescription:f("inlayHints.fontFamily","Controls font family of inlay hints in the editor. When set to empty, the {0} is used.","`#editor.fontFamily#`")},"editor.inlayHints.padding":{type:"boolean",default:e.padding,description:f("inlayHints.padding","Enables the padding around the inlay hints in the editor.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return typeof t.enabled=="boolean"&&(t.enabled=t.enabled?"on":"off"),{enabled:Di(t.enabled,this.defaultValue.enabled,["on","off","offUnlessPressed","onUnlessPressed"]),fontSize:Lt.clampedInt(t.fontSize,this.defaultValue.fontSize,0,100),fontFamily:ds.string(t.fontFamily,this.defaultValue.fontFamily),padding:Le(t.padding,this.defaultValue.padding)}}}class hW extends Jt{constructor(){super(62,"lineDecorationsWidth",10)}validate(e){return typeof e=="string"&&/^\d+(\.\d+)?ch$/.test(e)?-parseFloat(e.substring(0,e.length-2)):Lt.clampedInt(e,this.defaultValue,0,1e3)}compute(e,t,i){return i<0?Lt.clampedInt(-i*e.fontInfo.typicalHalfwidthCharacterWidth,this.defaultValue,0,1e3):i}}class uW extends Xr{constructor(){super(63,"lineHeight",ps.lineHeight,e=>Xr.clamp(e,0,150),{markdownDescription:f("lineHeight",`Controls the line height.
- Use 0 to automatically compute the line height from the font size.
- Values between 0 and 8 will be used as a multiplier with the font size.
- Values greater than or equal to 8 will be used as effective values.`)})}compute(e,t,i){return e.fontInfo.lineHeight}}class gW extends Jt{constructor(){const e={enabled:!0,size:"proportional",side:"right",showSlider:"mouseover",autohide:!1,renderCharacters:!0,maxColumn:120,scale:1};super(69,"minimap",e,{"editor.minimap.enabled":{type:"boolean",default:e.enabled,description:f("minimap.enabled","Controls whether the minimap is shown.")},"editor.minimap.autohide":{type:"boolean",default:e.autohide,description:f("minimap.autohide","Controls whether the minimap is hidden automatically.")},"editor.minimap.size":{type:"string",enum:["proportional","fill","fit"],enumDescriptions:[f("minimap.size.proportional","The minimap has the same size as the editor contents (and might scroll)."),f("minimap.size.fill","The minimap will stretch or shrink as necessary to fill the height of the editor (no scrolling)."),f("minimap.size.fit","The minimap will shrink as necessary to never be larger than the editor (no scrolling).")],default:e.size,description:f("minimap.size","Controls the size of the minimap.")},"editor.minimap.side":{type:"string",enum:["left","right"],default:e.side,description:f("minimap.side","Controls the side where to render the minimap.")},"editor.minimap.showSlider":{type:"string",enum:["always","mouseover"],default:e.showSlider,description:f("minimap.showSlider","Controls when the minimap slider is shown.")},"editor.minimap.scale":{type:"number",default:e.scale,minimum:1,maximum:3,enum:[1,2,3],description:f("minimap.scale","Scale of content drawn in the minimap: 1, 2 or 3.")},"editor.minimap.renderCharacters":{type:"boolean",default:e.renderCharacters,description:f("minimap.renderCharacters","Render the actual characters on a line as opposed to color blocks.")},"editor.minimap.maxColumn":{type:"number",default:e.maxColumn,description:f("minimap.maxColumn","Limit the width of the minimap to render at most a certain number of columns.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{enabled:Le(t.enabled,this.defaultValue.enabled),autohide:Le(t.autohide,this.defaultValue.autohide),size:Di(t.size,this.defaultValue.size,["proportional","fill","fit"]),side:Di(t.side,this.defaultValue.side,["right","left"]),showSlider:Di(t.showSlider,this.defaultValue.showSlider,["always","mouseover"]),renderCharacters:Le(t.renderCharacters,this.defaultValue.renderCharacters),scale:Lt.clampedInt(t.scale,1,1,3),maxColumn:Lt.clampedInt(t.maxColumn,this.defaultValue.maxColumn,1,1e4)}}}function fW(o){return o==="ctrlCmd"?Ke?"metaKey":"ctrlKey":"altKey"}class pW extends Jt{constructor(){super(80,"padding",{top:0,bottom:0},{"editor.padding.top":{type:"number",default:0,minimum:0,maximum:1e3,description:f("padding.top","Controls the amount of space between the top edge of the editor and the first line.")},"editor.padding.bottom":{type:"number",default:0,minimum:0,maximum:1e3,description:f("padding.bottom","Controls the amount of space between the bottom edge of the editor and the last line.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{top:Lt.clampedInt(t.top,0,0,1e3),bottom:Lt.clampedInt(t.bottom,0,0,1e3)}}}class mW extends Jt{constructor(){const e={enabled:!0,cycle:!0};super(81,"parameterHints",e,{"editor.parameterHints.enabled":{type:"boolean",default:e.enabled,description:f("parameterHints.enabled","Enables a pop-up that shows parameter documentation and type information as you type.")},"editor.parameterHints.cycle":{type:"boolean",default:e.cycle,description:f("parameterHints.cycle","Controls whether the parameter hints menu cycles or closes when reaching the end of the list.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{enabled:Le(t.enabled,this.defaultValue.enabled),cycle:Le(t.cycle,this.defaultValue.cycle)}}}class _W extends _f{constructor(){super(136)}compute(e,t,i){return e.pixelRatio}}class bW extends Jt{constructor(){const e={other:"on",comments:"off",strings:"off"},t=[{type:"boolean"},{type:"string",enum:["on","inline","off"],enumDescriptions:[f("on","Quick suggestions show inside the suggest widget"),f("inline","Quick suggestions show as ghost text"),f("off","Quick suggestions are disabled")]}];super(84,"quickSuggestions",e,{type:"object",additionalProperties:!1,properties:{strings:{anyOf:t,default:e.strings,description:f("quickSuggestions.strings","Enable quick suggestions inside strings.")},comments:{anyOf:t,default:e.comments,description:f("quickSuggestions.comments","Enable quick suggestions inside comments.")},other:{anyOf:t,default:e.other,description:f("quickSuggestions.other","Enable quick suggestions outside of strings and comments.")}},default:e,markdownDescription:f("quickSuggestions","Controls whether suggestions should automatically show up while typing. This can be controlled for typing in comments, strings, and other code. Quick suggestion can be configured to show as ghost text or with the suggest widget. Also be aware of the '{0}'-setting which controls if suggestions are triggered by special characters.","#editor.suggestOnTriggerCharacters#")}),this.defaultValue=e}validate(e){if(typeof e=="boolean"){const c=e?"on":"off";return{comments:c,strings:c,other:c}}if(!e||typeof e!="object")return this.defaultValue;const{other:t,comments:i,strings:n}=e,s=["on","inline","off"];let r,a,l;return typeof t=="boolean"?r=t?"on":"off":r=Di(t,this.defaultValue.other,s),typeof i=="boolean"?a=i?"on":"off":a=Di(i,this.defaultValue.comments,s),typeof n=="boolean"?l=n?"on":"off":l=Di(n,this.defaultValue.strings,s),{other:r,comments:a,strings:l}}}class vW extends Jt{constructor(){super(64,"lineNumbers",{renderType:1,renderFn:null},{type:"string",enum:["off","on","relative","interval"],enumDescriptions:[f("lineNumbers.off","Line numbers are not rendered."),f("lineNumbers.on","Line numbers are rendered as absolute number."),f("lineNumbers.relative","Line numbers are rendered as distance in lines to cursor position."),f("lineNumbers.interval","Line numbers are rendered every 10 lines.")],default:"on",description:f("lineNumbers","Controls the display of line numbers.")})}validate(e){let t=this.defaultValue.renderType,i=this.defaultValue.renderFn;return typeof e<"u"&&(typeof e=="function"?(t=4,i=e):e==="interval"?t=3:e==="relative"?t=2:e==="on"?t=1:t=0),{renderType:t,renderFn:i}}}function Nv(o){const e=o.get(92);return e==="editable"?o.get(86):e!=="on"}class CW extends Jt{constructor(){const e=[],t={type:"number",description:f("rulers.size","Number of monospace characters at which this editor ruler will render.")};super(96,"rulers",e,{type:"array",items:{anyOf:[t,{type:["object"],properties:{column:t,color:{type:"string",description:f("rulers.color","Color of this editor ruler."),format:"color-hex"}}}]},default:e,description:f("rulers","Render vertical rulers after a certain number of monospace characters. Use multiple values for multiple rulers. No rulers are drawn if array is empty.")})}validate(e){if(Array.isArray(e)){const t=[];for(const i of e)if(typeof i=="number")t.push({column:Lt.clampedInt(i,0,0,1e4),color:null});else if(i&&typeof i=="object"){const n=i;t.push({column:Lt.clampedInt(n.column,0,0,1e4),color:n.color})}return t.sort((i,n)=>i.column-n.column),t}return this.defaultValue}}function R2(o,e){if(typeof o!="string")return e;switch(o){case"hidden":return 2;case"visible":return 3;default:return 1}}let wW=class extends Jt{constructor(){const e={vertical:1,horizontal:1,arrowSize:11,useShadows:!0,verticalHasArrows:!1,horizontalHasArrows:!1,horizontalScrollbarSize:12,horizontalSliderSize:12,verticalScrollbarSize:14,verticalSliderSize:14,handleMouseWheel:!0,alwaysConsumeMouseWheel:!0,scrollByPage:!1};super(97,"scrollbar",e,{"editor.scrollbar.vertical":{type:"string",enum:["auto","visible","hidden"],enumDescriptions:[f("scrollbar.vertical.auto","The vertical scrollbar will be visible only when necessary."),f("scrollbar.vertical.visible","The vertical scrollbar will always be visible."),f("scrollbar.vertical.fit","The vertical scrollbar will always be hidden.")],default:"auto",description:f("scrollbar.vertical","Controls the visibility of the vertical scrollbar.")},"editor.scrollbar.horizontal":{type:"string",enum:["auto","visible","hidden"],enumDescriptions:[f("scrollbar.horizontal.auto","The horizontal scrollbar will be visible only when necessary."),f("scrollbar.horizontal.visible","The horizontal scrollbar will always be visible."),f("scrollbar.horizontal.fit","The horizontal scrollbar will always be hidden.")],default:"auto",description:f("scrollbar.horizontal","Controls the visibility of the horizontal scrollbar.")},"editor.scrollbar.verticalScrollbarSize":{type:"number",default:e.verticalScrollbarSize,description:f("scrollbar.verticalScrollbarSize","The width of the vertical scrollbar.")},"editor.scrollbar.horizontalScrollbarSize":{type:"number",default:e.horizontalScrollbarSize,description:f("scrollbar.horizontalScrollbarSize","The height of the horizontal scrollbar.")},"editor.scrollbar.scrollByPage":{type:"boolean",default:e.scrollByPage,description:f("scrollbar.scrollByPage","Controls whether clicks scroll by page or jump to click position.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e,i=Lt.clampedInt(t.horizontalScrollbarSize,this.defaultValue.horizontalScrollbarSize,0,1e3),n=Lt.clampedInt(t.verticalScrollbarSize,this.defaultValue.verticalScrollbarSize,0,1e3);return{arrowSize:Lt.clampedInt(t.arrowSize,this.defaultValue.arrowSize,0,1e3),vertical:R2(t.vertical,this.defaultValue.vertical),horizontal:R2(t.horizontal,this.defaultValue.horizontal),useShadows:Le(t.useShadows,this.defaultValue.useShadows),verticalHasArrows:Le(t.verticalHasArrows,this.defaultValue.verticalHasArrows),horizontalHasArrows:Le(t.horizontalHasArrows,this.defaultValue.horizontalHasArrows),handleMouseWheel:Le(t.handleMouseWheel,this.defaultValue.handleMouseWheel),alwaysConsumeMouseWheel:Le(t.alwaysConsumeMouseWheel,this.defaultValue.alwaysConsumeMouseWheel),horizontalScrollbarSize:i,horizontalSliderSize:Lt.clampedInt(t.horizontalSliderSize,i,0,1e3),verticalScrollbarSize:n,verticalSliderSize:Lt.clampedInt(t.verticalSliderSize,n,0,1e3),scrollByPage:Le(t.scrollByPage,this.defaultValue.scrollByPage)}}};const xs="inUntrustedWorkspace",Zn={allowedCharacters:"editor.unicodeHighlight.allowedCharacters",invisibleCharacters:"editor.unicodeHighlight.invisibleCharacters",nonBasicASCII:"editor.unicodeHighlight.nonBasicASCII",ambiguousCharacters:"editor.unicodeHighlight.ambiguousCharacters",includeComments:"editor.unicodeHighlight.includeComments",includeStrings:"editor.unicodeHighlight.includeStrings",allowedLocales:"editor.unicodeHighlight.allowedLocales"};class SW extends Jt{constructor(){const e={nonBasicASCII:xs,invisibleCharacters:!0,ambiguousCharacters:!0,includeComments:xs,includeStrings:!0,allowedCharacters:{},allowedLocales:{_os:!0,_vscode:!0}};super(119,"unicodeHighlight",e,{[Zn.nonBasicASCII]:{restricted:!0,type:["boolean","string"],enum:[!0,!1,xs],default:e.nonBasicASCII,description:f("unicodeHighlight.nonBasicASCII","Controls whether all non-basic ASCII characters are highlighted. Only characters between U+0020 and U+007E, tab, line-feed and carriage-return are considered basic ASCII.")},[Zn.invisibleCharacters]:{restricted:!0,type:"boolean",default:e.invisibleCharacters,description:f("unicodeHighlight.invisibleCharacters","Controls whether characters that just reserve space or have no width at all are highlighted.")},[Zn.ambiguousCharacters]:{restricted:!0,type:"boolean",default:e.ambiguousCharacters,description:f("unicodeHighlight.ambiguousCharacters","Controls whether characters are highlighted that can be confused with basic ASCII characters, except those that are common in the current user locale.")},[Zn.includeComments]:{restricted:!0,type:["boolean","string"],enum:[!0,!1,xs],default:e.includeComments,description:f("unicodeHighlight.includeComments","Controls whether characters in comments should also be subject to Unicode highlighting.")},[Zn.includeStrings]:{restricted:!0,type:["boolean","string"],enum:[!0,!1,xs],default:e.includeStrings,description:f("unicodeHighlight.includeStrings","Controls whether characters in strings should also be subject to Unicode highlighting.")},[Zn.allowedCharacters]:{restricted:!0,type:"object",default:e.allowedCharacters,description:f("unicodeHighlight.allowedCharacters","Defines allowed characters that are not being highlighted."),additionalProperties:{type:"boolean"}},[Zn.allowedLocales]:{restricted:!0,type:"object",additionalProperties:{type:"boolean"},default:e.allowedLocales,description:f("unicodeHighlight.allowedLocales","Unicode characters that are common in allowed locales are not being highlighted.")}})}applyUpdate(e,t){let i=!1;t.allowedCharacters&&e&&(so(e.allowedCharacters,t.allowedCharacters)||(e=Object.assign(Object.assign({},e),{allowedCharacters:t.allowedCharacters}),i=!0)),t.allowedLocales&&e&&(so(e.allowedLocales,t.allowedLocales)||(e=Object.assign(Object.assign({},e),{allowedLocales:t.allowedLocales}),i=!0));const n=super.applyUpdate(e,t);return i?new Hp(n.newValue,!0):n}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{nonBasicASCII:lg(t.nonBasicASCII,xs,[!0,!1,xs]),invisibleCharacters:Le(t.invisibleCharacters,this.defaultValue.invisibleCharacters),ambiguousCharacters:Le(t.ambiguousCharacters,this.defaultValue.ambiguousCharacters),includeComments:lg(t.includeComments,xs,[!0,!1,xs]),includeStrings:lg(t.includeStrings,xs,[!0,!1,xs]),allowedCharacters:this.validateBooleanMap(e.allowedCharacters,this.defaultValue.allowedCharacters),allowedLocales:this.validateBooleanMap(e.allowedLocales,this.defaultValue.allowedLocales)}}validateBooleanMap(e,t){if(typeof e!="object"||!e)return t;const i={};for(const[n,s]of Object.entries(e))s===!0&&(i[n]=!0);return i}}class yW extends Jt{constructor(){const e={enabled:!0,mode:"subwordSmart",showToolbar:"onHover"};super(59,"inlineSuggest",e,{"editor.inlineSuggest.enabled":{type:"boolean",default:e.enabled,description:f("inlineSuggest.enabled","Controls whether to automatically show inline suggestions in the editor.")},"editor.inlineSuggest.showToolbar":{type:"string",default:e.showToolbar,enum:["always","onHover"],enumDescriptions:[f("inlineSuggest.showToolbar.always","Show the inline suggestion toolbar whenever an inline suggestion is shown."),f("inlineSuggest.showToolbar.onHover","Show the inline suggestion toolbar when hovering over an inline suggestion.")],description:f("inlineSuggest.showToolbar","Controls when to show the inline suggestion toolbar.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{enabled:Le(t.enabled,this.defaultValue.enabled),mode:Di(t.mode,this.defaultValue.mode,["prefix","subword","subwordSmart"]),showToolbar:Di(t.showToolbar,this.defaultValue.showToolbar,["always","onHover"])}}}class LW extends Jt{constructor(){const e={enabled:_n.bracketPairColorizationOptions.enabled,independentColorPoolPerBracketType:_n.bracketPairColorizationOptions.independentColorPoolPerBracketType};super(12,"bracketPairColorization",e,{"editor.bracketPairColorization.enabled":{type:"boolean",default:e.enabled,markdownDescription:f("bracketPairColorization.enabled","Controls whether bracket pair colorization is enabled or not. Use {0} to override the bracket highlight colors.","`#workbench.colorCustomizations#`")},"editor.bracketPairColorization.independentColorPoolPerBracketType":{type:"boolean",default:e.independentColorPoolPerBracketType,description:f("bracketPairColorization.independentColorPoolPerBracketType","Controls whether each bracket type has its own independent color pool.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{enabled:Le(t.enabled,this.defaultValue.enabled),independentColorPoolPerBracketType:Le(t.independentColorPoolPerBracketType,this.defaultValue.independentColorPoolPerBracketType)}}}class DW extends Jt{constructor(){const e={bracketPairs:!1,bracketPairsHorizontal:"active",highlightActiveBracketPair:!0,indentation:!0,highlightActiveIndentation:!0};super(13,"guides",e,{"editor.guides.bracketPairs":{type:["boolean","string"],enum:[!0,"active",!1],enumDescriptions:[f("editor.guides.bracketPairs.true","Enables bracket pair guides."),f("editor.guides.bracketPairs.active","Enables bracket pair guides only for the active bracket pair."),f("editor.guides.bracketPairs.false","Disables bracket pair guides.")],default:e.bracketPairs,description:f("editor.guides.bracketPairs","Controls whether bracket pair guides are enabled or not.")},"editor.guides.bracketPairsHorizontal":{type:["boolean","string"],enum:[!0,"active",!1],enumDescriptions:[f("editor.guides.bracketPairsHorizontal.true","Enables horizontal guides as addition to vertical bracket pair guides."),f("editor.guides.bracketPairsHorizontal.active","Enables horizontal guides only for the active bracket pair."),f("editor.guides.bracketPairsHorizontal.false","Disables horizontal bracket pair guides.")],default:e.bracketPairsHorizontal,description:f("editor.guides.bracketPairsHorizontal","Controls whether horizontal bracket pair guides are enabled or not.")},"editor.guides.highlightActiveBracketPair":{type:"boolean",default:e.highlightActiveBracketPair,description:f("editor.guides.highlightActiveBracketPair","Controls whether the editor should highlight the active bracket pair.")},"editor.guides.indentation":{type:"boolean",default:e.indentation,description:f("editor.guides.indentation","Controls whether the editor should render indent guides.")},"editor.guides.highlightActiveIndentation":{type:["boolean","string"],enum:[!0,"always",!1],enumDescriptions:[f("editor.guides.highlightActiveIndentation.true","Highlights the active indent guide."),f("editor.guides.highlightActiveIndentation.always","Highlights the active indent guide even if bracket guides are highlighted."),f("editor.guides.highlightActiveIndentation.false","Do not highlight the active indent guide.")],default:e.highlightActiveIndentation,description:f("editor.guides.highlightActiveIndentation","Controls whether the editor should highlight the active indent guide.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{bracketPairs:lg(t.bracketPairs,this.defaultValue.bracketPairs,[!0,!1,"active"]),bracketPairsHorizontal:lg(t.bracketPairsHorizontal,this.defaultValue.bracketPairsHorizontal,[!0,!1,"active"]),highlightActiveBracketPair:Le(t.highlightActiveBracketPair,this.defaultValue.highlightActiveBracketPair),indentation:Le(t.indentation,this.defaultValue.indentation),highlightActiveIndentation:lg(t.highlightActiveIndentation,this.defaultValue.highlightActiveIndentation,[!0,!1,"always"])}}}function lg(o,e,t){const i=t.indexOf(o);return i===-1?e:t[i]}class xW extends Jt{constructor(){const e={insertMode:"insert",filterGraceful:!0,snippetsPreventQuickSuggestions:!0,localityBonus:!1,shareSuggestSelections:!1,selectionMode:"always",showIcons:!0,showStatusBar:!1,preview:!1,previewMode:"subwordSmart",showInlineDetails:!0,showMethods:!0,showFunctions:!0,showConstructors:!0,showDeprecated:!0,matchOnWordStartOnly:!0,showFields:!0,showVariables:!0,showClasses:!0,showStructs:!0,showInterfaces:!0,showModules:!0,showProperties:!0,showEvents:!0,showOperators:!0,showUnits:!0,showValues:!0,showConstants:!0,showEnums:!0,showEnumMembers:!0,showKeywords:!0,showWords:!0,showColors:!0,showFiles:!0,showReferences:!0,showFolders:!0,showTypeParameters:!0,showSnippets:!0,showUsers:!0,showIssues:!0};super(112,"suggest",e,{"editor.suggest.insertMode":{type:"string",enum:["insert","replace"],enumDescriptions:[f("suggest.insertMode.insert","Insert suggestion without overwriting text right of the cursor."),f("suggest.insertMode.replace","Insert suggestion and overwrite text right of the cursor.")],default:e.insertMode,description:f("suggest.insertMode","Controls whether words are overwritten when accepting completions. Note that this depends on extensions opting into this feature.")},"editor.suggest.filterGraceful":{type:"boolean",default:e.filterGraceful,description:f("suggest.filterGraceful","Controls whether filtering and sorting suggestions accounts for small typos.")},"editor.suggest.localityBonus":{type:"boolean",default:e.localityBonus,description:f("suggest.localityBonus","Controls whether sorting favors words that appear close to the cursor.")},"editor.suggest.shareSuggestSelections":{type:"boolean",default:e.shareSuggestSelections,markdownDescription:f("suggest.shareSuggestSelections","Controls whether remembered suggestion selections are shared between multiple workspaces and windows (needs `#editor.suggestSelection#`).")},"editor.suggest.selectionMode":{type:"string",enum:["always","never","whenTriggerCharacter","whenQuickSuggestion"],enumDescriptions:[f("suggest.insertMode.always","Always select a suggestion when automatically triggering IntelliSense."),f("suggest.insertMode.never","Never select a suggestion when automatically triggering IntelliSense."),f("suggest.insertMode.whenTriggerCharacter","Select a suggestion only when triggering IntelliSense from a trigger character."),f("suggest.insertMode.whenQuickSuggestion","Select a suggestion only when triggering IntelliSense as you type.")],default:e.selectionMode,markdownDescription:f("suggest.selectionMode","Controls whether a suggestion is selected when the widget shows. Note that this only applies to automatically triggered suggestions (`#editor.quickSuggestions#` and `#editor.suggestOnTriggerCharacters#`) and that a suggestion is always selected when explicitly invoked, e.g via `Ctrl+Space`.")},"editor.suggest.snippetsPreventQuickSuggestions":{type:"boolean",default:e.snippetsPreventQuickSuggestions,description:f("suggest.snippetsPreventQuickSuggestions","Controls whether an active snippet prevents quick suggestions.")},"editor.suggest.showIcons":{type:"boolean",default:e.showIcons,description:f("suggest.showIcons","Controls whether to show or hide icons in suggestions.")},"editor.suggest.showStatusBar":{type:"boolean",default:e.showStatusBar,description:f("suggest.showStatusBar","Controls the visibility of the status bar at the bottom of the suggest widget.")},"editor.suggest.preview":{type:"boolean",default:e.preview,description:f("suggest.preview","Controls whether to preview the suggestion outcome in the editor.")},"editor.suggest.showInlineDetails":{type:"boolean",default:e.showInlineDetails,description:f("suggest.showInlineDetails","Controls whether suggest details show inline with the label or only in the details widget.")},"editor.suggest.maxVisibleSuggestions":{type:"number",deprecationMessage:f("suggest.maxVisibleSuggestions.dep","This setting is deprecated. The suggest widget can now be resized.")},"editor.suggest.filteredTypes":{type:"object",deprecationMessage:f("deprecated","This setting is deprecated, please use separate settings like 'editor.suggest.showKeywords' or 'editor.suggest.showSnippets' instead.")},"editor.suggest.showMethods":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showMethods","When enabled IntelliSense shows `method`-suggestions.")},"editor.suggest.showFunctions":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showFunctions","When enabled IntelliSense shows `function`-suggestions.")},"editor.suggest.showConstructors":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showConstructors","When enabled IntelliSense shows `constructor`-suggestions.")},"editor.suggest.showDeprecated":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showDeprecated","When enabled IntelliSense shows `deprecated`-suggestions.")},"editor.suggest.matchOnWordStartOnly":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.matchOnWordStartOnly","When enabled IntelliSense filtering requires that the first character matches on a word start. For example, `c` on `Console` or `WebContext` but _not_ on `description`. When disabled IntelliSense will show more results but still sorts them by match quality.")},"editor.suggest.showFields":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showFields","When enabled IntelliSense shows `field`-suggestions.")},"editor.suggest.showVariables":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showVariables","When enabled IntelliSense shows `variable`-suggestions.")},"editor.suggest.showClasses":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showClasss","When enabled IntelliSense shows `class`-suggestions.")},"editor.suggest.showStructs":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showStructs","When enabled IntelliSense shows `struct`-suggestions.")},"editor.suggest.showInterfaces":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showInterfaces","When enabled IntelliSense shows `interface`-suggestions.")},"editor.suggest.showModules":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showModules","When enabled IntelliSense shows `module`-suggestions.")},"editor.suggest.showProperties":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showPropertys","When enabled IntelliSense shows `property`-suggestions.")},"editor.suggest.showEvents":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showEvents","When enabled IntelliSense shows `event`-suggestions.")},"editor.suggest.showOperators":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showOperators","When enabled IntelliSense shows `operator`-suggestions.")},"editor.suggest.showUnits":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showUnits","When enabled IntelliSense shows `unit`-suggestions.")},"editor.suggest.showValues":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showValues","When enabled IntelliSense shows `value`-suggestions.")},"editor.suggest.showConstants":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showConstants","When enabled IntelliSense shows `constant`-suggestions.")},"editor.suggest.showEnums":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showEnums","When enabled IntelliSense shows `enum`-suggestions.")},"editor.suggest.showEnumMembers":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showEnumMembers","When enabled IntelliSense shows `enumMember`-suggestions.")},"editor.suggest.showKeywords":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showKeywords","When enabled IntelliSense shows `keyword`-suggestions.")},"editor.suggest.showWords":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showTexts","When enabled IntelliSense shows `text`-suggestions.")},"editor.suggest.showColors":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showColors","When enabled IntelliSense shows `color`-suggestions.")},"editor.suggest.showFiles":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showFiles","When enabled IntelliSense shows `file`-suggestions.")},"editor.suggest.showReferences":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showReferences","When enabled IntelliSense shows `reference`-suggestions.")},"editor.suggest.showCustomcolors":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showCustomcolors","When enabled IntelliSense shows `customcolor`-suggestions.")},"editor.suggest.showFolders":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showFolders","When enabled IntelliSense shows `folder`-suggestions.")},"editor.suggest.showTypeParameters":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showTypeParameters","When enabled IntelliSense shows `typeParameter`-suggestions.")},"editor.suggest.showSnippets":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showSnippets","When enabled IntelliSense shows `snippet`-suggestions.")},"editor.suggest.showUsers":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showUsers","When enabled IntelliSense shows `user`-suggestions.")},"editor.suggest.showIssues":{type:"boolean",default:!0,markdownDescription:f("editor.suggest.showIssues","When enabled IntelliSense shows `issues`-suggestions.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{insertMode:Di(t.insertMode,this.defaultValue.insertMode,["insert","replace"]),filterGraceful:Le(t.filterGraceful,this.defaultValue.filterGraceful),snippetsPreventQuickSuggestions:Le(t.snippetsPreventQuickSuggestions,this.defaultValue.filterGraceful),localityBonus:Le(t.localityBonus,this.defaultValue.localityBonus),shareSuggestSelections:Le(t.shareSuggestSelections,this.defaultValue.shareSuggestSelections),selectionMode:Di(t.selectionMode,this.defaultValue.selectionMode,["always","never","whenQuickSuggestion","whenTriggerCharacter"]),showIcons:Le(t.showIcons,this.defaultValue.showIcons),showStatusBar:Le(t.showStatusBar,this.defaultValue.showStatusBar),preview:Le(t.preview,this.defaultValue.preview),previewMode:Di(t.previewMode,this.defaultValue.previewMode,["prefix","subword","subwordSmart"]),showInlineDetails:Le(t.showInlineDetails,this.defaultValue.showInlineDetails),showMethods:Le(t.showMethods,this.defaultValue.showMethods),showFunctions:Le(t.showFunctions,this.defaultValue.showFunctions),showConstructors:Le(t.showConstructors,this.defaultValue.showConstructors),showDeprecated:Le(t.showDeprecated,this.defaultValue.showDeprecated),matchOnWordStartOnly:Le(t.matchOnWordStartOnly,this.defaultValue.matchOnWordStartOnly),showFields:Le(t.showFields,this.defaultValue.showFields),showVariables:Le(t.showVariables,this.defaultValue.showVariables),showClasses:Le(t.showClasses,this.defaultValue.showClasses),showStructs:Le(t.showStructs,this.defaultValue.showStructs),showInterfaces:Le(t.showInterfaces,this.defaultValue.showInterfaces),showModules:Le(t.showModules,this.defaultValue.showModules),showProperties:Le(t.showProperties,this.defaultValue.showProperties),showEvents:Le(t.showEvents,this.defaultValue.showEvents),showOperators:Le(t.showOperators,this.defaultValue.showOperators),showUnits:Le(t.showUnits,this.defaultValue.showUnits),showValues:Le(t.showValues,this.defaultValue.showValues),showConstants:Le(t.showConstants,this.defaultValue.showConstants),showEnums:Le(t.showEnums,this.defaultValue.showEnums),showEnumMembers:Le(t.showEnumMembers,this.defaultValue.showEnumMembers),showKeywords:Le(t.showKeywords,this.defaultValue.showKeywords),showWords:Le(t.showWords,this.defaultValue.showWords),showColors:Le(t.showColors,this.defaultValue.showColors),showFiles:Le(t.showFiles,this.defaultValue.showFiles),showReferences:Le(t.showReferences,this.defaultValue.showReferences),showFolders:Le(t.showFolders,this.defaultValue.showFolders),showTypeParameters:Le(t.showTypeParameters,this.defaultValue.showTypeParameters),showSnippets:Le(t.showSnippets,this.defaultValue.showSnippets),showUsers:Le(t.showUsers,this.defaultValue.showUsers),showIssues:Le(t.showIssues,this.defaultValue.showIssues)}}}class kW extends Jt{constructor(){super(107,"smartSelect",{selectLeadingAndTrailingWhitespace:!0},{"editor.smartSelect.selectLeadingAndTrailingWhitespace":{description:f("selectLeadingAndTrailingWhitespace","Whether leading and trailing whitespace should always be selected."),default:!0,type:"boolean"}})}validate(e){return!e||typeof e!="object"?this.defaultValue:{selectLeadingAndTrailingWhitespace:Le(e.selectLeadingAndTrailingWhitespace,this.defaultValue.selectLeadingAndTrailingWhitespace)}}}class IW extends _f{constructor(){super(137)}compute(e,t,i){return t.get(86)?!0:e.tabFocusMode}}class EW extends Jt{constructor(){super(131,"wrappingIndent",1,{"editor.wrappingIndent":{type:"string",enum:["none","same","indent","deepIndent"],enumDescriptions:[f("wrappingIndent.none","No indentation. Wrapped lines begin at column 1."),f("wrappingIndent.same","Wrapped lines get the same indentation as the parent."),f("wrappingIndent.indent","Wrapped lines get +1 indentation toward the parent."),f("wrappingIndent.deepIndent","Wrapped lines get +2 indentation toward the parent.")],description:f("wrappingIndent","Controls the indentation of wrapped lines."),default:"same"}})}validate(e){switch(e){case"none":return 0;case"same":return 1;case"indent":return 2;case"deepIndent":return 3}return 1}compute(e,t,i){return t.get(2)===2?0:i}}class TW extends _f{constructor(){super(139)}compute(e,t,i){const n=t.get(138);return{isDominatedByLongLines:e.isDominatedByLongLines,isWordWrapMinified:n.isWordWrapMinified,isViewportWrapping:n.isViewportWrapping,wrappingColumn:n.wrappingColumn}}}class NW extends Jt{constructor(){const e={enabled:!0};super(33,"dropIntoEditor",e,{"editor.dropIntoEditor.enabled":{type:"boolean",default:e.enabled,markdownDescription:f("dropIntoEditor.enabled","Controls whether you can drag and drop a file into a text editor by holding down `shift` (instead of opening the file in an editor).")}})}validate(e){return!e||typeof e!="object"?this.defaultValue:{enabled:Le(e.enabled,this.defaultValue.enabled)}}}const MW="Consolas, 'Courier New', monospace",AW="Menlo, Monaco, 'Courier New', monospace",RW="'Droid Sans Mono', 'monospace', monospace",ps={fontFamily:Ke?AW:hn?RW:MW,fontWeight:"normal",fontSize:Ke?12:14,lineHeight:0,letterSpacing:0},Bu=[];function ee(o){return Bu[o.id]=o,o}const Dr={acceptSuggestionOnCommitCharacter:ee(new ct(0,"acceptSuggestionOnCommitCharacter",!0,{markdownDescription:f("acceptSuggestionOnCommitCharacter","Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`;`) can be a commit character that accepts a suggestion and types that character.")})),acceptSuggestionOnEnter:ee(new ai(1,"acceptSuggestionOnEnter","on",["on","smart","off"],{markdownEnumDescriptions:["",f("acceptSuggestionOnEnterSmart","Only accept a suggestion with `Enter` when it makes a textual change."),""],markdownDescription:f("acceptSuggestionOnEnter","Controls whether suggestions should be accepted on `Enter`, in addition to `Tab`. Helps to avoid ambiguity between inserting new lines or accepting suggestions.")})),accessibilitySupport:ee(new Y6),accessibilityPageSize:ee(new Lt(3,"accessibilityPageSize",10,1,1073741824,{description:f("accessibilityPageSize","Controls the number of lines in the editor that can be read out by a screen reader at once. When we detect a screen reader we automatically set the default to be 500. Warning: this has a performance implication for numbers larger than the default."),tags:["accessibility"]})),ariaLabel:ee(new ds(4,"ariaLabel",f("editorViewAccessibleLabel","Editor content"))),autoClosingBrackets:ee(new ai(5,"autoClosingBrackets","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",f("editor.autoClosingBrackets.languageDefined","Use language configurations to determine when to autoclose brackets."),f("editor.autoClosingBrackets.beforeWhitespace","Autoclose brackets only when the cursor is to the left of whitespace."),""],description:f("autoClosingBrackets","Controls whether the editor should automatically close brackets after the user adds an opening bracket.")})),autoClosingDelete:ee(new ai(6,"autoClosingDelete","auto",["always","auto","never"],{enumDescriptions:["",f("editor.autoClosingDelete.auto","Remove adjacent closing quotes or brackets only if they were automatically inserted."),""],description:f("autoClosingDelete","Controls whether the editor should remove adjacent closing quotes or brackets when deleting.")})),autoClosingOvertype:ee(new ai(7,"autoClosingOvertype","auto",["always","auto","never"],{enumDescriptions:["",f("editor.autoClosingOvertype.auto","Type over closing quotes or brackets only if they were automatically inserted."),""],description:f("autoClosingOvertype","Controls whether the editor should type over closing quotes or brackets.")})),autoClosingQuotes:ee(new ai(8,"autoClosingQuotes","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",f("editor.autoClosingQuotes.languageDefined","Use language configurations to determine when to autoclose quotes."),f("editor.autoClosingQuotes.beforeWhitespace","Autoclose quotes only when the cursor is to the left of whitespace."),""],description:f("autoClosingQuotes","Controls whether the editor should automatically close quotes after the user adds an opening quote.")})),autoIndent:ee(new Tb(9,"autoIndent",4,"full",["none","keep","brackets","advanced","full"],Z6,{enumDescriptions:[f("editor.autoIndent.none","The editor will not insert indentation automatically."),f("editor.autoIndent.keep","The editor will keep the current line's indentation."),f("editor.autoIndent.brackets","The editor will keep the current line's indentation and honor language defined brackets."),f("editor.autoIndent.advanced","The editor will keep the current line's indentation, honor language defined brackets and invoke special onEnterRules defined by languages."),f("editor.autoIndent.full","The editor will keep the current line's indentation, honor language defined brackets, invoke special onEnterRules defined by languages, and honor indentationRules defined by languages.")],description:f("autoIndent","Controls whether the editor should automatically adjust the indentation when users type, paste, move or indent lines.")})),automaticLayout:ee(new ct(10,"automaticLayout",!1)),autoSurround:ee(new ai(11,"autoSurround","languageDefined",["languageDefined","quotes","brackets","never"],{enumDescriptions:[f("editor.autoSurround.languageDefined","Use language configurations to determine when to automatically surround selections."),f("editor.autoSurround.quotes","Surround with quotes but not brackets."),f("editor.autoSurround.brackets","Surround with brackets but not quotes."),""],description:f("autoSurround","Controls whether the editor should automatically surround selections when typing quotes or brackets.")})),bracketPairColorization:ee(new LW),bracketPairGuides:ee(new DW),stickyTabStops:ee(new ct(110,"stickyTabStops",!1,{description:f("stickyTabStops","Emulate selection behavior of tab characters when using spaces for indentation. Selection will stick to tab stops.")})),codeLens:ee(new ct(14,"codeLens",!0,{description:f("codeLens","Controls whether the editor shows CodeLens.")})),codeLensFontFamily:ee(new ds(15,"codeLensFontFamily","",{description:f("codeLensFontFamily","Controls the font family for CodeLens.")})),codeLensFontSize:ee(new Lt(16,"codeLensFontSize",0,0,100,{type:"number",default:0,minimum:0,maximum:100,markdownDescription:f("codeLensFontSize","Controls the font size in pixels for CodeLens. When set to 0, 90% of `#editor.fontSize#` is used.")})),colorDecorators:ee(new ct(17,"colorDecorators",!0,{description:f("colorDecorators","Controls whether the editor should render the inline color decorators and color picker.")})),colorDecoratorsLimit:ee(new Lt(18,"colorDecoratorsLimit",500,1,1e6,{markdownDescription:f("colorDecoratorsLimit","Controls the max number of color decorators that can be rendered in an editor at once.")})),columnSelection:ee(new ct(19,"columnSelection",!1,{description:f("columnSelection","Enable that the selection with the mouse and keys is doing column selection.")})),comments:ee(new Q6),contextmenu:ee(new ct(21,"contextmenu",!0)),copyWithSyntaxHighlighting:ee(new ct(22,"copyWithSyntaxHighlighting",!0,{description:f("copyWithSyntaxHighlighting","Controls whether syntax highlighting should be copied into the clipboard.")})),cursorBlinking:ee(new Tb(23,"cursorBlinking",1,"blink",["blink","smooth","phase","expand","solid"],X6,{description:f("cursorBlinking","Control the cursor animation style.")})),cursorSmoothCaretAnimation:ee(new ai(24,"cursorSmoothCaretAnimation","off",["off","explicit","on"],{enumDescriptions:[f("cursorSmoothCaretAnimation.off","Smooth caret animation is disabled."),f("cursorSmoothCaretAnimation.explicit","Smooth caret animation is enabled only when the user moves the cursor with an explicit gesture."),f("cursorSmoothCaretAnimation.on","Smooth caret animation is always enabled.")],description:f("cursorSmoothCaretAnimation","Controls whether the smooth caret animation should be enabled.")})),cursorStyle:ee(new Tb(25,"cursorStyle",Gi.Line,"line",["line","block","underline","line-thin","block-outline","underline-thin"],J6,{description:f("cursorStyle","Controls the cursor style.")})),cursorSurroundingLines:ee(new Lt(26,"cursorSurroundingLines",0,0,1073741824,{description:f("cursorSurroundingLines","Controls the minimal number of visible leading lines (minimum 0) and trailing lines (minimum 1) surrounding the cursor. Known as 'scrollOff' or 'scrollOffset' in some other editors.")})),cursorSurroundingLinesStyle:ee(new ai(27,"cursorSurroundingLinesStyle","default",["default","all"],{enumDescriptions:[f("cursorSurroundingLinesStyle.default","`cursorSurroundingLines` is enforced only when triggered via the keyboard or API."),f("cursorSurroundingLinesStyle.all","`cursorSurroundingLines` is enforced always.")],description:f("cursorSurroundingLinesStyle","Controls when `cursorSurroundingLines` should be enforced.")})),cursorWidth:ee(new Lt(28,"cursorWidth",0,0,1073741824,{markdownDescription:f("cursorWidth","Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.")})),disableLayerHinting:ee(new ct(29,"disableLayerHinting",!1)),disableMonospaceOptimizations:ee(new ct(30,"disableMonospaceOptimizations",!1)),domReadOnly:ee(new ct(31,"domReadOnly",!1)),dragAndDrop:ee(new ct(32,"dragAndDrop",!0,{description:f("dragAndDrop","Controls whether the editor should allow moving selections via drag and drop.")})),emptySelectionClipboard:ee(new tW),dropIntoEditor:ee(new NW),stickyScroll:ee(new cW),experimentalWhitespaceRendering:ee(new ai(35,"experimentalWhitespaceRendering","svg",["svg","font","off"],{enumDescriptions:[f("experimentalWhitespaceRendering.svg","Use a new rendering method with svgs."),f("experimentalWhitespaceRendering.font","Use a new rendering method with font characters."),f("experimentalWhitespaceRendering.off","Use the stable rendering method.")],description:f("experimentalWhitespaceRendering","Controls whether whitespace is rendered with a new, experimental method.")})),extraEditorClassName:ee(new ds(36,"extraEditorClassName","")),fastScrollSensitivity:ee(new Xr(37,"fastScrollSensitivity",5,o=>o<=0?5:o,{markdownDescription:f("fastScrollSensitivity","Scrolling speed multiplier when pressing `Alt`.")})),find:ee(new iW),fixedOverflowWidgets:ee(new ct(39,"fixedOverflowWidgets",!1)),folding:ee(new ct(40,"folding",!0,{description:f("folding","Controls whether the editor has code folding enabled.")})),foldingStrategy:ee(new ai(41,"foldingStrategy","auto",["auto","indentation"],{enumDescriptions:[f("foldingStrategy.auto","Use a language-specific folding strategy if available, else the indentation-based one."),f("foldingStrategy.indentation","Use the indentation-based folding strategy.")],description:f("foldingStrategy","Controls the strategy for computing folding ranges.")})),foldingHighlight:ee(new ct(42,"foldingHighlight",!0,{description:f("foldingHighlight","Controls whether the editor should highlight folded ranges.")})),foldingImportsByDefault:ee(new ct(43,"foldingImportsByDefault",!1,{description:f("foldingImportsByDefault","Controls whether the editor automatically collapses import ranges.")})),foldingMaximumRegions:ee(new Lt(44,"foldingMaximumRegions",5e3,10,65e3,{description:f("foldingMaximumRegions","The maximum number of foldable regions. Increasing this value may result in the editor becoming less responsive when the current source has a large number of foldable regions.")})),unfoldOnClickAfterEndOfLine:ee(new ct(45,"unfoldOnClickAfterEndOfLine",!1,{description:f("unfoldOnClickAfterEndOfLine","Controls whether clicking on the empty content after a folded line will unfold the line.")})),fontFamily:ee(new ds(46,"fontFamily",ps.fontFamily,{description:f("fontFamily","Controls the font family.")})),fontInfo:ee(new nW),fontLigatures2:ee(new As),fontSize:ee(new sW),fontWeight:ee(new Ur),fontVariations:ee(new or),formatOnPaste:ee(new ct(52,"formatOnPaste",!1,{description:f("formatOnPaste","Controls whether the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.")})),formatOnType:ee(new ct(53,"formatOnType",!1,{description:f("formatOnType","Controls whether the editor should automatically format the line after typing.")})),glyphMargin:ee(new ct(54,"glyphMargin",!0,{description:f("glyphMargin","Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.")})),gotoLocation:ee(new oW),hideCursorInOverviewRuler:ee(new ct(56,"hideCursorInOverviewRuler",!1,{description:f("hideCursorInOverviewRuler","Controls whether the cursor should be hidden in the overview ruler.")})),hover:ee(new rW),inDiffEditor:ee(new ct(58,"inDiffEditor",!1)),letterSpacing:ee(new Xr(60,"letterSpacing",ps.letterSpacing,o=>Xr.clamp(o,-5,20),{description:f("letterSpacing","Controls the letter spacing in pixels.")})),lightbulb:ee(new lW),lineDecorationsWidth:ee(new hW),lineHeight:ee(new uW),lineNumbers:ee(new vW),lineNumbersMinChars:ee(new Lt(65,"lineNumbersMinChars",5,1,300)),linkedEditing:ee(new ct(66,"linkedEditing",!1,{description:f("linkedEditing","Controls whether the editor has linked editing enabled. Depending on the language, related symbols such as HTML tags, are updated while editing.")})),links:ee(new ct(67,"links",!0,{description:f("links","Controls whether the editor should detect links and make them clickable.")})),matchBrackets:ee(new ai(68,"matchBrackets","always",["always","near","never"],{description:f("matchBrackets","Highlight matching brackets.")})),minimap:ee(new gW),mouseStyle:ee(new ai(70,"mouseStyle","text",["text","default","copy"])),mouseWheelScrollSensitivity:ee(new Xr(71,"mouseWheelScrollSensitivity",1,o=>o===0?1:o,{markdownDescription:f("mouseWheelScrollSensitivity","A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.")})),mouseWheelZoom:ee(new ct(72,"mouseWheelZoom",!1,{markdownDescription:f("mouseWheelZoom","Zoom the font of the editor when using mouse wheel and holding `Ctrl`.")})),multiCursorMergeOverlapping:ee(new ct(73,"multiCursorMergeOverlapping",!0,{description:f("multiCursorMergeOverlapping","Merge multiple cursors when they are overlapping.")})),multiCursorModifier:ee(new Tb(74,"multiCursorModifier","altKey","alt",["ctrlCmd","alt"],fW,{markdownEnumDescriptions:[f("multiCursorModifier.ctrlCmd","Maps to `Control` on Windows and Linux and to `Command` on macOS."),f("multiCursorModifier.alt","Maps to `Alt` on Windows and Linux and to `Option` on macOS.")],markdownDescription:f({key:"multiCursorModifier",comment:["- `ctrlCmd` refers to a value the setting can take and should not be localized.","- `Control` and `Command` refer to the modifier keys Ctrl or Cmd on the keyboard and can be localized."]},"The modifier to be used to add multiple cursors with the mouse. The Go to Definition and Open Link mouse gestures will adapt such that they do not conflict with the [multicursor modifier](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).")})),multiCursorPaste:ee(new ai(75,"multiCursorPaste","spread",["spread","full"],{markdownEnumDescriptions:[f("multiCursorPaste.spread","Each cursor pastes a single line of the text."),f("multiCursorPaste.full","Each cursor pastes the full text.")],markdownDescription:f("multiCursorPaste","Controls pasting when the line count of the pasted text matches the cursor count.")})),multiCursorLimit:ee(new Lt(76,"multiCursorLimit",1e4,1,1e5,{markdownDescription:f("multiCursorLimit","Controls the max number of cursors that can be in an active editor at once.")})),occurrencesHighlight:ee(new ct(77,"occurrencesHighlight",!0,{description:f("occurrencesHighlight","Controls whether the editor should highlight semantic symbol occurrences.")})),overviewRulerBorder:ee(new ct(78,"overviewRulerBorder",!0,{description:f("overviewRulerBorder","Controls whether a border should be drawn around the overview ruler.")})),overviewRulerLanes:ee(new Lt(79,"overviewRulerLanes",3,0,3)),padding:ee(new pW),parameterHints:ee(new mW),peekWidgetDefaultFocus:ee(new ai(82,"peekWidgetDefaultFocus","tree",["tree","editor"],{enumDescriptions:[f("peekWidgetDefaultFocus.tree","Focus the tree when opening peek"),f("peekWidgetDefaultFocus.editor","Focus the editor when opening peek")],description:f("peekWidgetDefaultFocus","Controls whether to focus the inline editor or the tree in the peek widget.")})),definitionLinkOpensInPeek:ee(new ct(83,"definitionLinkOpensInPeek",!1,{description:f("definitionLinkOpensInPeek","Controls whether the Go to Definition mouse gesture always opens the peek widget.")})),quickSuggestions:ee(new bW),quickSuggestionsDelay:ee(new Lt(85,"quickSuggestionsDelay",10,0,1073741824,{description:f("quickSuggestionsDelay","Controls the delay in milliseconds after which quick suggestions will show up.")})),readOnly:ee(new ct(86,"readOnly",!1)),renameOnType:ee(new ct(87,"renameOnType",!1,{description:f("renameOnType","Controls whether the editor auto renames on type."),markdownDeprecationMessage:f("renameOnTypeDeprecate","Deprecated, use `editor.linkedEditing` instead.")})),renderControlCharacters:ee(new ct(88,"renderControlCharacters",!0,{description:f("renderControlCharacters","Controls whether the editor should render control characters."),restricted:!0})),renderFinalNewline:ee(new ai(89,"renderFinalNewline",hn?"dimmed":"on",["off","on","dimmed"],{description:f("renderFinalNewline","Render last line number when the file ends with a newline.")})),renderLineHighlight:ee(new ai(90,"renderLineHighlight","line",["none","gutter","line","all"],{enumDescriptions:["","","",f("renderLineHighlight.all","Highlights both the gutter and the current line.")],description:f("renderLineHighlight","Controls how the editor should render the current line highlight.")})),renderLineHighlightOnlyWhenFocus:ee(new ct(91,"renderLineHighlightOnlyWhenFocus",!1,{description:f("renderLineHighlightOnlyWhenFocus","Controls if the editor should render the current line highlight only when the editor is focused.")})),renderValidationDecorations:ee(new ai(92,"renderValidationDecorations","editable",["editable","on","off"])),renderWhitespace:ee(new ai(93,"renderWhitespace","selection",["none","boundary","selection","trailing","all"],{enumDescriptions:["",f("renderWhitespace.boundary","Render whitespace characters except for single spaces between words."),f("renderWhitespace.selection","Render whitespace characters only on selected text."),f("renderWhitespace.trailing","Render only trailing whitespace characters."),""],description:f("renderWhitespace","Controls how the editor should render whitespace characters.")})),revealHorizontalRightPadding:ee(new Lt(94,"revealHorizontalRightPadding",15,0,1e3)),roundedSelection:ee(new ct(95,"roundedSelection",!0,{description:f("roundedSelection","Controls whether selections should have rounded corners.")})),rulers:ee(new CW),scrollbar:ee(new wW),scrollBeyondLastColumn:ee(new Lt(98,"scrollBeyondLastColumn",4,0,1073741824,{description:f("scrollBeyondLastColumn","Controls the number of extra characters beyond which the editor will scroll horizontally.")})),scrollBeyondLastLine:ee(new ct(99,"scrollBeyondLastLine",!0,{description:f("scrollBeyondLastLine","Controls whether the editor will scroll beyond the last line.")})),scrollPredominantAxis:ee(new ct(100,"scrollPredominantAxis",!0,{description:f("scrollPredominantAxis","Scroll only along the predominant axis when scrolling both vertically and horizontally at the same time. Prevents horizontal drift when scrolling vertically on a trackpad.")})),selectionClipboard:ee(new ct(101,"selectionClipboard",!0,{description:f("selectionClipboard","Controls whether the Linux primary clipboard should be supported."),included:hn})),selectionHighlight:ee(new ct(102,"selectionHighlight",!0,{description:f("selectionHighlight","Controls whether the editor should highlight matches similar to the selection.")})),selectOnLineNumbers:ee(new ct(103,"selectOnLineNumbers",!0)),showFoldingControls:ee(new ai(104,"showFoldingControls","mouseover",["always","never","mouseover"],{enumDescriptions:[f("showFoldingControls.always","Always show the folding controls."),f("showFoldingControls.never","Never show the folding controls and reduce the gutter size."),f("showFoldingControls.mouseover","Only show the folding controls when the mouse is over the gutter.")],description:f("showFoldingControls","Controls when the folding controls on the gutter are shown.")})),showUnused:ee(new ct(105,"showUnused",!0,{description:f("showUnused","Controls fading out of unused code.")})),showDeprecated:ee(new ct(133,"showDeprecated",!0,{description:f("showDeprecated","Controls strikethrough deprecated variables.")})),inlayHints:ee(new dW),snippetSuggestions:ee(new ai(106,"snippetSuggestions","inline",["top","bottom","inline","none"],{enumDescriptions:[f("snippetSuggestions.top","Show snippet suggestions on top of other suggestions."),f("snippetSuggestions.bottom","Show snippet suggestions below other suggestions."),f("snippetSuggestions.inline","Show snippets suggestions with other suggestions."),f("snippetSuggestions.none","Do not show snippet suggestions.")],description:f("snippetSuggestions","Controls whether snippets are shown with other suggestions and how they are sorted.")})),smartSelect:ee(new kW),smoothScrolling:ee(new ct(108,"smoothScrolling",!1,{description:f("smoothScrolling","Controls whether the editor will scroll using an animation.")})),stopRenderingLineAfter:ee(new Lt(111,"stopRenderingLineAfter",1e4,-1,1073741824)),suggest:ee(new xW),inlineSuggest:ee(new yW),suggestFontSize:ee(new Lt(113,"suggestFontSize",0,0,1e3,{markdownDescription:f("suggestFontSize","Font size for the suggest widget. When set to {0}, the value of {1} is used.","`0`","`#editor.fontSize#`")})),suggestLineHeight:ee(new Lt(114,"suggestLineHeight",0,0,1e3,{markdownDescription:f("suggestLineHeight","Line height for the suggest widget. When set to {0}, the value of {1} is used. The minimum value is 8.","`0`","`#editor.lineHeight#`")})),suggestOnTriggerCharacters:ee(new ct(115,"suggestOnTriggerCharacters",!0,{description:f("suggestOnTriggerCharacters","Controls whether suggestions should automatically show up when typing trigger characters.")})),suggestSelection:ee(new ai(116,"suggestSelection","first",["first","recentlyUsed","recentlyUsedByPrefix"],{markdownEnumDescriptions:[f("suggestSelection.first","Always select the first suggestion."),f("suggestSelection.recentlyUsed","Select recent suggestions unless further typing selects one, e.g. `console.| -> console.log` because `log` has been completed recently."),f("suggestSelection.recentlyUsedByPrefix","Select suggestions based on previous prefixes that have completed those suggestions, e.g. `co -> console` and `con -> const`.")],description:f("suggestSelection","Controls how suggestions are pre-selected when showing the suggest list.")})),tabCompletion:ee(new ai(117,"tabCompletion","off",["on","off","onlySnippets"],{enumDescriptions:[f("tabCompletion.on","Tab complete will insert the best matching suggestion when pressing tab."),f("tabCompletion.off","Disable tab completions."),f("tabCompletion.onlySnippets","Tab complete snippets when their prefix match. Works best when 'quickSuggestions' aren't enabled.")],description:f("tabCompletion","Enables tab completions.")})),tabIndex:ee(new Lt(118,"tabIndex",0,-1,1073741824)),unicodeHighlight:ee(new SW),unusualLineTerminators:ee(new ai(120,"unusualLineTerminators","prompt",["auto","off","prompt"],{enumDescriptions:[f("unusualLineTerminators.auto","Unusual line terminators are automatically removed."),f("unusualLineTerminators.off","Unusual line terminators are ignored."),f("unusualLineTerminators.prompt","Unusual line terminators prompt to be removed.")],description:f("unusualLineTerminators","Remove unusual line terminators that might cause problems.")})),useShadowDOM:ee(new ct(121,"useShadowDOM",!0)),useTabStops:ee(new ct(122,"useTabStops",!0,{description:f("useTabStops","Inserting and deleting whitespace follows tab stops.")})),wordBreak:ee(new ai(123,"wordBreak","normal",["normal","keepAll"],{markdownEnumDescriptions:[f("wordBreak.normal","Use the default line break rule."),f("wordBreak.keepAll","Word breaks should not be used for Chinese/Japanese/Korean (CJK) text. Non-CJK text behavior is the same as for normal.")],description:f("wordBreak","Controls the word break rules used for Chinese/Japanese/Korean (CJK) text.")})),wordSeparators:ee(new ds(124,"wordSeparators",p4,{description:f("wordSeparators","Characters that will be used as word separators when doing word related navigations or operations.")})),wordWrap:ee(new ai(125,"wordWrap","off",["off","on","wordWrapColumn","bounded"],{markdownEnumDescriptions:[f("wordWrap.off","Lines will never wrap."),f("wordWrap.on","Lines will wrap at the viewport width."),f({key:"wordWrap.wordWrapColumn",comment:["- `editor.wordWrapColumn` refers to a different setting and should not be localized."]},"Lines will wrap at `#editor.wordWrapColumn#`."),f({key:"wordWrap.bounded",comment:["- viewport means the edge of the visible window size.","- `editor.wordWrapColumn` refers to a different setting and should not be localized."]},"Lines will wrap at the minimum of viewport and `#editor.wordWrapColumn#`.")],description:f({key:"wordWrap",comment:["- 'off', 'on', 'wordWrapColumn' and 'bounded' refer to values the setting can take and should not be localized.","- `editor.wordWrapColumn` refers to a different setting and should not be localized."]},"Controls how lines should wrap.")})),wordWrapBreakAfterCharacters:ee(new ds(126,"wordWrapBreakAfterCharacters"," })]?|/&.,;¢°′″‰℃、。。、¢,.:;?!%・・ゝゞヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻ァィゥェォャュョッー”〉》」』】〕)]}」")),wordWrapBreakBeforeCharacters:ee(new ds(127,"wordWrapBreakBeforeCharacters","([{‘“〈《「『【〔([{「£¥$£¥++")),wordWrapColumn:ee(new Lt(128,"wordWrapColumn",80,1,1073741824,{markdownDescription:f({key:"wordWrapColumn",comment:["- `editor.wordWrap` refers to a different setting and should not be localized.","- 'wordWrapColumn' and 'bounded' refer to values the different setting can take and should not be localized."]},"Controls the wrapping column of the editor when `#editor.wordWrap#` is `wordWrapColumn` or `bounded`.")})),wordWrapOverride1:ee(new ai(129,"wordWrapOverride1","inherit",["off","on","inherit"])),wordWrapOverride2:ee(new ai(130,"wordWrapOverride2","inherit",["off","on","inherit"])),editorClassName:ee(new eW),pixelRatio:ee(new _W),tabFocusMode:ee(new IW),layoutInfo:ee(new ag),wrappingInfo:ee(new TW),wrappingIndent:ee(new EW),wrappingStrategy:ee(new aW)};class PW{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?Tg.isErrorNoTelemetry(e)?new Tg(e.message+`
@@ -629,7 +629,7 @@ ${e.toString()}`}}class XC{constructor(e=new gw,t=!1,i,n=Wie){var s;this._servic
`:`\r
`}};Bk=td([Zi(0,at)],Bk);class Yie{publicLog(e,t){return Promise.resolve(void 0)}publicLog2(e,t){return this.publicLog(e,t)}}class h_{constructor(){const e=Ce.from({scheme:h_.SCHEME,authority:"model",path:"/"});this.workspace={id:"4064f6ec-cb38-4ad0-af64-ee6467e63c82",folders:[new EJ({uri:e,name:"",index:0})]}}getWorkspace(){return this.workspace}getWorkspaceFolder(e){return e&&e.scheme===h_.SCHEME?this.workspace.folders[0]:null}}h_.SCHEME="inmemory";function JC(o,e,t){if(!e||!(o instanceof B7))return;const i=[];Object.keys(e).forEach(n=>{lJ(n)&&i.push([`editor.${n}`,e[n]]),t&&cJ(n)&&i.push([`diffEditor.${n}`,e[n]])}),i.length>0&&o.updateValues(i)}let Wk=class{constructor(e){this._modelService=e}hasPreviewHandler(){return!1}apply(e,t){return EN(this,void 0,void 0,function*(){const i=Array.isArray(e)?e:JT.convert(e),n=new Map;for(const a of i){if(!(a instanceof fl))throw new Error("bad edit - only text edits are supported");const l=this._modelService.getModel(a.resource);if(!l)throw new Error("bad edit - model not found");if(typeof a.versionId=="number"&&l.getVersionId()!==a.versionId)throw new Error("bad state - model changed in the meantime");let c=n.get(l);c||(c=[],n.set(l,c)),c.push(Wt.replaceMove(y.lift(a.textEdit.range),a.textEdit.text))}let s=0,r=0;for(const[a,l]of n)a.pushStackElement(),a.pushEditOperations([],l,()=>[]),a.pushStackElement(),r+=1,s+=l.length;return{ariaSummary:to(ek.bulkEditServiceSummary,s,r),isApplied:s>0}})}};Wk=td([Zi(0,jt)],Wk);class Qie{getUriLabel(e,t){return e.scheme==="file"?e.fsPath:e.path}getUriBasenameLabel(e){return uo(e)}}let Vk=class extends tk{constructor(e,t){super(e),this._codeEditorService=t}showContextView(e,t,i){if(!t){const n=this._codeEditorService.getFocusedCodeEditor()||this._codeEditorService.getActiveCodeEditor();n&&(t=n.getContainerDomNode())}return super.showContextView(e,t,i)}};Vk=td([Zi(0,kf),Zi(1,ut)],Vk);class Xie{constructor(){this._neverEmitter=new O,this.onDidChangeTrust=this._neverEmitter.event}isWorkspaceTrusted(){return!0}}class Jie extends t_{constructor(){super()}}class ene extends jie{constructor(){super(new Wz)}}let Hk=class extends rk{constructor(e,t,i,n,s,r){super(e,t,i,n,s,r),this.configure({blockMouse:!1})}};Hk=td([Zi(0,mo),Zi(1,_i),Zi(2,xl),Zi(3,ei),Zi(4,Ea),Zi(5,Ee)],Hk);class tne{playAudioCue(e,t){return EN(this,void 0,void 0,function*(){})}}ot(at,B7,0);ot(ZE,Fk,0);ot(SF,Bk,0);ot(Xm,h_,0);ot(Yg,Qie,0);ot(mo,Yie,0);ot(tb,Gie,0);ot(_i,d_,0);ot(Na,Kl,0);ot(Ut,Jie,0);ot(Ks,Die,0);ot(po,ene,0);ot(jt,jC,0);ot(iT,hk,0);ot(Ee,Rk,0);ot(QT,qie,0);ot(ed,Aw,0);ot(jo,oee,0);ot($o,tx,0);ot(ib,Wk,0);ot(K3,Xie,0);ot(os,Pk,0);ot(xa,Ek,0);ot(wo,Qte,0);ot(ri,Ok,0);ot(ei,tf,0);ot(Ma,kk,0);ot(xl,Vk,0);ot(vo,dk,0);ot(Dl,Ak,0);ot(xr,Hk,0);ot(Ea,Tk,0);ot(HE,tne,0);var ke;(function(o){const e=new gw;for(const[r,a]of Z2())e.set(r,a);const t=new XC(e,!0);e.set(Me,t);function i(r){const a=e.get(r);if(!a)throw new Error("Missing service "+r);return a instanceof Hr?t.invokeFunction(l=>l.get(r)):a}o.get=i;let n=!1;function s(r){if(n)return t;n=!0;for(const[a,l]of Z2())e.get(a)||e.set(a,l);for(const a in r)if(r.hasOwnProperty(a)){const l=Je(a);e.get(l)instanceof Hr&&e.set(l,r[a])}return t}o.initialize=s})(ke||(ke={}));var TN=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Bt=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let ine=0,IP=!1;function nne(o){if(!o){if(IP)return;IP=!0}f$(o||document.body)}let e1=class extends qg{constructor(e,t,i,n,s,r,a,l,c,d,h,u){const g=Object.assign({},t);g.ariaLabel=g.ariaLabel||PC.editorViewAccessibleLabel,g.ariaLabel=g.ariaLabel+";"+PC.accessibilityHelpMessage,super(e,g,{},i,n,s,r,l,c,d,h,u),a instanceof tf?this._standaloneKeybindingService=a:this._standaloneKeybindingService=null,nne(g.ariaContainerElement)}addCommand(e,t,i){if(!this._standaloneKeybindingService)return console.warn("Cannot add command because the editor is configured with an unrecognized KeybindingService"),null;const n="DYNAMIC_"+ ++ine,s=oe.deserialize(i);return this._standaloneKeybindingService.addDynamicKeybinding(n,e,t,s),n}createContextKey(e,t){return this._contextKeyService.createKey(e,t)}addAction(e){if(typeof e.id!="string"||typeof e.label!="string"||typeof e.run!="function")throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!");if(!this._standaloneKeybindingService)return console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"),U.None;const t=e.id,i=e.label,n=oe.and(oe.equals("editorId",this.getId()),oe.deserialize(e.precondition)),s=e.keybindings,r=oe.and(n,oe.deserialize(e.keybindingContext)),a=e.contextMenuGroupId||null,l=e.contextMenuOrder||0,c=(g,...p)=>Promise.resolve(e.run(this,...p)),d=new Z,h=this.getId()+":"+t;if(d.add(st.registerCommand(h,c)),a){const g={command:{id:h,title:i},when:n,group:a,order:l};d.add(Jn.appendMenuItem(T.EditorContext,g))}if(Array.isArray(s))for(const g of s)d.add(this._standaloneKeybindingService.addDynamicKeybinding(h,g,c,r));const u=new P5(h,i,i,n,c,this._contextKeyService);return this._actions.set(t,u),d.add(Pe(()=>{this._actions.delete(t)})),d}_triggerCommand(e,t){if(this._codeEditorService instanceof EC)try{this._codeEditorService.setActiveCodeEditor(this),super._triggerCommand(e,t)}finally{this._codeEditorService.setActiveCodeEditor(null)}else super._triggerCommand(e,t)}};e1=TN([Bt(2,Me),Bt(3,ut),Bt(4,ri),Bt(5,Ee),Bt(6,ei),Bt(7,Hi),Bt(8,_i),Bt(9,xa),Bt(10,ui),Bt(11,ge)],e1);let zk=class extends e1{constructor(e,t,i,n,s,r,a,l,c,d,h,u,g,p,m){const _=Object.assign({},t);JC(d,_,!1);const v=l.registerEditorContainer(e);typeof _.theme=="string"&&l.setTheme(_.theme),typeof _.autoDetectHighContrast<"u"&&l.setAutoDetectHighContrast(!!_.autoDetectHighContrast);const b=_.model;delete _.model,super(e,_,i,n,s,r,a,l,c,h,p,m),this._configurationService=d,this._standaloneThemeService=l,this._register(v);let C;if(typeof b>"u"){const S=g.getLanguageIdByMimeType(_.language)||_.language||Vs;C=W7(u,g,_.value||"",S,void 0),this._ownsModel=!0}else C=b,this._ownsModel=!1;if(this._attachModel(C),C){const S={oldModelUrl:null,newModelUrl:C.uri};this._onDidChangeModel.fire(S)}}dispose(){super.dispose()}updateOptions(e){JC(this._configurationService,e,!1),typeof e.theme=="string"&&this._standaloneThemeService.setTheme(e.theme),typeof e.autoDetectHighContrast<"u"&&this._standaloneThemeService.setAutoDetectHighContrast(!!e.autoDetectHighContrast),super.updateOptions(e)}_postDetachModelCleanup(e){super._postDetachModelCleanup(e),e&&this._ownsModel&&(e.dispose(),this._ownsModel=!1)}};zk=TN([Bt(2,Me),Bt(3,ut),Bt(4,ri),Bt(5,Ee),Bt(6,ei),Bt(7,Ks),Bt(8,_i),Bt(9,at),Bt(10,xa),Bt(11,jt),Bt(12,Ut),Bt(13,ui),Bt(14,ge)],zk);let Uk=class extends Oc{constructor(e,t,i,n,s,r,a,l,c,d,h){const u=Object.assign({},t);JC(l,u,!0);const g=r.registerEditorContainer(e);typeof u.theme=="string"&&r.setTheme(u.theme),typeof u.autoDetectHighContrast<"u"&&r.setAutoDetectHighContrast(!!u.autoDetectHighContrast),super(e,u,{},h,n,i,s,r,a,c,d),this._configurationService=l,this._standaloneThemeService=r,this._register(g)}dispose(){super.dispose()}updateOptions(e){JC(this._configurationService,e,!0),typeof e.theme=="string"&&this._standaloneThemeService.setTheme(e.theme),typeof e.autoDetectHighContrast<"u"&&this._standaloneThemeService.setAutoDetectHighContrast(!!e.autoDetectHighContrast),super.updateOptions(e)}_createInnerEditor(e,t,i){return e.createInstance(e1,t,i)}getOriginalEditor(){return super.getOriginalEditor()}getModifiedEditor(){return super.getModifiedEditor()}addCommand(e,t,i){return this.getModifiedEditor().addCommand(e,t,i)}createContextKey(e,t){return this.getModifiedEditor().createContextKey(e,t)}addAction(e){return this.getModifiedEditor().addAction(e)}};Uk=TN([Bt(2,Me),Bt(3,Ee),Bt(4,ut),Bt(5,Ks),Bt(6,_i),Bt(7,at),Bt(8,xr),Bt(9,ed),Bt(10,Dl)],Uk);function W7(o,e,t,i,n){if(t=t||"",!i){const s=t.indexOf(`
`);let r=t;return s!==-1&&(r=t.substring(0,s)),EP(o,t,e.createByFilepathOrFirstLine(n||null,r),n)}return EP(o,t,e.createById(i),n)}function EP(o,e,t,i){return o.createModel(e,t,i)}function sne(o,e,t){return ke.initialize(t||{}).createInstance(zk,o,e)}function one(o){return ke.get(ut).onCodeEditorAdd(t=>{o(t)})}function rne(o){return ke.get(ut).onDiffEditorAdd(t=>{o(t)})}function ane(){return ke.get(ut).listCodeEditors()}function lne(){return ke.get(ut).listDiffEditors()}function cne(o,e,t){return ke.initialize(t||{}).createInstance(Uk,o,e)}function dne(o,e){return ke.initialize({}).createInstance($D,o,e)}function hne(o){if(typeof o.id!="string"||typeof o.run!="function")throw new Error("Invalid command descriptor, `id` and `run` are required properties!");return st.registerCommand(o.id,o.run)}function une(o){if(typeof o.id!="string"||typeof o.label!="string"||typeof o.run!="function")throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!");const e=oe.deserialize(o.precondition),t=(n,...s)=>Ji.runEditorCommand(n,s,e,(r,a,l)=>Promise.resolve(o.run(a,...l))),i=new Z;if(i.add(st.registerCommand(o.id,t)),o.contextMenuGroupId){const n={command:{id:o.id,title:o.label},when:e,group:o.contextMenuGroupId,order:o.contextMenuOrder||0};i.add(Jn.appendMenuItem(T.EditorContext,n))}if(Array.isArray(o.keybindings)){const n=ke.get(ei);if(!(n instanceof tf))console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService");else{const s=oe.and(e,oe.deserialize(o.keybindingContext));i.add(n.addDynamicKeybindings(o.keybindings.map(r=>({keybinding:r,command:o.id,when:s}))))}}return i}function gne(o){return V7([o])}function V7(o){const e=ke.get(ei);return e instanceof tf?e.addDynamicKeybindings(o.map(t=>({keybinding:t.keybinding,command:t.command,commandArgs:t.commandArgs,when:oe.deserialize(t.when)}))):(console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"),U.None)}function fne(o,e,t){const i=ke.get(Ut),n=i.getLanguageIdByMimeType(e)||e;return W7(ke.get(jt),i,o,n,t)}function pne(o,e){const t=ke.get(Ut),i=ke.get(jt),n=t.getLanguageIdByMimeType(e)||e||Vs;i.setMode(o,t.createById(n))}function mne(o,e,t){o&&ke.get(Na).changeOne(e,o.uri,t)}function _ne(o){ke.get(Na).changeAll(o,[])}function bne(o){return ke.get(Na).read(o)}function vne(o){return ke.get(Na).onMarkerChanged(o)}function Cne(o){return ke.get(jt).getModel(o)}function wne(){return ke.get(jt).getModels()}function Sne(o){return ke.get(jt).onModelAdded(o)}function yne(o){return ke.get(jt).onModelRemoved(o)}function Lne(o){return ke.get(jt).onModelLanguageChanged(t=>{o({model:t.model,oldLanguage:t.oldLanguageId})})}function Dne(o){return jz(ke.get(jt),ke.get(ui),o)}function xne(o,e){const t=ke.get(Ut),i=ke.get(Ks);return i.registerEditorContainer(o),JE.colorizeElement(i,t,o,e)}function kne(o,e,t){const i=ke.get(Ut);return ke.get(Ks).registerEditorContainer(document.body),JE.colorize(i,o,e,t)}function Ine(o,e,t=4){return ke.get(Ks).registerEditorContainer(document.body),JE.colorizeModelLine(o,e,t)}function Ene(o){const e=Kt.get(o);return e||{getInitialState:()=>Bg,tokenize:(t,i,n)=>$E(o,n)}}function Tne(o,e){Kt.getOrCreate(e);const t=Ene(e),i=ma(o),n=[];let s=t.getInitialState();for(let r=0,a=i.length;r=100){i=i-100;const n=t.split(".");if(n.unshift(t),i=0&&(i.tokenSubst=!0),typeof t.bracket=="string")if(t.bracket==="@open")i.bracket=1;else if(t.bracket==="@close")i.bracket=-1;else throw Rt(o,"a 'bracket' attribute must be either '@open' or '@close', in rule: "+e);if(t.next){if(typeof t.next!="string")throw Rt(o,"the next state must be a string value in rule: "+e);{let n=t.next;if(!/^(@pop|@push|@popall)$/.test(n)&&(n[0]==="@"&&(n=n.substr(1)),n.indexOf("$")<0&&!dU(o,Gl(o,n,"",[],""))))throw Rt(o,"the next state '"+t.next+"' is not defined in rule: "+e);i.next=n}}return typeof t.goBack=="number"&&(i.goBack=t.goBack),typeof t.switchTo=="string"&&(i.switchTo=t.switchTo),typeof t.log=="string"&&(i.log=t.log),typeof t.nextEmbedded=="string"&&(i.nextEmbedded=t.nextEmbedded,o.usesEmbedded=!0),i}}else if(Array.isArray(t)){const i=[];for(let n=0,s=t.length;n0&&i[0]==="^",this.name=this.name+": "+i,this.regex=$k(e,"^(?:"+(this.matchOnlyAtLineStart?i.substr(1):i)+")")}setAction(e,t){this.action=jk(e,this.name,t)}}function H7(o,e){if(!e||typeof e!="object")throw new Error("Monarch: expecting a language definition object");const t={};t.languageId=o,t.includeLF=_0(e.includeLF,!1),t.noThrow=!1,t.maxStack=100,t.start=typeof e.start=="string"?e.start:null,t.ignoreCase=_0(e.ignoreCase,!1),t.unicode=_0(e.unicode,!1),t.tokenPostfix=TP(e.tokenPostfix,"."+t.languageId),t.defaultToken=TP(e.defaultToken,"source"),t.usesEmbedded=!1;const i=e;i.languageId=o,i.includeLF=t.includeLF,i.ignoreCase=t.ignoreCase,i.unicode=t.unicode,i.noThrow=t.noThrow,i.usesEmbedded=t.usesEmbedded,i.stateNames=e.tokenizer,i.defaultToken=t.defaultToken;function n(r,a,l){for(const c of l){let d=c.include;if(d){if(typeof d!="string")throw Rt(t,"an 'include' attribute must be a string at: "+r);if(d[0]==="@"&&(d=d.substr(1)),!e.tokenizer[d])throw Rt(t,"include target '"+d+"' is not defined at: "+r);n(r+"."+d,a,e.tokenizer[d])}else{const h=new Vne(r);if(Array.isArray(c)&&c.length>=1&&c.length<=3)if(h.setRegex(i,c[0]),c.length>=3)if(typeof c[1]=="string")h.setAction(i,{token:c[1],next:c[2]});else if(typeof c[1]=="object"){const u=c[1];u.next=c[2],h.setAction(i,u)}else throw Rt(t,"a next state as the last element of a rule can only be given if the action is either an object or a string, at: "+r);else h.setAction(i,c[1]);else{if(!c.regex)throw Rt(t,"a rule must either be an array, or an object with a 'regex' or 'include' field at: "+r);c.name&&typeof c.name=="string"&&(h.name=c.name),c.matchOnlyAtStart&&(h.matchOnlyAtLineStart=_0(c.matchOnlyAtLineStart,!1)),h.setRegex(i,c.regex),h.setAction(i,c.action)}a.push(h)}}}if(!e.tokenizer||typeof e.tokenizer!="object")throw Rt(t,"a language definition must define the 'tokenizer' attribute as an object");t.tokenizer=[];for(const r in e.tokenizer)if(e.tokenizer.hasOwnProperty(r)){t.start||(t.start=r);const a=e.tokenizer[r];t.tokenizer[r]=new Array,n("tokenizer."+r,t.tokenizer[r],a)}if(t.usesEmbedded=i.usesEmbedded,e.brackets){if(!Array.isArray(e.brackets))throw Rt(t,"the 'brackets' attribute must be defined as an array")}else e.brackets=[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}];const s=[];for(const r of e.brackets){let a=r;if(a&&Array.isArray(a)&&a.length===3&&(a={token:a[2],open:a[0],close:a[1]}),a.open===a.close)throw Rt(t,"open and close brackets in a 'brackets' attribute must be different: "+a.open+`
- hint: use the 'bracket' attribute if matching on equal brackets is required.`);if(typeof a.open=="string"&&typeof a.token=="string"&&typeof a.close=="string")s.push({token:a.token+t.tokenPostfix,open:pc(t,a.open),close:pc(t,a.close)});else throw Rt(t,"every element in the 'brackets' array must be a '{open,close,token}' object or array")}return t.brackets=s,t.noThrow=!0,t}var Hne=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function zne(o){Fg.registerLanguage(o)}function Une(){let o=[];return o=o.concat(Fg.getLanguages()),o}function $ne(o){return ke.get(Ut).languageIdCodec.encodeLanguageId(o)}function jne(o,e){const i=ke.get(Ut).onDidEncounterLanguage(n=>{n===o&&(i.dispose(),e())});return i}function Kne(o,e){if(!ke.get(Ut).isRegisteredLanguageId(o))throw new Error(`Cannot set configuration for unknown language ${o}`);return ke.get(ui).register(o,e,100)}class qne{constructor(e,t){this._languageId=e,this._actual=t}getInitialState(){return this._actual.getInitialState()}tokenize(e,t,i){if(typeof this._actual.tokenize=="function")return u_.adaptTokenize(this._languageId,this._actual,e,i);throw new Error("Not supported!")}tokenizeEncoded(e,t,i){const n=this._actual.tokenizeEncoded(e,i);return new x1(n.tokens,n.endState)}}class u_{constructor(e,t,i,n){this._languageId=e,this._actual=t,this._languageService=i,this._standaloneThemeService=n}getInitialState(){return this._actual.getInitialState()}static _toClassicTokens(e,t){const i=[];let n=0;for(let s=0,r=e.length;s0&&s[r-1]===u)continue;let g=h.startIndex;c===0?g=0:gHne(this,void 0,void 0,function*(){const i=yield Promise.resolve(e.create());return i?Gne(i)?U7(o,i):new km(ke.get(Ut),ke.get(Ks),o,H7(o,i),ke.get(at)):null})};return Kt.registerFactory(o,t)}function Qne(o,e){if(!ke.get(Ut).isRegisteredLanguageId(o))throw new Error(`Cannot set tokens provider for unknown language ${o}`);return z7(e)?NN(o,{create:()=>e}):Kt.register(o,U7(o,e))}function Xne(o,e){const t=i=>new km(ke.get(Ut),ke.get(Ks),o,H7(o,i),ke.get(at));return z7(e)?NN(o,{create:()=>e}):Kt.register(o,t(e))}function Jne(o,e){return ke.get(ge).referenceProvider.register(o,e)}function ese(o,e){return ke.get(ge).renameProvider.register(o,e)}function tse(o,e){return ke.get(ge).signatureHelpProvider.register(o,e)}function ise(o,e){return ke.get(ge).hoverProvider.register(o,{provideHover:(i,n,s)=>{const r=i.getWordAtPosition(n);return Promise.resolve(e.provideHover(i,n,s)).then(a=>{if(a)return!a.range&&r&&(a.range=new y(n.lineNumber,r.startColumn,n.lineNumber,r.endColumn)),a.range||(a.range=new y(n.lineNumber,n.column,n.lineNumber,n.column)),a})}})}function nse(o,e){return ke.get(ge).documentSymbolProvider.register(o,e)}function sse(o,e){return ke.get(ge).documentHighlightProvider.register(o,e)}function ose(o,e){return ke.get(ge).linkedEditingRangeProvider.register(o,e)}function rse(o,e){return ke.get(ge).definitionProvider.register(o,e)}function ase(o,e){return ke.get(ge).implementationProvider.register(o,e)}function lse(o,e){return ke.get(ge).typeDefinitionProvider.register(o,e)}function cse(o,e){return ke.get(ge).codeLensProvider.register(o,e)}function dse(o,e,t){return ke.get(ge).codeActionProvider.register(o,{providedCodeActionKinds:t==null?void 0:t.providedCodeActionKinds,documentation:t==null?void 0:t.documentation,provideCodeActions:(n,s,r,a)=>{const c=ke.get(Na).read({resource:n.uri}).filter(d=>y.areIntersectingOrTouching(d,s));return e.provideCodeActions(n,s,{markers:c,only:r.only,trigger:r.trigger},a)},resolveCodeAction:e.resolveCodeAction})}function hse(o,e){return ke.get(ge).documentFormattingEditProvider.register(o,e)}function use(o,e){return ke.get(ge).documentRangeFormattingEditProvider.register(o,e)}function gse(o,e){return ke.get(ge).onTypeFormattingEditProvider.register(o,e)}function fse(o,e){return ke.get(ge).linkProvider.register(o,e)}function pse(o,e){return ke.get(ge).completionProvider.register(o,e)}function mse(o,e){return ke.get(ge).colorProvider.register(o,e)}function _se(o,e){return ke.get(ge).foldingRangeProvider.register(o,e)}function bse(o,e){return ke.get(ge).declarationProvider.register(o,e)}function vse(o,e){return ke.get(ge).selectionRangeProvider.register(o,e)}function Cse(o,e){return ke.get(ge).documentSemanticTokensProvider.register(o,e)}function wse(o,e){return ke.get(ge).documentRangeSemanticTokensProvider.register(o,e)}function Sse(o,e){return ke.get(ge).inlineCompletionsProvider.register(o,e)}function yse(o,e){return ke.get(ge).inlayHintsProvider.register(o,e)}function Lse(){return{register:zne,getLanguages:Une,onLanguage:jne,getEncodedLanguageId:$ne,setLanguageConfiguration:Kne,setColorMap:Yne,registerTokensProviderFactory:NN,setTokensProvider:Qne,setMonarchTokensProvider:Xne,registerReferenceProvider:Jne,registerRenameProvider:ese,registerCompletionItemProvider:pse,registerSignatureHelpProvider:tse,registerHoverProvider:ise,registerDocumentSymbolProvider:nse,registerDocumentHighlightProvider:sse,registerLinkedEditingRangeProvider:ose,registerDefinitionProvider:rse,registerImplementationProvider:ase,registerTypeDefinitionProvider:lse,registerCodeLensProvider:cse,registerCodeActionProvider:dse,registerDocumentFormattingEditProvider:hse,registerDocumentRangeFormattingEditProvider:use,registerOnTypeFormattingEditProvider:gse,registerLinkProvider:fse,registerColorProvider:mse,registerFoldingRangeProvider:_se,registerDeclarationProvider:bse,registerSelectionRangeProvider:vse,registerDocumentSemanticTokensProvider:Cse,registerDocumentRangeSemanticTokensProvider:wse,registerInlineCompletionsProvider:Sse,registerInlayHintsProvider:yse,DocumentHighlightKind:dD,CompletionItemKind:sD,CompletionItemTag:oD,CompletionItemInsertTextRule:Fv,SymbolKind:AD,SymbolTag:RD,IndentAction:pD,CompletionTriggerKind:rD,SignatureHelpTriggerKind:MD,InlayHintKind:_D,InlineCompletionTriggerKind:bD,CodeActionTriggerType:nD,FoldingRangeKind:vr}}const MN=Je("IEditorCancelService"),$7=new ce("cancellableOperation",!1,f("cancellableOperation","Whether the editor runs a cancellable operation, e.g. like 'Peek References'"));ot(MN,class{constructor(){this._tokens=new WeakMap}add(o,e){let t=this._tokens.get(o);t||(t=o.invokeWithinContext(n=>{const s=$7.bindTo(n.get(Ee)),r=new ln;return{key:s,tokens:r}}),this._tokens.set(o,t));let i;return t.key.set(!0),i=t.tokens.push(e),()=>{i&&(i(),t.key.set(!t.tokens.isEmpty()),i=void 0)}}cancel(o){const e=this._tokens.get(o);if(!e)return;const t=e.tokens.pop();t&&(t.cancel(),e.key.set(!e.tokens.isEmpty()))}},1);class Dse extends Xi{constructor(e,t){super(t),this.editor=e,this._unregister=e.invokeWithinContext(i=>i.get(MN).add(e,this))}dispose(){this._unregister(),super.dispose()}}ie(new class extends Ji{constructor(){super({id:"editor.cancelOperation",kbOpts:{weight:100,primary:9},precondition:$7})}runEditorCommand(o,e){o.get(MN).cancel(e)}});let j7=class Kk{constructor(e,t){if(this.flags=t,this.flags&1){const i=e.getModel();this.modelVersionId=i?to("{0}#{1}",i.uri.toString(),i.getVersionId()):null}else this.modelVersionId=null;this.flags&4?this.position=e.getPosition():this.position=null,this.flags&2?this.selection=e.getSelection():this.selection=null,this.flags&8?(this.scrollLeft=e.getScrollLeft(),this.scrollTop=e.getScrollTop()):(this.scrollLeft=-1,this.scrollTop=-1)}_equals(e){if(!(e instanceof Kk))return!1;const t=e;return!(this.modelVersionId!==t.modelVersionId||this.scrollLeft!==t.scrollLeft||this.scrollTop!==t.scrollTop||!this.position&&t.position||this.position&&!t.position||this.position&&t.position&&!this.position.equals(t.position)||!this.selection&&t.selection||this.selection&&!t.selection||this.selection&&t.selection&&!this.selection.equalsRange(t.selection))}validate(e){return this._equals(new Kk(e,this.flags))}};class Sh extends Dse{constructor(e,t,i,n){super(e,n),this._listener=new Z,t&4&&this._listener.add(e.onDidChangeCursorPosition(s=>{(!i||!y.containsPosition(i,s.position))&&this.cancel()})),t&2&&this._listener.add(e.onDidChangeCursorSelection(s=>{(!i||!y.containsRange(i,s.selection))&&this.cancel()})),t&8&&this._listener.add(e.onDidScrollChange(s=>this.cancel())),t&1&&(this._listener.add(e.onDidChangeModel(s=>this.cancel())),this._listener.add(e.onDidChangeModelContent(s=>this.cancel())))}dispose(){this._listener.dispose(),super.dispose()}}class AN extends Xi{constructor(e,t){super(t),this._listener=e.onDidChangeContent(()=>this.cancel())}dispose(){this._listener.dispose(),super.dispose()}}function La(o){return o&&typeof o.getEditorType=="function"?o.getEditorType()===U_.ICodeEditor:!1}function K7(o){return o&&typeof o.getEditorType=="function"?o.getEditorType()===U_.IDiffEditor:!1}function xse(o){return!!o&&typeof o=="object"&&typeof o.onDidChangeActiveEditor=="function"}function q7(o){return La(o)?o:K7(o)?o.getModifiedEditor():xse(o)&&La(o.activeCodeEditor)?o.activeCodeEditor:null}class nf{static _handleEolEdits(e,t){let i;const n=[];for(const s of t)typeof s.eol=="number"&&(i=s.eol),s.range&&typeof s.text=="string"&&n.push(s);return typeof i=="number"&&e.hasModel()&&e.getModel().pushEOL(i),n}static _isFullModelReplaceEdit(e,t){if(!e.hasModel())return!1;const i=e.getModel(),n=i.validateRange(t.range);return i.getFullModelRange().equalsRange(n)}static execute(e,t,i){i&&e.pushUndoStop();const n=Ca.capture(e),s=nf._handleEolEdits(e,t);s.length===1&&nf._isFullModelReplaceEdit(e,s[0])?e.executeEdits("formatEditsCommand",s.map(r=>Wt.replace(y.lift(r.range),r.text))):e.executeEdits("formatEditsCommand",s.map(r=>Wt.replaceMove(y.lift(r.range),r.text))),i&&e.pushUndoStop(),n.restoreRelativeVerticalPositionOfCursor(e)}}class eL{constructor(e){this.value=e,this._lower=e.toLowerCase()}static toKey(e){return typeof e=="string"?e.toLowerCase():e._lower}}var Lr=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function RN(o){if(o=o.filter(n=>n.range),!o.length)return;let{range:e}=o[0];for(let n=1;n0&&y.areIntersectingOrTouching(c[d-1],m)?c[d-1]=y.fromPositions(c[d-1].getStartPosition(),m.getEndPosition()):d=c.push(m);const h=m=>Lr(this,void 0,void 0,function*(){var _,v;r.trace("[format][provideDocumentRangeFormattingEdits] (request)",(_=e.extensionId)===null||_===void 0?void 0:_.value,m);const b=(yield e.provideDocumentRangeFormattingEdits(a,m,a.getFormattingOptions(),l.token))||[];return r.trace("[format][provideDocumentRangeFormattingEdits] (response)",(v=e.extensionId)===null||v===void 0?void 0:v.value,b),b}),u=(m,_)=>{if(!m.length||!_.length)return!1;const v=m.reduce((b,C)=>y.plusRange(b,C.range),m[0].range);if(!_.some(b=>y.intersectRanges(v,b.range)))return!1;for(const b of m)for(const C of _)if(y.intersectRanges(b.range,C.range))return!0;return!1},g=[],p=[];try{for(const m of c){if(l.token.isCancellationRequested)return!0;p.push(yield h(m))}for(let m=0;m({text:v.text,range:y.lift(v.range),forceMoveMarkers:!0})),v=>{for(const{range:b}of v)if(y.areIntersectingOrTouching(b,_))return[new he(b.startLineNumber,b.startColumn,b.endLineNumber,b.endColumn)];return null})}return!0})}function Ise(o,e,t,i,n){return Lr(this,void 0,void 0,function*(){const s=o.get(Me),r=o.get(ge),a=La(e)?e.getModel():e,l=G7(r.documentFormattingEditProvider,r.documentRangeFormattingEditProvider,a),c=yield yh.select(l,a,t);c&&(i.report(c),yield s.invokeFunction(Ese,c,e,t,n))})}function Ese(o,e,t,i,n){return Lr(this,void 0,void 0,function*(){const s=o.get($o);let r,a;La(t)?(r=t.getModel(),a=new Sh(t,5,void 0,n)):(r=t,a=new AN(t,n));let l;try{const c=yield e.provideDocumentFormattingEdits(r,r.getFormattingOptions(),a.token);if(l=yield s.computeMoreMinimalEdits(r.uri,c),a.token.isCancellationRequested)return!0}finally{a.dispose()}if(!l||l.length===0)return!1;if(La(t))nf.execute(t,l,i!==2),i!==2&&(RN(l),t.revealPositionInCenterIfOutsideViewport(t.getPosition(),1));else{const[{range:c}]=l,d=new he(c.startLineNumber,c.startColumn,c.endLineNumber,c.endColumn);r.pushEditOperations([d],l.map(h=>({text:h.text,range:y.lift(h.range),forceMoveMarkers:!0})),h=>{for(const{range:u}of h)if(y.areIntersectingOrTouching(u,d))return[new he(u.startLineNumber,u.startColumn,u.endLineNumber,u.endColumn)];return null})}return!0})}function Tse(o,e,t,i,n,s){return Lr(this,void 0,void 0,function*(){const r=e.documentRangeFormattingEditProvider.ordered(t);for(const a of r){const l=yield Promise.resolve(a.provideDocumentRangeFormattingEdits(t,i,n,s)).catch(Vi);if(Cn(l))return yield o.computeMoreMinimalEdits(t.uri,l)}})}function Nse(o,e,t,i,n){return Lr(this,void 0,void 0,function*(){const s=G7(e.documentFormattingEditProvider,e.documentRangeFormattingEditProvider,t);for(const r of s){const a=yield Promise.resolve(r.provideDocumentFormattingEdits(t,i,n)).catch(Vi);if(Cn(a))return yield o.computeMoreMinimalEdits(t.uri,a)}})}function Y7(o,e,t,i,n,s,r){const a=e.onTypeFormattingEditProvider.ordered(t);return a.length===0||a[0].autoFormatTriggerCharacters.indexOf(n)<0?Promise.resolve(void 0):Promise.resolve(a[0].provideOnTypeFormattingEdits(t,i,n,s,r)).catch(Vi).then(l=>o.computeMoreMinimalEdits(t.uri,l))}st.registerCommand("_executeFormatRangeProvider",function(o,...e){return Lr(this,void 0,void 0,function*(){const[t,i,n]=e;_t(Ce.isUri(t)),_t(y.isIRange(i));const s=o.get(os),r=o.get($o),a=o.get(ge),l=yield s.createModelReference(t);try{return Tse(r,a,l.object.textEditorModel,y.lift(i),n,Ye.None)}finally{l.dispose()}})});st.registerCommand("_executeFormatDocumentProvider",function(o,...e){return Lr(this,void 0,void 0,function*(){const[t,i]=e;_t(Ce.isUri(t));const n=o.get(os),s=o.get($o),r=o.get(ge),a=yield n.createModelReference(t);try{return Nse(s,r,a.object.textEditorModel,i,Ye.None)}finally{a.dispose()}})});st.registerCommand("_executeFormatOnTypeProvider",function(o,...e){return Lr(this,void 0,void 0,function*(){const[t,i,n,s]=e;_t(Ce.isUri(t)),_t(W.isIPosition(i)),_t(typeof n=="string");const r=o.get(os),a=o.get($o),l=o.get(ge),c=yield r.createModelReference(t);try{return Y7(a,l,c.object.textEditorModel,W.lift(i),n,s,Ye.None)}finally{c.dispose()}})});var tL;Dr.wrappingIndent.defaultValue=0;Dr.glyphMargin.defaultValue=!1;Dr.autoIndent.defaultValue=3;Dr.overviewRulerLanes.defaultValue=2;yh.setFormatterSelector((o,e,t)=>Promise.resolve(o[0]));const zn=U4();zn.editor=Pne();zn.languages=Lse();const Q7=zn.CancellationTokenSource,X7=zn.Emitter,J7=zn.KeyCode,e8=zn.KeyMod,t8=zn.Position,i8=zn.Range,n8=zn.Selection,s8=zn.SelectionDirection,o8=zn.MarkerSeverity,r8=zn.MarkerTag,a8=zn.Uri,l8=zn.Token,ja=zn.editor,PN=zn.languages;(!((tL=di.MonacoEnvironment)===null||tL===void 0)&&tL.globalAPI||typeof define=="function"&&define.amd)&&(self.monaco=zn);typeof self.require<"u"&&typeof self.require.config=="function"&&self.require.config({ignoreDuplicateModules:["vscode-languageserver-types","vscode-languageserver-types/main","vscode-languageserver-textdocument","vscode-languageserver-textdocument/main","vscode-nls","vscode-nls/vscode-nls","jsonc-parser","jsonc-parser/main","vscode-uri","vscode-uri/index","vs/basic-languages/typescript/typescript"]});const lb=Object.freeze(Object.defineProperty({__proto__:null,CancellationTokenSource:Q7,Emitter:X7,KeyCode:J7,KeyMod:e8,MarkerSeverity:o8,MarkerTag:r8,Position:t8,Range:i8,Selection:n8,SelectionDirection:s8,Token:l8,Uri:a8,editor:ja,languages:PN},Symbol.toStringTag,{value:"Module"}));var Mse=Object.defineProperty,Ase=Object.getOwnPropertyDescriptor,Rse=Object.getOwnPropertyNames,Pse=Object.prototype.hasOwnProperty,MP=(o,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Rse(e))!Pse.call(o,n)&&n!==t&&Mse(o,n,{get:()=>e[n],enumerable:!(i=Ase(e,n))||i.enumerable});return o},Ose=(o,e,t)=>(MP(o,e,"default"),t&&MP(t,e,"default")),Pp={};Ose(Pp,lb);var c8={},iL={},d8=class{constructor(o){Zt(this,"_languageId");Zt(this,"_loadingTriggered");Zt(this,"_lazyLoadPromise");Zt(this,"_lazyLoadPromiseResolve");Zt(this,"_lazyLoadPromiseReject");this._languageId=o,this._loadingTriggered=!1,this._lazyLoadPromise=new Promise((e,t)=>{this._lazyLoadPromiseResolve=e,this._lazyLoadPromiseReject=t})}static getOrCreate(o){return iL[o]||(iL[o]=new d8(o)),iL[o]}load(){return this._loadingTriggered||(this._loadingTriggered=!0,c8[this._languageId].loader().then(o=>this._lazyLoadPromiseResolve(o),o=>this._lazyLoadPromiseReject(o))),this._lazyLoadPromise}};function be(o){const e=o.id;c8[e]=o,Pp.languages.register(o);const t=d8.getOrCreate(e);Pp.languages.registerTokensProviderFactory(e,{create:async()=>(await t.load()).language}),Pp.languages.onLanguage(e,async()=>{const i=await t.load();Pp.languages.setLanguageConfiguration(e,i.conf)})}be({id:"abap",extensions:[".abap"],aliases:["abap","ABAP"],loader:()=>me(()=>import("./abap-ffbe9c82.js"),[])});be({id:"apex",extensions:[".cls"],aliases:["Apex","apex"],mimetypes:["text/x-apex-source","text/x-apex"],loader:()=>me(()=>import("./apex-38989e74.js"),[])});be({id:"azcli",extensions:[".azcli"],aliases:["Azure CLI","azcli"],loader:()=>me(()=>import("./azcli-714c239b.js"),[])});be({id:"bat",extensions:[".bat",".cmd"],aliases:["Batch","bat"],loader:()=>me(()=>import("./bat-7eb152e5.js"),[])});be({id:"bicep",extensions:[".bicep"],aliases:["Bicep"],loader:()=>me(()=>import("./bicep-80731f71.js"),[])});be({id:"cameligo",extensions:[".mligo"],aliases:["Cameligo"],loader:()=>me(()=>import("./cameligo-91a865e0.js"),[])});be({id:"clojure",extensions:[".clj",".cljs",".cljc",".edn"],aliases:["clojure","Clojure"],loader:()=>me(()=>import("./clojure-7e0f8eaa.js"),[])});be({id:"coffeescript",extensions:[".coffee"],aliases:["CoffeeScript","coffeescript","coffee"],mimetypes:["text/x-coffeescript","text/coffeescript"],loader:()=>me(()=>import("./coffee-af1c6ca9.js"),[])});be({id:"c",extensions:[".c",".h"],aliases:["C","c"],loader:()=>me(()=>import("./cpp-2a429e6c.js"),[])});be({id:"cpp",extensions:[".cpp",".cc",".cxx",".hpp",".hh",".hxx"],aliases:["C++","Cpp","cpp"],loader:()=>me(()=>import("./cpp-2a429e6c.js"),[])});be({id:"csharp",extensions:[".cs",".csx",".cake"],aliases:["C#","csharp"],loader:()=>me(()=>import("./csharp-d087d64c.js"),[])});be({id:"csp",extensions:[],aliases:["CSP","csp"],loader:()=>me(()=>import("./csp-13ea92a6.js"),[])});be({id:"css",extensions:[".css"],aliases:["CSS","css"],mimetypes:["text/css"],loader:()=>me(()=>import("./css-1949305a.js"),[])});be({id:"cypher",extensions:[".cypher",".cyp"],aliases:["Cypher","OpenCypher"],loader:()=>me(()=>import("./cypher-e148524e.js"),[])});be({id:"dart",extensions:[".dart"],aliases:["Dart","dart"],mimetypes:["text/x-dart-source","text/x-dart"],loader:()=>me(()=>import("./dart-0a096fe0.js"),[])});be({id:"dockerfile",extensions:[".dockerfile"],filenames:["Dockerfile"],aliases:["Dockerfile"],loader:()=>me(()=>import("./dockerfile-af4eb422.js"),[])});be({id:"ecl",extensions:[".ecl"],aliases:["ECL","Ecl","ecl"],loader:()=>me(()=>import("./ecl-8f5b983c.js"),[])});be({id:"elixir",extensions:[".ex",".exs"],aliases:["Elixir","elixir","ex"],loader:()=>me(()=>import("./elixir-4b853ea7.js"),[])});be({id:"flow9",extensions:[".flow"],aliases:["Flow9","Flow","flow9","flow"],loader:()=>me(()=>import("./flow9-47a350b0.js"),[])});be({id:"fsharp",extensions:[".fs",".fsi",".ml",".mli",".fsx",".fsscript"],aliases:["F#","FSharp","fsharp"],loader:()=>me(()=>import("./fsharp-de5183ae.js"),[])});be({id:"freemarker2",extensions:[".ftl",".ftlh",".ftlx"],aliases:["FreeMarker2","Apache FreeMarker2"],loader:()=>me(()=>import("./freemarker2-1e98cbc8.js"),["assets/freemarker2-1e98cbc8.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"]).then(o=>o.TagAutoInterpolationDollar)});be({id:"freemarker2.tag-angle.interpolation-dollar",aliases:["FreeMarker2 (Angle/Dollar)","Apache FreeMarker2 (Angle/Dollar)"],loader:()=>me(()=>import("./freemarker2-1e98cbc8.js"),["assets/freemarker2-1e98cbc8.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"]).then(o=>o.TagAngleInterpolationDollar)});be({id:"freemarker2.tag-bracket.interpolation-dollar",aliases:["FreeMarker2 (Bracket/Dollar)","Apache FreeMarker2 (Bracket/Dollar)"],loader:()=>me(()=>import("./freemarker2-1e98cbc8.js"),["assets/freemarker2-1e98cbc8.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"]).then(o=>o.TagBracketInterpolationDollar)});be({id:"freemarker2.tag-angle.interpolation-bracket",aliases:["FreeMarker2 (Angle/Bracket)","Apache FreeMarker2 (Angle/Bracket)"],loader:()=>me(()=>import("./freemarker2-1e98cbc8.js"),["assets/freemarker2-1e98cbc8.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"]).then(o=>o.TagAngleInterpolationBracket)});be({id:"freemarker2.tag-bracket.interpolation-bracket",aliases:["FreeMarker2 (Bracket/Bracket)","Apache FreeMarker2 (Bracket/Bracket)"],loader:()=>me(()=>import("./freemarker2-1e98cbc8.js"),["assets/freemarker2-1e98cbc8.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"]).then(o=>o.TagBracketInterpolationBracket)});be({id:"freemarker2.tag-auto.interpolation-dollar",aliases:["FreeMarker2 (Auto/Dollar)","Apache FreeMarker2 (Auto/Dollar)"],loader:()=>me(()=>import("./freemarker2-1e98cbc8.js"),["assets/freemarker2-1e98cbc8.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"]).then(o=>o.TagAutoInterpolationDollar)});be({id:"freemarker2.tag-auto.interpolation-bracket",aliases:["FreeMarker2 (Auto/Bracket)","Apache FreeMarker2 (Auto/Bracket)"],loader:()=>me(()=>import("./freemarker2-1e98cbc8.js"),["assets/freemarker2-1e98cbc8.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"]).then(o=>o.TagAutoInterpolationBracket)});be({id:"go",extensions:[".go"],aliases:["Go"],loader:()=>me(()=>import("./go-a9169306.js"),[])});be({id:"graphql",extensions:[".graphql",".gql"],aliases:["GraphQL","graphql","gql"],mimetypes:["application/graphql"],loader:()=>me(()=>import("./graphql-e84c0b6e.js"),[])});be({id:"handlebars",extensions:[".handlebars",".hbs"],aliases:["Handlebars","handlebars","hbs"],mimetypes:["text/x-handlebars-template"],loader:()=>me(()=>import("./handlebars-69d86119.js"),["assets/handlebars-69d86119.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"])});be({id:"hcl",extensions:[".tf",".tfvars",".hcl"],aliases:["Terraform","tf","HCL","hcl"],loader:()=>me(()=>import("./hcl-3a006f6b.js"),[])});be({id:"html",extensions:[".html",".htm",".shtml",".xhtml",".mdoc",".jsp",".asp",".aspx",".jshtm"],aliases:["HTML","htm","html","xhtml"],mimetypes:["text/html","text/x-jshtm","text/template","text/ng-template"],loader:()=>me(()=>import("./html-2c0d1bd0.js"),["assets/html-2c0d1bd0.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"])});be({id:"ini",extensions:[".ini",".properties",".gitconfig"],filenames:["config",".gitattributes",".gitconfig",".editorconfig"],aliases:["Ini","ini"],loader:()=>me(()=>import("./ini-53b87513.js"),[])});be({id:"java",extensions:[".java",".jav"],aliases:["Java","java"],mimetypes:["text/x-java-source","text/x-java"],loader:()=>me(()=>import("./java-58c1a618.js"),[])});be({id:"javascript",extensions:[".js",".es6",".jsx",".mjs",".cjs"],firstLine:"^#!.*\\bnode",filenames:["jakefile"],aliases:["JavaScript","javascript","js"],mimetypes:["text/javascript"],loader:()=>me(()=>import("./javascript-8fb39be6.js"),["assets/javascript-8fb39be6.js","assets/typescript-e586ca38.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"])});be({id:"julia",extensions:[".jl"],aliases:["julia","Julia"],loader:()=>me(()=>import("./julia-5f2fc018.js"),[])});be({id:"kotlin",extensions:[".kt",".kts"],aliases:["Kotlin","kotlin"],mimetypes:["text/x-kotlin-source","text/x-kotlin"],loader:()=>me(()=>import("./kotlin-2e32535a.js"),[])});be({id:"less",extensions:[".less"],aliases:["Less","less"],mimetypes:["text/x-less","text/less"],loader:()=>me(()=>import("./less-4cb00c13.js"),[])});be({id:"lexon",extensions:[".lex"],aliases:["Lexon"],loader:()=>me(()=>import("./lexon-22a22ba3.js"),[])});be({id:"lua",extensions:[".lua"],aliases:["Lua","lua"],loader:()=>me(()=>import("./lua-04a273a9.js"),[])});be({id:"liquid",extensions:[".liquid",".html.liquid"],aliases:["Liquid","liquid"],mimetypes:["application/liquid"],loader:()=>me(()=>import("./liquid-e6478af9.js"),["assets/liquid-e6478af9.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"])});be({id:"m3",extensions:[".m3",".i3",".mg",".ig"],aliases:["Modula-3","Modula3","modula3","m3"],loader:()=>me(()=>import("./m3-b6e0b0fd.js"),[])});be({id:"markdown",extensions:[".md",".markdown",".mdown",".mkdn",".mkd",".mdwn",".mdtxt",".mdtext"],aliases:["Markdown","markdown"],loader:()=>me(()=>import("./markdown-a4831c3f.js"),[])});be({id:"mips",extensions:[".s"],aliases:["MIPS","MIPS-V"],mimetypes:["text/x-mips","text/mips","text/plaintext"],loader:()=>me(()=>import("./mips-daa25bd4.js"),[])});be({id:"msdax",extensions:[".dax",".msdax"],aliases:["DAX","MSDAX"],loader:()=>me(()=>import("./msdax-c6fa6f2f.js"),[])});be({id:"mysql",extensions:[],aliases:["MySQL","mysql"],loader:()=>me(()=>import("./mysql-753a9662.js"),[])});be({id:"objective-c",extensions:[".m"],aliases:["Objective-C"],loader:()=>me(()=>import("./objective-c-9e968999.js"),[])});be({id:"pascal",extensions:[".pas",".p",".pp"],aliases:["Pascal","pas"],mimetypes:["text/x-pascal-source","text/x-pascal"],loader:()=>me(()=>import("./pascal-e017ea4d.js"),[])});be({id:"pascaligo",extensions:[".ligo"],aliases:["Pascaligo","ligo"],loader:()=>me(()=>import("./pascaligo-bf7e3de8.js"),[])});be({id:"perl",extensions:[".pl"],aliases:["Perl","pl"],loader:()=>me(()=>import("./perl-2762c71f.js"),[])});be({id:"pgsql",extensions:[],aliases:["PostgreSQL","postgres","pg","postgre"],loader:()=>me(()=>import("./pgsql-1566d400.js"),[])});be({id:"php",extensions:[".php",".php4",".php5",".phtml",".ctp"],aliases:["PHP","php"],mimetypes:["application/x-php"],loader:()=>me(()=>import("./php-df365951.js"),[])});be({id:"pla",extensions:[".pla"],loader:()=>me(()=>import("./pla-6c133053.js"),[])});be({id:"postiats",extensions:[".dats",".sats",".hats"],aliases:["ATS","ATS/Postiats"],loader:()=>me(()=>import("./postiats-b245e70f.js"),[])});be({id:"powerquery",extensions:[".pq",".pqm"],aliases:["PQ","M","Power Query","Power Query M"],loader:()=>me(()=>import("./powerquery-6b7a9cc4.js"),[])});be({id:"powershell",extensions:[".ps1",".psm1",".psd1"],aliases:["PowerShell","powershell","ps","ps1"],loader:()=>me(()=>import("./powershell-50bb8773.js"),[])});be({id:"proto",extensions:[".proto"],aliases:["protobuf","Protocol Buffers"],loader:()=>me(()=>import("./protobuf-c49b6d53.js"),[])});be({id:"pug",extensions:[".jade",".pug"],aliases:["Pug","Jade","jade"],loader:()=>me(()=>import("./pug-409e523c.js"),[])});be({id:"python",extensions:[".py",".rpy",".pyw",".cpy",".gyp",".gypi"],aliases:["Python","py"],firstLine:"^#!/.*\\bpython[0-9.-]*\\b",loader:()=>me(()=>import("./python-b5c95704.js"),["assets/python-b5c95704.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"])});be({id:"qsharp",extensions:[".qs"],aliases:["Q#","qsharp"],loader:()=>me(()=>import("./qsharp-8d792318.js"),[])});be({id:"r",extensions:[".r",".rhistory",".rmd",".rprofile",".rt"],aliases:["R","r"],loader:()=>me(()=>import("./r-c34a576e.js"),[])});be({id:"razor",extensions:[".cshtml"],aliases:["Razor","razor"],mimetypes:["text/x-cshtml"],loader:()=>me(()=>import("./razor-13566c09.js"),["assets/razor-13566c09.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"])});be({id:"redis",extensions:[".redis"],aliases:["redis"],loader:()=>me(()=>import("./redis-1a5ba628.js"),[])});be({id:"redshift",extensions:[],aliases:["Redshift","redshift"],loader:()=>me(()=>import("./redshift-39be2a89.js"),[])});be({id:"restructuredtext",extensions:[".rst"],aliases:["reStructuredText","restructuredtext"],loader:()=>me(()=>import("./restructuredtext-4a10ef1d.js"),[])});be({id:"ruby",extensions:[".rb",".rbx",".rjs",".gemspec",".pp"],filenames:["rakefile","Gemfile"],aliases:["Ruby","rb"],loader:()=>me(()=>import("./ruby-944f56a1.js"),[])});be({id:"rust",extensions:[".rs",".rlib"],aliases:["Rust","rust"],loader:()=>me(()=>import("./rust-b0440aa9.js"),[])});be({id:"sb",extensions:[".sb"],aliases:["Small Basic","sb"],loader:()=>me(()=>import("./sb-f3b34295.js"),[])});be({id:"scala",extensions:[".scala",".sc",".sbt"],aliases:["Scala","scala","SBT","Sbt","sbt","Dotty","dotty"],mimetypes:["text/x-scala-source","text/x-scala","text/x-sbt","text/x-dotty"],loader:()=>me(()=>import("./scala-7c17b334.js"),[])});be({id:"scheme",extensions:[".scm",".ss",".sch",".rkt"],aliases:["scheme","Scheme"],loader:()=>me(()=>import("./scheme-f75b8a9a.js"),[])});be({id:"scss",extensions:[".scss"],aliases:["Sass","sass","scss"],mimetypes:["text/x-scss","text/scss"],loader:()=>me(()=>import("./scss-0b143c7e.js"),[])});be({id:"shell",extensions:[".sh",".bash"],aliases:["Shell","sh"],loader:()=>me(()=>import("./shell-fe999acd.js"),[])});be({id:"sol",extensions:[".sol"],aliases:["sol","solidity","Solidity"],loader:()=>me(()=>import("./solidity-62f35cba.js"),[])});be({id:"aes",extensions:[".aes"],aliases:["aes","sophia","Sophia"],loader:()=>me(()=>import("./sophia-94cd0024.js"),[])});be({id:"sparql",extensions:[".rq"],aliases:["sparql","SPARQL"],loader:()=>me(()=>import("./sparql-23f0115e.js"),[])});be({id:"sql",extensions:[".sql"],aliases:["SQL"],loader:()=>me(()=>import("./sql-9ac813b8.js"),[])});be({id:"st",extensions:[".st",".iecst",".iecplc",".lc3lib"],aliases:["StructuredText","scl","stl"],loader:()=>me(()=>import("./st-4d0d15a1.js"),[])});be({id:"swift",aliases:["Swift","swift"],extensions:[".swift"],mimetypes:["text/swift"],loader:()=>me(()=>import("./swift-bc5aaa52.js"),[])});be({id:"systemverilog",extensions:[".sv",".svh"],aliases:["SV","sv","SystemVerilog","systemverilog"],loader:()=>me(()=>import("./systemverilog-416dd7b8.js"),[])});be({id:"verilog",extensions:[".v",".vh"],aliases:["V","v","Verilog","verilog"],loader:()=>me(()=>import("./systemverilog-416dd7b8.js"),[])});be({id:"tcl",extensions:[".tcl"],aliases:["tcl","Tcl","tcltk","TclTk","tcl/tk","Tcl/Tk"],loader:()=>me(()=>import("./tcl-838585b9.js"),[])});be({id:"twig",extensions:[".twig"],aliases:["Twig","twig"],mimetypes:["text/x-twig"],loader:()=>me(()=>import("./twig-1b470482.js"),[])});be({id:"typescript",extensions:[".ts",".tsx"],aliases:["TypeScript","ts","typescript"],mimetypes:["text/typescript"],loader:()=>me(()=>import("./typescript-e586ca38.js"),["assets/typescript-e586ca38.js","assets/index-a9bbc323.js","assets/index-5073ce9d.css"])});be({id:"vb",extensions:[".vb"],aliases:["Visual Basic","vb"],loader:()=>me(()=>import("./vb-2f676a0c.js"),[])});be({id:"xml",extensions:[".xml",".dtd",".ascx",".csproj",".config",".props",".targets",".wxi",".wxl",".wxs",".xaml",".svg",".svgz",".opf",".xsl"],firstLine:"(\\<\\?xml.*)|(\\