Skip to content

Pre production2 - #831

Open
charles-ramos wants to merge 22 commits into
production2from
pre-production2
Open

Pre production2#831
charles-ramos wants to merge 22 commits into
production2from
pre-production2

Conversation

@charles-ramos

Copy link
Copy Markdown
Member

New Pull Request Checklist

Issue Description

Closes: FILL_THIS_OUT

Approach

TODOs before merging

  • Add tests
  • Add changes to documentation (guides, repository pages, in-code descriptions)

charles-ramos and others added 22 commits August 21, 2026 22:42
Fase A do porte production1 -> production2:
- src/dashboard/Data/Agent/ (Agent.react.js, Agent.scss, AgentConfigDialog.react.js)
  e src/lib/AgentService.js
- Empty state com B4aEmptyState + botao Configure; dialog com B4aFormModal (padrao
  visual do production2)
- Form "Configure" (localStorage, provider OpenAI) para o usuario informar a apiKey
  pela UI, sem editar o config.json
- Rota /agent no Dashboard.js + secao Agent na sidebar (DashboardView)
- Parse-Dashboard/app.js: porta a rota POST /apps/:appId/agent + makeOpenAIRequest +
  database tools + conversas; adiciona require('parse/node'); usa fetch global (Node 18,
  sem node-fetch); express.json() escopado so na rota (production2 nao tem body-parser global)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
O package.json declarava core-js em 3.28.0 (dependencies) e 3.6.5 (devDependencies).
Sem lockfile, o npm install deixava o 3.6.5 no topo, que nao tem modulos como
es.error.cause.js/es.array.at.js/etc. O babel usa corejs '3.28' (useBuiltIns 'entry'),
entao o `npm run dashboard` (webpack build.config.js) quebrava com ~40 erros
"Can't resolve 'core-js/modules/...'". Alinhado ambos para 3.28.0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sem lockfile, o npm resolvia um tslib antigo (sem __spreadArray) no topo. O
@amplitude/analytics-core chama tslib.__spreadArray em runtime -> TypeError ->
tela branca no dashboard. tslib e transitivo (nao esta no package.json), entao
forcei via "overrides" para 2.6.2 (tem __spreadArray, retrocompativel).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…uction2

- Agent.scss convertido do tema claro (production1) para o dark do production2:
  fundo #0f1c32, superficies/bolhas/input escuros, texto claro, acento azul.
  Layout/estrutura mantidos.
- Toolbar: section "Core" -> "Agent" (breadcrumb correto).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Porta da production1 os constraints que faltavam no production2:
- matches (regex, String) -> query.matches(field, str, modifiers)
- onOrBefore (Date) -> query.lessThanOrEqualTo
- onOrAfter (Date) -> query.greaterThanOrEqualTo
Definicoes em Constraints + FieldConstraints (String/Date) em src/lib/Filters.js,
e os cases correspondentes em src/lib/queryFromFilters.js. O production2 ja tinha
neq/keyNeq/stringContainsString.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…que)

O BrowserCell do production2 importa B4aBrowserCell.scss, que NAO tinha as classes
.selected/.leftBorder/.rightBorder/.topBorder/.bottomBorder. A logica de selecao
(handleCellClick + selectedCells) ja funcionava, mas classes.push(styles.selected)
empurrava undefined -> celula selecionava internamente mas nao pintava (nenhum erro
no console). Copiadas as 5 regras do BrowserCell.scss normal.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…curo

- Cmd/Ctrl+C agora copia o INTERVALO de celulas selecionadas (tab/newline), nao so a
  celula focada. No production2 o range faz setCurrent(null) -> copyableValue undefined
  -> o case 67 existente nao copiava nada. Adicionado o copy multi-celula no topo do
  handleKey (guard >= 0 pra nao quebrar no estado inicial).
- .selected: de #e3effd (claro) para rgba(22,105,252,.3) e bordas #1669fc — legivel no
  Data Browser escuro do production2 (antes o texto claro sumia no fundo azul-claro).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Portado da production1: no handleKey, case 32 (Space) faz toggle do selectRow da
linha "current" (quando nao esta editando). production2 nao tinha esse case.
Guards para this.props.selectRow/selection/data existirem.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lique pegar

O checkbox usava checked={selection['*'] || selection[obj.id]} sem coercao — quando
selection[id] era undefined, o input virava NAO-controlado, e a transicao
nao-controlado->controlado no clique fazia o React nao registrar a marcacao. Coercao
com !! (igual production1) mantem o input sempre controlado. O espaco ja funcionava
porque ia direto no selectRow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…(upstream)

