|
11 | 11 | <button type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button> |
12 | 12 | </div> |
13 | 13 | <div class="openclaw-layout"> |
| 14 | + <section class="tool-config-write-card" :aria-label="t('toolConfig.openclaw.title')"> |
| 15 | + <div class="tool-config-write-copy"> |
| 16 | + <div class="tool-config-write-title">{{ t('toolConfig.openclaw.title') }}</div> |
| 17 | + <p class="tool-config-write-desc">{{ t('toolConfig.openclaw.desc') }}</p> |
| 18 | + </div> |
| 19 | + <label class="settings-toggle-row tool-config-write-toggle"> |
| 20 | + <input |
| 21 | + type="checkbox" |
| 22 | + autocomplete="off" |
| 23 | + :checked="isToolConfigWriteAllowed('openclaw')" |
| 24 | + :disabled="toolConfigPermissionSaving.openclaw" |
| 25 | + @change="setToolConfigPermission('openclaw', $event.target.checked)"> |
| 26 | + <span class="toggle-track"><span class="toggle-thumb"></span></span> |
| 27 | + <span>{{ toolConfigPermissionStatusLabel('openclaw') }}</span> |
| 28 | + </label> |
| 29 | + </section> |
| 30 | + |
14 | 31 | <section class="settings-card settings-card--wide openclaw-summary-card" aria-label="OpenClaw 当前摘要"> |
15 | 32 | <div class="settings-card-body"> |
16 | 33 | <div class="openclaw-summary-header"> |
|
32 | 49 | </div> |
33 | 50 | </section> |
34 | 51 |
|
| 52 | + <div class="tool-config-write-scope" :class="{ locked: !isToolConfigWriteAllowed('openclaw') }"> |
35 | 53 | <section class="settings-card settings-card--wide openclaw-workspace-card"> |
36 | 54 | <div class="settings-card-body"> |
37 | 55 | <div class="openclaw-tools-grid"> |
38 | | - <button class="openclaw-tool-btn" @click="openOpenclawAgentsEditor" :disabled="loading || !!initError || agentsLoading"> |
| 56 | + <button class="openclaw-tool-btn" @click="openOpenclawAgentsEditor" :disabled="loading || !!initError || agentsLoading || !isToolConfigWriteAllowed('openclaw')"> |
39 | 57 | <div class="tool-icon">📄</div> |
40 | 58 | <div class="tool-content"> |
41 | 59 | <div class="tool-title">AGENTS.md</div> |
|
52 | 70 | type="button" |
53 | 71 | class="openclaw-tool-btn" |
54 | 72 | @click="openOpenclawQuickWorkspaceFile(fileName)" |
55 | | - :disabled="loading || !!initError || agentsLoading"> |
| 73 | + :disabled="loading || !!initError || agentsLoading || !isToolConfigWriteAllowed('openclaw')"> |
56 | 74 | <div class="tool-icon">📄</div> |
57 | 75 | <div class="tool-content"> |
58 | 76 | <div class="tool-title">{{ fileName }}</div> |
|
70 | 88 | <div class="settings-card-body"> |
71 | 89 | <div class="card-list openclaw-card-list"> |
72 | 90 | <div v-for="(config, name) in openclawConfigs" :key="name" |
73 | | - :class="['card', { active: currentOpenclawConfig === name }]" |
74 | | - @click="applyOpenclawConfig(name)" |
75 | | - @keydown.enter.self.prevent="applyOpenclawConfig(name)" |
76 | | - @keydown.space.self.prevent="applyOpenclawConfig(name)" |
77 | | - tabindex="0" |
| 91 | + :class="['card', { active: currentOpenclawConfig === name, disabled: !isToolConfigWriteAllowed('openclaw') }]" |
| 92 | + @click="isToolConfigWriteAllowed('openclaw') && applyOpenclawConfig(name)" |
| 93 | + @keydown.enter.self.prevent="isToolConfigWriteAllowed('openclaw') && applyOpenclawConfig(name)" |
| 94 | + @keydown.space.self.prevent="isToolConfigWriteAllowed('openclaw') && applyOpenclawConfig(name)" |
| 95 | + :tabindex="isToolConfigWriteAllowed('openclaw') ? 0 : -1" |
78 | 96 | role="button" |
79 | 97 | :aria-label="t('openclaw.action.applyAria', { name })" |
| 98 | + :aria-disabled="!isToolConfigWriteAllowed('openclaw') ? 'true' : null" |
80 | 99 | :aria-current="currentOpenclawConfig === name ? 'true' : null"> |
81 | 100 | <div class="card-leading"> |
82 | 101 | <div class="card-icon">{{ name.charAt(0).toUpperCase() }}</div> |
|
95 | 114 | {{ openclawHasContent(config) ? t('openclaw.configured') : t('openclaw.notConfigured') }} |
96 | 115 | </span> |
97 | 116 | <div class="card-actions" @click.stop> |
98 | | - <button class="card-action-btn" @click="openOpenclawEditModal(name)" :aria-label="t('openclaw.action.editAria', { name })" :title="t('openclaw.action.edit')"> |
| 117 | + <button class="card-action-btn" @click="openOpenclawEditModal(name)" :disabled="!isToolConfigWriteAllowed('openclaw')" :aria-label="t('openclaw.action.editAria', { name })" :title="t('openclaw.action.edit')"> |
99 | 118 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
100 | 119 | <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/> |
101 | 120 | <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/> |
|
113 | 132 | </div> |
114 | 133 | </div> |
115 | 134 | </section> |
| 135 | + </div> |
116 | 136 | </div> |
117 | 137 | </div> |
0 commit comments