Compare commits

..
57 changed files with 271 additions and 438 deletions
+8 -5
View File
@@ -293,7 +293,7 @@ func (b *BaseApi) PageAlertConfig(c *gin.Context) {
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /alert/config/update [post]
// @x-panel-log {"bodyKeys":["id","displayName"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新告警配置 [id][displayName]","formatEN":"update alert config [id][displayName]"}
// @x-panel-log {"bodyKeys":["displayName"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新告警配置 [displayName]","formatEN":"update alert config [displayName]"}
func (b *BaseApi) UpdateAlertConfig(c *gin.Context) {
var req dto.AlertConfigUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
@@ -321,13 +321,15 @@ func (b *BaseApi) UpdateAlertConfig(c *gin.Context) {
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /alert/config/status [post]
// @x-panel-log {"bodyKeys":["id","status"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新告警配置状态 [id][status]","formatEN":"update alert config status [id][status]"}
// @x-panel-log {"bodyKeys":["status"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新告警配置状态 [name][status]","formatEN":"update alert config status [name][status]"}
func (b *BaseApi) UpdateAlertConfigStatus(c *gin.Context) {
var req dto.AlertConfigStatusUpdate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := alertService.UpdateAlertConfigStatus(req, loadAuditUser(c)); err != nil {
name, err := alertService.UpdateAlertConfigStatus(req, loadAuditUser(c))
helper.SetOperationLogValues(c, map[string]string{"name": name})
if err != nil {
helper.InternalServer(c, err)
return
}
@@ -353,13 +355,14 @@ func loadAuditUser(c *gin.Context) string {
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /alert/config/del [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"删除告警配置 [id]","formatEN":"delete alert config [id]"}
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"删除告警配置 [name]","formatEN":"delete alert config [name]"}
func (b *BaseApi) DeleteAlertConfig(c *gin.Context) {
var req dto.DeleteRequest
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
err := alertService.DeleteAlertConfig(req.ID)
name, err := alertService.DeleteAlertConfig(req.ID)
helper.SetOperationLogValues(c, map[string]string{"name": name})
if err != nil {
helper.InternalServer(c, err)
return
+21
View File
@@ -3,6 +3,7 @@ package helper
import (
"compress/gzip"
"context"
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
@@ -184,3 +185,23 @@ func GetParamInt32(paramName string, c *gin.Context) (int32, error) {
intNum, _ := strconv.Atoi(idParam)
return int32(intNum), nil
}
// SetOperationLogValues supplies server-resolved values to Core's operation log.
// Call before writing the response. Only pass public audit fields, never credentials.
func SetOperationLogValues(c *gin.Context, values map[string]string) {
const header = "X-Op-Resolved"
resolved := make(map[string]string)
if data, err := base64.RawURLEncoding.DecodeString(c.Writer.Header().Get(header)); err == nil {
_ = json.Unmarshal(data, &resolved)
}
if resolved == nil {
resolved = make(map[string]string)
}
for key, value := range values {
resolved[key] = value
}
data, err := json.Marshal(resolved)
if err == nil {
c.Header(header, base64.RawURLEncoding.EncodeToString(data))
}
}
+26 -14
View File
@@ -74,8 +74,8 @@ type IAlertService interface {
GetAlertConfig(req dto.AlertConfigQuery) ([]model.AlertConfig, error)
PageAlertConfig(req dto.AlertConfigPageReq) (int64, []model.AlertConfig, error)
UpdateAlertConfig(req dto.AlertConfigUpdate, operator string) error
UpdateAlertConfigStatus(req dto.AlertConfigStatusUpdate, operator string) error
DeleteAlertConfig(id uint) error
UpdateAlertConfigStatus(req dto.AlertConfigStatusUpdate, operator string) (string, error)
DeleteAlertConfig(id uint) (string, error)
TestAlertConfig(req dto.AlertConfigTest) (bool, error)
TestCustomAlertConfig(req dto.AlertConfigTest, lang string) (dto.AlertConfigTestResult, error)
}
@@ -623,25 +623,26 @@ func (a AlertService) updateCustomAlertConfig(req dto.AlertConfigUpdate, operato
})
}
func (a AlertService) UpdateAlertConfigStatus(req dto.AlertConfigStatusUpdate, operator string) error {
func (a AlertService) UpdateAlertConfigStatus(req dto.AlertConfigStatusUpdate, operator string) (string, error) {
if err := validateAlertConfigStatus(req.Status); err != nil {
return err
return "", err
}
config, err := alertRepo.GetConfigById(req.ID)
if err != nil {
return err
return "", err
}
name := alertConfigLogName(config.Config, config.Title)
if req.Status == constant.AlertEnable {
if err := a.validateCommunityAlertConfigType(config.Type); err != nil {
return err
return name, err
}
if config.Type == constant.Custom {
if _, err := alertwebhook.Resolve(config); err != nil {
return err
return name, err
}
}
}
return alertRepo.UpdateAlertConfig(map[string]interface{}{
return name, alertRepo.UpdateAlertConfig(map[string]interface{}{
"status": req.Status,
"update_user": operator,
}, repo.WithByID(req.ID))
@@ -813,19 +814,20 @@ func alertConfigSMSPhone(configData string) string {
return strings.TrimSpace(cfg.Phone)
}
func (a AlertService) DeleteAlertConfig(id uint) error {
_, err := alertRepo.GetConfigById(id)
func (a AlertService) DeleteAlertConfig(id uint) (string, error) {
config, err := alertRepo.GetConfigById(id)
if err != nil {
return err
return "", err
}
name := alertConfigLogName(config.Config, config.Title)
usedAlerts, err := alertRepo.List(alertRepo.WithByAlertMethodContainsConfigID(id))
if err != nil {
return err
return name, err
}
if len(usedAlerts) > 0 {
return buserr.New("ErrAlertConfigInUse")
return name, buserr.New("ErrAlertConfigInUse")
}
return alertRepo.DeleteAlertConfig(repo.WithByID(id))
return name, alertRepo.DeleteAlertConfig(repo.WithByID(id))
}
func (a AlertService) TestAlertConfig(req dto.AlertConfigTest) (bool, error) {
@@ -1043,3 +1045,13 @@ func (a AlertService) validateCronJobAlertChannels(alertType, advanced, method s
_, err = a.validateAlertMethodReferences(method)
return err
}
func alertConfigLogName(config, title string) string {
var value struct {
DisplayName string `json:"displayName"`
}
if json.Unmarshal([]byte(config), &value) == nil && strings.TrimSpace(value.DisplayName) != "" {
return strings.TrimSpace(value.DisplayName)
}
return title
}
+10 -14
View File
@@ -108,33 +108,29 @@
"formatEN": "create alert [title]"
},
"/alert/config/del": {
"bodyKeys": [
"id"
],
"bodyKeys": [],
"paramKeys": [],
"beforeFunctions": [],
"formatZH": "删除告警配置 [id]",
"formatEN": "delete alert config [id]"
"formatZH": "删除告警配置 [name]",
"formatEN": "delete alert config [name]",
"beforeFunctions": []
},
"/alert/config/status": {
"bodyKeys": [
"id",
"status"
],
"paramKeys": [],
"beforeFunctions": [],
"formatZH": "更新告警配置状态 [id][status]",
"formatEN": "update alert config status [id][status]"
"formatZH": "更新告警配置状态 [name][status]",
"formatEN": "update alert config status [name][status]",
"beforeFunctions": []
},
"/alert/config/update": {
"bodyKeys": [
"id",
"displayName"
],
"paramKeys": [],
"beforeFunctions": [],
"formatZH": "更新告警配置 [id][displayName]",
"formatEN": "update alert config [id][displayName]"
"formatZH": "更新告警配置 [displayName]",
"formatEN": "update alert config [displayName]",
"beforeFunctions": []
},
"/alert/del": {
"bodyKeys": [
+36 -22
View File
@@ -2,7 +2,6 @@ package forwarding
import (
"context"
"encoding/json"
"errors"
"fmt"
"os"
@@ -174,14 +173,19 @@ func LoadDockerIPv4BridgePorts() (map[string]bool, error) {
if err != nil {
return nil, err
}
output, err := cmd.NewCommandMgr(cmd.WithContext(ctx), cmd.WithTimeout(5*time.Second)).RunWithOptionalSudoAndStdout("ip", "-details", "-json", "link", "show")
command := cmd.NewCommandMgr(cmd.WithContext(ctx), cmd.WithTimeout(5*time.Second))
bridges, err := command.RunWithOptionalSudoAndStdout("ip", "-o", "link", "show", "type", "bridge")
if err != nil {
return nil, err
}
return dockerIPv4BridgePorts(networks, output)
ports, err := command.RunWithOptionalSudoAndStdout("ip", "-o", "link", "show", "type", "veth")
if err != nil {
return nil, err
}
return dockerIPv4BridgePorts(networks, bridges, ports)
}
func dockerIPv4BridgePorts(networks []network.Summary, linkJSON string) (map[string]bool, error) {
func dockerIPv4BridgePorts(networks []network.Summary, bridgeOutput, portOutput string) (map[string]bool, error) {
bridges := make(map[string]bool)
for _, item := range networks {
if item.Driver != "bridge" || item.EnableIPv6 || item.ConfigOnly {
@@ -199,26 +203,36 @@ func dockerIPv4BridgePorts(networks []network.Summary, linkJSON string) (map[str
bridges[name] = true
}
}
var links []struct {
Name string `json:"ifname"`
Master string `json:"master"`
LinkInfo struct {
Kind string `json:"info_kind"`
} `json:"linkinfo"`
}
if err := json.Unmarshal([]byte(linkJSON), &links); err != nil {
return nil, err
}
confirmedBridges := make(map[string]bool)
for _, link := range links {
if link.LinkInfo.Kind == "bridge" && bridges[link.Name] {
confirmedBridges[link.Name] = true
}
}
ports := make(map[string]bool)
for _, link := range links {
if link.LinkInfo.Kind == "veth" && confirmedBridges[link.Master] {
ports[link.Name] = true
for index, output := range []string{bridgeOutput, portOutput} {
for _, line := range strings.Split(output, "\n") {
header, _, _ := strings.Cut(line, "\\")
fields := strings.Fields(header)
if len(fields) == 0 {
continue
}
if len(fields) < 3 || !strings.HasSuffix(fields[0], ":") || !strings.HasSuffix(fields[1], ":") {
return nil, fmt.Errorf("invalid network link entry: %q", line)
}
if _, err := strconv.Atoi(strings.TrimSuffix(fields[0], ":")); err != nil {
return nil, fmt.Errorf("invalid network link entry: %q", line)
}
name, _, _ := strings.Cut(strings.TrimSuffix(fields[1], ":"), "@")
if index == 0 {
if bridges[name] {
confirmedBridges[name] = true
}
continue
}
for i := 3; i+1 < len(fields); i++ {
if fields[i] == "master" {
if confirmedBridges[fields[i+1]] {
ports[name] = true
}
break
}
}
}
}
return ports, nil
+9 -12
View File
@@ -3906,13 +3906,11 @@ const docTemplate = `{
"Alert"
],
"x-panel-log": {
"BeforeFunctions": [],
"bodyKeys": [
"id"
],
"formatEN": "delete alert config [id]",
"formatZH": "删除告警配置 [id]",
"paramKeys": []
"bodyKeys": [],
"paramKeys": [],
"formatZH": "删除告警配置 [name]",
"formatEN": "delete alert config [name]",
"BeforeFunctions": []
}
}
},
@@ -4041,14 +4039,13 @@ const docTemplate = `{
"Alert"
],
"x-panel-log": {
"BeforeFunctions": [],
"bodyKeys": [
"id",
"displayName"
],
"formatEN": "update alert config [id][displayName]",
"formatZH": "更新告警配置 [id][displayName]",
"paramKeys": []
"paramKeys": [],
"formatZH": "更新告警配置 [displayName]",
"formatEN": "update alert config [displayName]",
"BeforeFunctions": []
}
}
},
+9 -12
View File
@@ -3902,13 +3902,11 @@
"Alert"
],
"x-panel-log": {
"BeforeFunctions": [],
"bodyKeys": [
"id"
],
"formatEN": "delete alert config [id]",
"formatZH": "删除告警配置 [id]",
"paramKeys": []
"bodyKeys": [],
"paramKeys": [],
"formatZH": "删除告警配置 [name]",
"formatEN": "delete alert config [name]",
"BeforeFunctions": []
}
}
},
@@ -4037,14 +4035,13 @@
"Alert"
],
"x-panel-log": {
"BeforeFunctions": [],
"bodyKeys": [
"id",
"displayName"
],
"formatEN": "update alert config [id][displayName]",
"formatZH": "更新告警配置 [id][displayName]",
"paramKeys": []
"paramKeys": [],
"formatZH": "更新告警配置 [displayName]",
"formatEN": "update alert config [displayName]",
"BeforeFunctions": []
}
}
},
+10 -14
View File
@@ -108,33 +108,29 @@
"formatEN": "create alert [title]"
},
"/alert/config/del": {
"bodyKeys": [
"id"
],
"bodyKeys": [],
"paramKeys": [],
"beforeFunctions": [],
"formatZH": "删除告警配置 [id]",
"formatEN": "delete alert config [id]"
"formatZH": "删除告警配置 [name]",
"formatEN": "delete alert config [name]",
"beforeFunctions": []
},
"/alert/config/status": {
"bodyKeys": [
"id",
"status"
],
"paramKeys": [],
"beforeFunctions": [],
"formatZH": "更新告警配置状态 [id][status]",
"formatEN": "update alert config status [id][status]"
"formatZH": "更新告警配置状态 [name][status]",
"formatEN": "update alert config status [name][status]",
"beforeFunctions": []
},
"/alert/config/update": {
"bodyKeys": [
"id",
"displayName"
],
"paramKeys": [],
"beforeFunctions": [],
"formatZH": "更新告警配置 [id][displayName]",
"formatEN": "update alert config [id][displayName]"
"formatZH": "更新告警配置 [displayName]",
"formatEN": "update alert config [displayName]",
"beforeFunctions": []
},
"/alert/del": {
"bodyKeys": [
+2 -4
View File
@@ -133,11 +133,9 @@ func OperationLog() gin.HandlerFunc {
record.AuthMethod = "session"
}
// Handlers may supply audit values even without database resolution metadata.
mergeResolvedData(writer.resolvedHeader, formatMap)
if len(operationDic.BeforeFunctions) != 0 {
if needAgentResolve {
mergeResolvedData(writer.resolvedHeader, formatMap)
}
if allowCoreFallback && !hasAllResolvedData(formatMap, operationDic.BeforeFunctions) {
dbItem, err := newDB(record.Path)
if err == nil {
@@ -0,0 +1,24 @@
import { storeToRefs } from 'pinia';
import { onActivated, onDeactivated } from 'vue';
import GlobalStore from '@/store/modules/global';
import { bindSearchReset, type SearchFields } from '@/utils/search-reset';
interface SearchResetOptions {
scope?: () => string | number | undefined;
onRevisit: () => unknown;
}
export const useSearchReset = (fields: SearchFields, options: SearchResetOptions) => {
const { currentNode } = storeToRefs(GlobalStore());
const reset = bindSearchReset(options.scope ? [currentNode, options.scope] : [currentNode], fields);
let deactivated = false;
onDeactivated(() => {
deactivated = true;
});
onActivated(() => {
if (!deactivated) return;
deactivated = false;
reset();
return options.onRevisit();
});
};
+3 -2
View File
@@ -1,4 +1,5 @@
import { bindSearchState } from '@/utils/search-reset';
import { bindSearchReset } from '@/utils/search-reset';
import router from '@/routers/router';
import { useGlobalStore } from '@/composables/useGlobalStore';
import { defineStore } from 'pinia';
import { ref, reactive, toRef } from 'vue';
@@ -49,7 +50,7 @@ export const ProcessStore = defineStore('ProcessStore', () => {
});
const { currentNode } = useGlobalStore();
bindSearchState(() => JSON.stringify([currentNode.value, 'host/process', '']), {
bindSearchReset([() => router.currentRoute.value.path, currentNode], {
pid: toRef(psSearch, 'pid'),
name: toRef(psSearch, 'name'),
username: toRef(psSearch, 'username'),
+7 -118
View File
@@ -1,123 +1,12 @@
import { storeToRefs } from 'pinia';
import { onActivated, onDeactivated, onScopeDispose, watch, type Ref } from 'vue';
import GlobalStore from '@/store/modules/global';
import { watch, type Ref, type WatchSource } from 'vue';
export type SearchFields = Record<string, Ref<string | number | undefined>>;
type SearchValues = Record<string, string | number | undefined>;
/** Shared by normal page visits and edit-return visits; navigation never evicts a query. */
export const createSearchStateStorage = (storage: () => Storage = () => localStorage) => {
const unsaved = new Map<string, SearchValues>();
return {
save(key: string, values: SearchValues) {
try {
const target = storage();
const storageKey = `1panel:search-state:v2:${key}`;
const serialized = JSON.stringify(
Object.fromEntries(Object.entries(values).map(([name, value]) => [name, value ?? null])),
);
if (target.getItem(storageKey) !== serialized) target.setItem(storageKey, serialized);
unsaved.delete(key);
} catch {
// Only failed writes need an in-memory fallback.
unsaved.set(key, { ...values });
}
},
read(key: string): SearchValues | undefined {
const cached = unsaved.get(key);
if (cached) return { ...cached };
try {
const saved = JSON.parse(storage().getItem(`1panel:search-state:v2:${key}`) || 'null');
if (!saved || typeof saved !== 'object' || Array.isArray(saved)) return undefined;
return Object.fromEntries(
Object.entries(saved)
.filter(
([, value]) =>
value === null ||
typeof value === 'string' ||
(typeof value === 'number' && Number.isFinite(value)),
)
.map(([name, value]) => [name, value === null ? undefined : value]),
) as SearchValues;
} catch {
return undefined;
}
},
export const bindSearchReset = (sources: WatchSource[], fields: SearchFields) => {
const defaults = Object.values(fields).map((field) => ({ field, value: field.value }));
const reset = () => {
for (const { field, value } of defaults) field.value = value;
};
};
const searchStorage = createSearchStateStorage();
export const bindSearchState = (key: () => string | undefined, fields: SearchFields, storage = searchStorage) => {
const defaults = Object.fromEntries(Object.entries(fields).map(([name, field]) => [name, field.value]));
const names = Object.keys(fields).sort((left, right) => Number(left === 'page') - Number(right === 'page'));
let pending: { key: string; values: SearchValues } | undefined;
let queued = false;
const flush = () => {
if (!pending) return;
const snapshot = pending;
pending = undefined;
storage.save(snapshot.key, snapshot.values);
};
onScopeDispose(flush);
let restoring = false;
let activeKey: string | undefined;
const restore = () => {
// Commit the previous node/resource before restoring another one.
flush();
activeKey = key();
if (!activeKey) return;
const saved = storage.read(activeKey) || defaults;
restoring = true;
try {
// Restore pagination last: search/filter watchers may reset it to page one.
for (const name of names) {
const value = Object.hasOwn(saved, name) ? saved[name] : defaults[name];
const initial = defaults[name];
fields[name].value =
initial !== undefined && value !== undefined && typeof value !== typeof initial ? initial : value;
}
} finally {
restoring = false;
}
};
watch(key, restore, { immediate: true, flush: 'sync' });
watch(
() => Object.fromEntries(Object.entries(fields).map(([name, field]) => [name, field.value])),
(values) => {
if (restoring || !activeKey) return;
pending = { key: activeKey, values };
if (queued) return;
queued = true;
queueMicrotask(() => {
queued = false;
flush();
});
},
{ flush: 'sync' },
);
};
interface SearchStateOptions {
scope?: () => string | number | undefined;
onRevisit: () => unknown;
}
/** Keep queries across page visits and reload data when a cached page becomes active. */
export const useSearchState = (page: string, fields: SearchFields, options: SearchStateOptions) => {
const { currentNode } = storeToRefs(GlobalStore());
bindSearchState(() => {
const scope = options.scope?.();
if (options.scope && scope === undefined) return undefined;
return JSON.stringify([currentNode.value, page, scope ?? '']);
}, fields);
let deactivated = false;
onDeactivated(() => {
deactivated = true;
});
onActivated(() => {
if (!deactivated) return;
deactivated = false;
return options.onRevisit();
});
watch(sources, reset, { flush: 'sync' });
return reset;
};
@@ -172,7 +172,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { computed, ref, watch } from 'vue';
import { Refresh, Search } from '@element-plus/icons-vue';
import { ElMessageBox } from 'element-plus';
@@ -193,8 +193,7 @@ const searching = ref(false);
const operating = ref('');
const keyword = ref('');
const marketKeyword = ref('');
useSearchState(
'ai/agents/agent/config/tabs/plugins',
useSearchReset(
{ keyword, marketKeyword },
{
scope: () => agentId.value || undefined,
@@ -138,7 +138,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { computed, ref, watch } from 'vue';
import { Refresh, Search } from '@element-plus/icons-vue';
import { useI18n } from 'vue-i18n';
@@ -169,8 +169,7 @@ const getDefaultMarketSource = (): HermesSkillMarketSource => {
const marketSource = ref<HermesSkillMarketSource>(getDefaultMarketSource());
const marketSearched = ref(false);
const agentId = ref(0);
useSearchState(
'ai/agents/agent/config/tabs/skills/hermes',
useSearchReset(
{ installedKeyword, marketKeyword },
{
scope: () => agentId.value || undefined,
@@ -142,7 +142,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { computed, ref, watch } from 'vue';
import { Refresh, Search } from '@element-plus/icons-vue';
import { useI18n } from 'vue-i18n';
@@ -181,8 +181,7 @@ const getDefaultMarketSource = (): SkillMarketSource => {
const marketSource = ref<SkillMarketSource>(getDefaultMarketSource());
const marketSearched = ref(false);
const agentId = ref(0);
useSearchState(
'ai/agents/agent/config/tabs/skills/openclaw',
useSearchReset(
{ installedKeyword, marketKeyword },
{
scope: () => agentId.value || undefined,
+2 -6
View File
@@ -272,7 +272,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { toRef, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { deleteAgentCheck, pageAgents, resetAgentToken, unbindAgentWebsite, updateAgentRemark } from '@/api/modules/ai';
@@ -400,11 +400,7 @@ const paginationConfig = reactive({
pageSize: 10,
total: 0,
});
useSearchState(
'ai/agents/agent/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const checkNoApp = async () => {
try {
+2 -6
View File
@@ -69,7 +69,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { toRef, onMounted, reactive, ref } from 'vue';
import { deleteAgentAccount, getAgentProviders, pageAgentAccounts } from '@/api/modules/ai';
import { AI } from '@/api/interface/ai';
@@ -111,11 +111,7 @@ const paginationConfig = reactive({
pageSize: 10,
total: 0,
});
useSearchState(
'ai/agents/model/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const search = async () => {
const req: AI.AgentAccountSearch = {
+2 -6
View File
@@ -186,7 +186,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import AppStatus from '@/components/app-status/index.vue';
import AddDialog from '@/views/ai/model/ollama/add/index.vue';
import Conn from '@/views/ai/model/ollama/conn/index.vue';
@@ -237,11 +237,7 @@ const paginationConfig = reactive({
total: 0,
});
const searchName = ref();
useSearchState(
'ai/model/ollama/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const appInstallID = ref(0);
const opRef = ref();
+2 -3
View File
@@ -70,7 +70,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { App } from '@/api/interface/app';
import { toRef, onMounted, reactive, ref } from 'vue';
import { searchApp, syncApp, syncCutomAppStore, syncLocalApp, getCurrentNodeCustomAppConfig } from '@/api/modules/app';
@@ -105,8 +105,7 @@ const req = reactive({
resource: 'all',
showCurrentArch: false,
});
useSearchState(
'app-store/apps/index',
useSearchReset(
{ search: toRef(req, 'name'), page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search(req) },
);
@@ -139,7 +139,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import AppCard from '@/views/app-store/installed/app/card.vue';
import Backups from '@/components/backup/index.vue';
import Uploads from '@/components/upload/index.vue';
@@ -211,8 +211,7 @@ const searchReq = reactive({
update: false,
sync: false,
});
useSearchState(
'app-store/installed/index',
useSearchReset(
{ search: toRef(searchReq, 'name'), page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
@@ -522,7 +522,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { computed, h, ref } from 'vue';
import CodemirrorPro from '@/components/codemirror-pro/index.vue';
import ContainerLog from '@/components/log/container/index.vue';
@@ -577,7 +577,7 @@ const dialogBackupRef = ref();
const uploadRef = ref();
const searchName = ref('');
useSearchState('container/compose/index', { search: searchName }, { onRevisit: () => search() });
useSearchReset({ search: searchName }, { onRevisit: () => search() });
const includeAppStore = ref(localStorage.getItem('includeAppStore') !== 'false');
const showType = ref('compose');
const containerStats = ref<any[]>([]);
@@ -474,7 +474,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import PruneDialog from '@/views/container/container/prune/index.vue';
import RenameDialog from '@/views/container/container/rename/index.vue';
import UpgradeDialog from '@/views/container/container/upgrade/index.vue';
@@ -536,6 +536,7 @@ const paginationConfig = reactive({
order: 'ascending',
});
const searchName = ref();
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const dialogUpgradeRef = ref();
const dialogCommitRef = ref();
const dialogPortJumpRef = ref();
@@ -551,18 +552,6 @@ const taskLogRef = ref();
const tags = ref([]);
const activeTag = ref('all');
useSearchState(
'container/container/index',
{
search: searchName,
page: toRef(paginationConfig, 'currentPage'),
state: toRef(paginationConfig, 'state'),
activeTag,
orderBy: toRef(paginationConfig, 'orderBy'),
order: toRef(paginationConfig, 'order'),
},
{ onRevisit: () => search() },
);
const activeDropdownContainerId = ref('');
const statFields = [
+2 -3
View File
@@ -157,7 +157,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { toRef, reactive, ref, computed } from 'vue';
import { dateFormat } from '@/utils/date';
import { newUUID } from '@/utils/id';
@@ -200,8 +200,7 @@ const paginationConfig = reactive({
orderBy: 'createdAt',
order: 'null',
});
useSearchState(
'container/image/index',
useSearchReset(
{ search: toRef(paginationConfig, 'name'), page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
@@ -95,7 +95,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import CreateDialog from '@/views/container/network/create/index.vue';
import DetailDrawer from '@/views/container/network/detail/index.vue';
import { toRef, reactive, ref } from 'vue';
@@ -121,11 +121,7 @@ const paginationConfig = reactive({
total: 0,
});
const searchName = ref();
useSearchState(
'container/network/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const opRef = ref();
const isActive = ref(false);
+2 -6
View File
@@ -59,7 +59,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import OperatorDialog from '@/views/container/repo/operator/index.vue';
import { toRef, reactive, ref } from 'vue';
import { dateFormat } from '@/utils/date';
@@ -78,11 +78,7 @@ const paginationConfig = reactive({
total: 0,
});
const searchName = ref();
useSearchState(
'container/repo/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const opRef = ref();
const confirmDialog = ref();
@@ -81,7 +81,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { toRef, reactive, ref } from 'vue';
import { dateFormat, getCurrentDateFormatted } from '@/utils/date';
import { downloadWithContent } from '@/utils/file';
@@ -111,11 +111,7 @@ const paginationConfig = reactive({
total: 0,
});
const searchName = ref();
useSearchState(
'container/template/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const search = async () => {
if (!isActive.value || !isExist.value) {
@@ -124,7 +124,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import CreateDialog from '@/views/container/volume/create/index.vue';
import CodemirrorDrawer from '@/components/codemirror-pro/drawer.vue';
import DockerStatus from '@/views/container/docker-status/index.vue';
@@ -158,11 +158,7 @@ const paginationConfig = reactive({
total: 0,
});
const searchName = ref();
useSearchState(
'container/volume/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const isActive = ref(false);
const isExist = ref(false);
+2 -6
View File
@@ -272,7 +272,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import Records from '@/views/cronjob/cronjob/record/index.vue';
import Backups from '@/views/cronjob/cronjob/backup/index.vue';
import Import from '@/views/cronjob/cronjob/import/index.vue';
@@ -332,11 +332,7 @@ const pageState = usePageState(() => ({
}));
const paginationConfig = pageState.paginationConfig;
const { defaultGroupID, searchName, searchGroupID } = toRefs(pageState);
useSearchState(
'cronjob/cronjob/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const search = async (column?: any) => {
if (column) {
+2 -6
View File
@@ -132,7 +132,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { dateFormat, getCurrentDateFormatted } from '@/utils/date';
import { deepCopy } from '@/utils/misc';
import { newUUID } from '@/utils/id';
@@ -170,11 +170,7 @@ const paginationConfig = reactive({
total: 0,
});
const searchInfo = ref<string>('');
useSearchState(
'cronjob/library/index',
{ search: searchInfo, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchInfo, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const group = ref<string>('');
const groupOptions = ref();
@@ -323,7 +323,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { toRef, nextTick, onMounted, reactive, ref } from 'vue';
import { dateFormat } from '@/utils/date';
import { getRandomStr } from '@/utils/id';
@@ -399,11 +399,7 @@ const paginationConfig = reactive({
orderBy: 'createdAt',
order: 'null',
});
useSearchState(
'database/mongodb/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
type FormInstance = InstanceType<typeof ElForm>;
const formRef = ref<FormInstance>();
@@ -75,7 +75,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { dateFormat } from '@/utils/date';
import { toRef, onMounted, reactive, ref } from 'vue';
import { deleteCheckDatabase, searchDatabases } from '@/api/modules/database';
@@ -101,11 +101,7 @@ const paginationConfig = reactive({
order: 'null',
});
const searchName = ref();
useSearchState(
'database/mongodb/remote/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const search = async (column?: any) => {
paginationConfig.orderBy = column?.order ? column.prop : paginationConfig.orderBy;
+2 -6
View File
@@ -226,7 +226,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import BindDialog from '@/views/database/mysql/bind/index.vue';
import UserDialog from '@/views/database/mysql/user/index.vue';
import OperateDialog from '@/views/database/mysql/create/index.vue';
@@ -301,11 +301,7 @@ const paginationConfig = reactive({
order: 'null',
});
const searchName = ref();
useSearchState(
'database/mysql/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const mysqlContainer = ref();
const mysqlStatus = ref();
@@ -74,7 +74,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { dateFormat } from '@/utils/date';
import { toRef, onMounted, reactive, ref } from 'vue';
import { deleteCheckDatabase, searchDatabases } from '@/api/modules/database';
@@ -100,11 +100,7 @@ const paginationConfig = reactive({
order: 'null',
});
const searchName = ref();
useSearchState(
'database/mysql/remote/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const search = async (column?: any) => {
paginationConfig.orderBy = column?.order ? column.prop : paginationConfig.orderBy;
@@ -241,7 +241,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import BindDialog from '@/views/database/postgresql/bind/index.vue';
import OperateDialog from '@/views/database/postgresql/create/index.vue';
import DeleteDialog from '@/views/database/postgresql/delete/index.vue';
@@ -313,11 +313,7 @@ const paginationConfig = reactive({
order: 'null',
});
const searchName = ref();
useSearchState(
'database/postgresql/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const postgresqlContainer = ref();
const postgresqlStatus = ref();
@@ -74,7 +74,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { dateFormat } from '@/utils/date';
import { toRef, onMounted, reactive, ref } from 'vue';
import { deleteCheckDatabase, searchDatabases } from '@/api/modules/database';
@@ -100,11 +100,7 @@ const paginationConfig = reactive({
order: 'null',
});
const searchName = ref();
useSearchState(
'database/postgresql/remote/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const search = async (column?: any) => {
paginationConfig.orderBy = column?.order ? column.prop : paginationConfig.orderBy;
@@ -73,7 +73,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { dateFormat } from '@/utils/date';
import { toRef, onMounted, reactive, ref } from 'vue';
import { deleteCheckDatabase, searchDatabases } from '@/api/modules/database';
@@ -99,11 +99,7 @@ const paginationConfig = reactive({
order: 'null',
});
const searchName = ref();
useSearchState(
'database/redis/remote/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const search = async (column?: any) => {
paginationConfig.orderBy = column?.order ? column.prop : paginationConfig.orderBy;
@@ -739,7 +739,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { toRef, computed, nextTick, onBeforeUnmount, onMounted, reactive, ref } from 'vue';
import {
addFavorite,
@@ -985,8 +985,7 @@ const paginationConfig = reactive({
pageSize: Number(localStorage.getItem('file-page-size')) || 100,
total: 0,
});
useSearchState(
'host/file-management/index',
useSearchReset(
{ search: toRef(req, 'search'), page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
@@ -15,7 +15,19 @@
<div v-for="issue in issues" :key="issue.family" class="family-row">
<div class="family-row__body">
<el-tag size="small" type="info" effect="plain">{{ issue.family === 'ipv6' ? 'IPv6' : 'IPv4' }}</el-tag>
<p>{{ issue.message }}</p>
<p>
{{ issue.message }}
<el-link
v-if="issue.helpUrl"
class="ml-1 text-xs"
type="primary"
target="_blank"
rel="noopener noreferrer"
:href="issue.helpUrl"
>
{{ $t('commons.button.helpDoc') }}
</el-link>
</p>
</div>
<el-button
v-if="issue.action"
@@ -55,6 +67,7 @@ import i18n from '@/lang';
interface FamilyIssue {
family: 'ipv4' | 'ipv6';
message: string;
helpUrl?: string;
action?: 'initialize' | 'repair' | 'bind';
}
const props = defineProps<{
@@ -219,7 +219,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { computed, reactive, ref, watch } from 'vue';
import FireRouter from '@/views/host/firewall/index.vue';
import DockerGuardStatus from '@/views/host/firewall/docker/status/index.vue';
@@ -263,8 +263,7 @@ const openRuleTask = (taskID: string) => taskLogRef.value?.openWithTaskID(taskID
const orphanDrawerVisible = ref(false);
const orphanSearchName = ref('');
const searchName = ref('');
useSearchState(
'host/firewall/docker/index',
useSearchReset(
{ search: searchName },
{
onRevisit: () => {
@@ -117,7 +117,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import OperateDialog from './operate/index.vue';
import ImportDialog from './import/index.vue';
import FireRouter from '@/views/host/firewall/index.vue';
@@ -188,11 +188,7 @@ const paginationConfig = reactive({
pageSize: Number(localStorage.getItem('firewall-forward-page-size')) || 20,
total: 0,
});
useSearchState(
'host/firewall/forward/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const search = async () => {
if (!isInit.value || !isBind.value || fireName.value === '-') {
@@ -302,7 +302,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { Firewall } from '@/api/interface/firewall';
import type { FuTableOperationButton } from '@/components/table/shared';
import { buildHostRuleExport } from './transfer';
@@ -432,11 +432,7 @@ const paginationConfig = reactive({
pageSize: Number(localStorage.getItem('firewall-rule-page-size')) || 20,
total: 0,
});
useSearchState(
'host/firewall/rule/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const providerScopes = (): Firewall.Scope[] => {
if (provider.value === 'iptables' || provider.value === 'nftables') {
@@ -182,10 +182,12 @@ import TaskLog from '@/components/log/task/index.vue';
import FamilyIssues from '@/views/host/firewall/components/family-issues.vue';
import RuleInitialize from '@/views/host/firewall/components/rule-initialize.vue';
import { newUUID } from '@/utils/id';
import { useGlobalStore } from '@/composables/useGlobalStore';
const props = defineProps({
currentTab: String,
});
const { docsUrl } = useGlobalStore();
const goToFirewallSetting = () => routerToName('FirewallSetting');
const goToScriptLibrary = () => routerToNameWithQuery('Library', { uncached: 'true' });
@@ -272,6 +274,10 @@ const familyActions = computed(() =>
return {
family: issue.family === 'IPv6' ? ('ipv6' as const) : ('ipv4' as const),
message: familyIssueText(issue),
helpUrl:
issue.available && issue.reason === 'ipv6_ra_required'
? `${docsUrl.value}/user_manual/hosts/firewall`
: undefined,
action,
};
}),
+2 -6
View File
@@ -93,7 +93,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import ConfirmDialog from '@/components/confirm-dialog/index.vue';
import { dateFormatServerTimezone } from '@/utils/date';
import { downloadFile } from '@/utils/file';
@@ -120,11 +120,7 @@ const exportConfig = reactive({
status: 'All',
});
const searchInfo = ref();
useSearchState(
'host/ssh/log/log',
{ search: searchInfo, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchInfo, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const searchStatus = ref('All');
const search = async () => {
@@ -24,7 +24,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import FireRouter from '@/views/host/ssh/index.vue';
import { toRef, ref, onMounted, onUnmounted, reactive } from 'vue';
import i18n from '@/lang';
@@ -38,7 +38,7 @@ const sshSearch = reactive({
type: 'ssh',
loginUser: '',
});
useSearchState('host/ssh/session/index', { search: toRef(sshSearch, 'loginUser') }, { onRevisit: () => search() });
useSearchReset({ search: toRef(sshSearch, 'loginUser') }, { onRevisit: () => search() });
const buttons = [
{
+2 -2
View File
@@ -101,7 +101,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { onMounted, onUnmounted, reactive, ref, watch } from 'vue';
import { Log } from '@/api/interface/log';
import { getSystemLogStatus, listRunningServices, readSystemLogs } from '@/api/modules/log';
@@ -114,7 +114,7 @@ const logs = ref<Log.SystemLogItem[]>([]);
const loading = ref(false);
const watching = ref(false);
const keyword = ref('');
useSearchState('log/host-system/index', { keyword }, { onRevisit: () => scheduleFilterSearch() });
useSearchReset({ keyword }, { onRevisit: () => scheduleFilterSearch() });
const priority = ref('');
const service = ref('');
const services = ref<string[]>([]);
+2 -6
View File
@@ -45,7 +45,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import ConfirmDialog from '@/components/confirm-dialog/index.vue';
import LogRouter from '@/views/log/router/index.vue';
import { dateFormat } from '@/utils/date';
@@ -67,11 +67,7 @@ const paginationConfig = reactive({
total: 0,
});
const searchInfo = ref<string>('');
useSearchState(
'log/login/index',
{ search: searchInfo, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchInfo, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const searchStatus = ref<string>('');
const search = async () => {
+2 -6
View File
@@ -139,7 +139,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import ConfirmDialog from '@/components/confirm-dialog/index.vue';
import LogRouter from '@/views/log/router/index.vue';
import { dateFormat } from '@/utils/date';
@@ -160,11 +160,7 @@ const paginationConfig = reactive({
total: 0,
});
const searchName = ref<string>('');
useSearchState(
'log/operation/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const searchGroup = ref<string>('');
const searchStatus = ref<string>('');
const searchNode = ref<string>('');
@@ -120,7 +120,7 @@
</div>
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { dateFormat } from '@/utils/date';
import { toRef, onMounted, ref } from 'vue';
import { searchBackup, deleteBackup, refreshToken } from '@/api/modules/backup';
@@ -143,8 +143,7 @@ const paginationConfig = reactive({
type: '',
name: '',
});
useSearchState(
'setting/backup-account/index',
useSearchReset(
{ search: toRef(paginationConfig, 'name'), page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
@@ -225,7 +225,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import {
searchSnapshotPage,
snapshotDelete,
@@ -261,11 +261,7 @@ const paginationConfig = reactive({
order: 'null',
});
const searchName = ref();
useSearchState(
'setting/snapshot/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const opRef = ref();
@@ -100,7 +100,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { Command } from '@/api/interface/command';
import GroupDialog from '@/components/group/index.vue';
import OperateDialog from '@/views/terminal/command/operate/index.vue';
@@ -124,11 +124,7 @@ const paginationConfig = reactive({
order: 'ascending',
});
const info = ref();
useSearchState(
'terminal/command/index',
{ search: info, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: info, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const group = ref<string>('');
const dialogRef = ref();
const opRef = ref();
+2 -6
View File
@@ -79,7 +79,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import GroupDialog from '@/components/agent-group/index.vue';
import OperateDialog from '@/views/terminal/host/operate/index.vue';
import { deleteHost, editHostGroup, searchHosts } from '@/api/modules/terminal';
@@ -100,11 +100,7 @@ const paginationConfig = reactive({
total: 0,
});
const info = ref();
useSearchState(
'terminal/host/index',
{ search: info, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: info, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const group = ref<string>('');
const opRef = ref();
+2 -6
View File
@@ -190,7 +190,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { toRef, onMounted, reactive, ref } from 'vue';
import i18n from '@/lang';
import { MsgSuccess } from '@/utils/message';
@@ -218,11 +218,7 @@ const paginationConfig = reactive({
order: 'null',
});
const searchName = ref();
useSearchState(
'toolbox/clam/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const opRef = ref();
const dialogRef = ref();
+2 -6
View File
@@ -174,7 +174,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { toRef, onMounted, reactive, ref } from 'vue';
import i18n from '@/lang';
import { MsgError, MsgSuccess } from '@/utils/message';
@@ -201,11 +201,7 @@ const paginationConfig = reactive({
order: 'null',
});
const searchName = ref();
useSearchState(
'toolbox/ftp/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const form = reactive({
isActive: true,
@@ -33,7 +33,7 @@
</template>
<script setup lang="ts">
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { Runtime } from '@/api/interface/runtime';
import { GetPHPExtensions, InstallPHPExtension, UnInstallPHPExtension } from '@/api/modules/runtime';
import i18n from '@/lang';
@@ -49,11 +49,7 @@ const supportExtensions = ref([]);
const loading = ref(false);
const taskLogRef = ref();
const searchName = ref('');
useSearchState(
'website/runtime/php/extension-management/index',
{ search: searchName },
{ onRevisit: () => searchByName() },
);
useSearchReset({ search: searchName }, { onRevisit: () => searchByName() });
const data = ref([]);
const handleClose = () => {
+2 -3
View File
@@ -221,7 +221,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { toRef, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
import { deleteSSL, downloadFile, pushSSLToNode, searchSSL, updateSSL } from '@/api/modules/website';
import DnsAccount from './dns-account/index.vue';
@@ -287,8 +287,7 @@ const req = reactive({
orderBy: 'updated_at',
order: 'descending',
});
useSearchState(
'website/ssl/index',
useSearchReset(
{ search: toRef(req, 'domain'), page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
@@ -59,7 +59,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import { Website } from '@/api/interface/website';
import { deleteTemplate, searchTemplates } from '@/api/modules/website';
import TemplateOperate from '@/views/website/template/operate/index.vue';
@@ -90,11 +90,7 @@ const paginationConfig = reactive({
pageSize: 20,
total: 0,
});
useSearchState(
'website/template/index',
{ search: searchName, page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);
useSearchReset({ search: searchName, page: toRef(paginationConfig, 'currentPage') }, { onRevisit: () => search() });
const buttons = [
{
+2 -3
View File
@@ -346,7 +346,7 @@
</template>
<script lang="ts" setup>
import { useSearchState } from '@/utils/search-reset';
import { useSearchReset } from '@/composables/useSearchReset';
import Backups from '@/components/backup/index.vue';
import UploadDialog from '@/components/upload/index.vue';
import DefaultServer from '@/views/website/website/default/index.vue';
@@ -451,8 +451,7 @@ const pageState = usePageState(() => ({
}));
const paginationConfig = pageState.paginationConfig;
const req = pageState.req;
useSearchState(
'website/website/index',
useSearchReset(
{ search: toRef(req, 'name'), page: toRef(paginationConfig, 'currentPage') },
{ onRevisit: () => search() },
);