Porta a feature drag-to-select da production1: mousedown num checkbox inicia o
arrasto, cada checkbox que o mouse passa por cima marca/desmarca, mouseup encerra.
- Browser.react: estado rowCheckboxDragging/draggedRowSelection, metodos
  onMouseDownRowCheckBox/onMouseUpRowCheckBox/onMouseOverRowCheckBox, listener global
  de mouseup, e passa os handlers pro DataBrowser (fluem via ...other ao BrowserTable).
- BrowserTable: repassa onMouseDown/OverRowCheckBox aos 3 <BrowserRow>.
- BrowserRow: checkbox com onMouseDown, checkCell com onMouseOver.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…orage

Agora que o pre-production2 tem getEnvVars/updateEnvVars (feature do production2):
- Configure -> Save: grava a apiKey na env var OPENAI_API_KEY do app (merge com as
  existentes via getEnvVars); dispara rebuild do app (comportamento da feature).
- Agent carrega: le a apiKey via getEnvVars; partes nao-secretas (name/provider/model)
  ficam em localStorage. A chave nunca persiste no disco do browser.
- Dialog: onSubmit retorna a promise -> modal mostra "Saving..." durante o rebuild e
  surface erros. Descricao do campo API Key atualizada.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- icon 'collaborate-solid' (nao existia no sprite -> item sem icone) trocado por
  'b4a-agent' (icone dedicado que ja existe em src/icons).
- Remove subsections: [] -> o Sidebar renderizava um submenu VAZIO (bloco grande em
  branco abaixo de "Agent"). Sem a chave subsections, o item fica compacto como o
  "Overview".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rtilhada

- AgentConfigDialog vira gerenciador de lista: 1 API Key compartilhada + N modelos
  (Display name + model), com "+ Add model" e "Remove" por modelo.
- saveAgentConfig({apiKey, models}): grava a chave no env var OPENAI_API_KEY (uma so)
  e a lista de modelos (nao-secreta) no localStorage; monta em memoria cada modelo
  com a chave compartilhada.
- loadAgentConfig: le a lista do localStorage + a chave do env var.
- O seletor "Model" no toolbar do Agent ja itera models -> troca entre eles.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Troca os icones dos menus do toolbar do Agent (que vieram do upstream) pelos B4a:
- Model: gear-solid -> b4a-app-settings-icon
- Permissions: locked-solid -> b4a-lock-icon
- Chat: collaborate-solid -> b4a-agent

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- B4aSidebarSection.getIconContent nao tinha case pro 'b4a-agent' -> no estado ATIVO
  caia no default (null) e o icone sumia. Add case que renderiza o sprite b4a-agent.
- AgentConfigDialog: "+ Add model" (link no rodape) vira um botao "+"
  (b4a-add-outline-circle) no topo da secao Models, seguindo o padrao de "adicionar row".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Layout (offsets eram da production1):
- left 300px -> 280px ($b4aSidebarWidth) no emptyStateOverlay e chatForm
- top/padding-top 116px -> 127px (header 63 + toolbar 64 do production2)
- sidebar colapsada: $sidebarCollapsedWidth -> 88px ($b4aSidebarCollapsedWidth)
- agentContainer: removido o background navy de 100vh que vazava ACIMA do toolbar
  cinza (a region do header). O navy agora vem do chatWindow/emptyStateOverlay,
  abaixo do toolbar.

Tooltips (title do BrowserMenu = tooltip nativo) mais descritivos:
- Model -> "Select AI model"
- Permissions -> "Permissions — what the agent can do in your database"
- Chat -> "Chat options (clear conversation)"

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…at" vago

Remove o menu "Chat" (que juntava Configure + Clear num icone so, pouco intuitivo)
e coloca dois botoes diretos no toolbar:
- "+" (b4a-add-outline-circle) -> abre o Configure (add/editar/remover modelos). tooltip
  "Add / configure models".
- Clear (b4a-trash-icon) -> limpa a conversa. tooltip "Clear conversation".
Estilo .toolbarAction (icone com padding + hover). clearChat ja guardava o browserMenuRef.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ixeira)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
lixeira parecia deletar dados, refresh parecia recarregar. O padrao de chat moderno
para recomecar e o icone de compor/lapis = nova conversa.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Lixeira parecia deletar dados, refresh parecia recarregar, lapis parecia editar/voltar.
Texto "Clear" e inequivoco. Tooltip "Clear conversation".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
O upgradePrompt (newFeaturesInLatestVersion) aparecia na pagina /apps sugerindo
atualizar o dashboard. Removido o bloco; upgradePrompt fica sempre null.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Rotulo no toolbar com o nome do modelo selecionado (title mostra o model id, ex.
  gpt-4o) — dá pra ver qual está ativo sem abrir o menu.
- selectedAgentModel deixa de ser global e passa a ser por-app (selectedAgentModel_<slug>);
  setDefaultModel respeita a escolha salva do app ou cai no primeiro modelo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant