fluigcli widget — widgets
O grupo widget empacota, publica e importa widgets. O layout local é este:
wcm/widget/<NomeWidget>/
├── pom.xml
└── src/main/
├── resources/ # .ftl, .properties, application.info → WEB-INF/classes no WAR
├── webapp/WEB-INF/*.xml
└── webapp/resources/ # js, css, imagens- new cria o esqueleto local. Nada vai ao servidor.
- export envia o projeto local ao servidor (deploy). O comando é nativo (
uploadfile). - import traz o servidor para o projeto local. O comando usa o fluigcliHelper. O Fluig não expõe o download do pacote da widget nativamente. Isso foi confirmado na Voyager 2.0.0.
fluigcli widget new <code>
Este comando cria wcm/widget/<code>/ com o esqueleto completo. O esqueleto segue o padrão oficial do Fluig. Ele é o mesmo dos samples da TOTVS. Ele traz application.info, view.ftl/edit.ftl e properties de i18n (base + pt_BR/en_US/es). Ele traz jboss-web.xml com o context-root. Ele traz JS no padrão SuperWidget com um binding de exemplo. Ele traz CSS, ícone e um README.md. O README tem o passo a passo de desenvolvimento e deploy. O README fica na raiz da widget e não entra no WAR.
fluigcli widget new meu_painel --title "Meu Painel"
fluigcli widget export meu_painel # publica quando quiser- O
<code>vira context-root, id de DOM e global JS. Use minúsculas, dígitos e_. Comece por letra. Por exemplo,meu_painel→ globalMeuPainel. - Flags:
--title(padrão: o código),--category(padrão:SYSTEM) e--template. A categoria é texto livre. Ela vira uma aba própria na galeria do editor de páginas. A galeria lista por título, nunca pelo código. - A pasta não pode existir. Código ou template inválidos = exit 2, sem criar nada.
- No
--json:{widget, template, dir, files}.
Templates
classic(padrão) — o esqueleto oficial puro, sem toolchain: FTL + JSSuperWidget+ CSS. Você não instala nada. Edite e publique.react— igual aovue, com outra camada de framework: SPA React 19 + TypeScript + Vite. As fontes ficam emsrc/react/. Omain.tsxmonta um root por instância. O kit vem em hooks (por exemplo,useDataset). Os estilos ficam emapp.css, sempre prefixados com o container. O React não tem CSS com escopo automático. Todo o resto (casca, dev, build e deploy) é idêntico ao template vue abaixo.vue— SPA Vue 3 + TypeScript + Vite dentro da casca oficial:shfluigcli widget new meu_painel --template vue --title "Meu Painel" cd wcm/widget/meu_painel npm install && npm run build fluigcli widget export meu_painel- O código da SPA fica em
src/vue/, fora do WAR. O build emite 1 JS + 1 CSS com o nome da widget direto emsrc/main/webapp/resources/. A saída é versionada. Por isso, owidget exportfunciona sem Node (por exemplo, em CI). - Dois modos de dev. Use
npm run dev(Vite com HMR). A página simula o portal com o style guide real. O proxy aponta para ofluigcli dev, que injeta a sessão autenticada. Nenhuma credencial fica no.env. Ou usenpm run watch+fluigcli dev. A widget roda dentro do portal real, com live reload. - A SPA é multi-instância por construção. A ponte em
src/vue/main.tsmonta um app Vue porinstanceId. - As preferências por instância vêm prontas:
edit.ftl(formulário clássico) →UPDATEPREFERENCES→ propconfigsnoApp.vue. - O kit vem incluído:
useDataset(consulta de datasets), wrappers deFLUIGC.toast/loadinge i18n da SPA (WCMAPI.getLocale()). - O visual usa as classes do Fluig Style Guide. O portal já carrega o CSS. O dark mode funciona sozinho. Não há UI kit embutido.
- O
README.mdgerado na widget traz o passo a passo completo: pré-requisitos, dev, build e deploy. - O deploy sai em um comando. O
fluigcli widget export <code> --buildroda onpm run buildantes de empacotar. Falha de build = exit 2, e nada é enviado. Sem--build, o export avisa quando o bundle está desatualizado em relação à fonte.
- O código da SPA fica em
vue+--vuetify— variante do template vue com Vuetify 3 via npm. Ovite-plugin-vuetifyfaz tree-shaking. Só os componentes usados entram no bundle. Os ícones vêm do @mdi/font. As stringsmdi-*funcionam como nas widgets Vuetify antigas. Este é o caminho para converter widgets Vuetify presas em stack velha por CDN. Ele mantém o visual.shfluigcli widget new meu_painel --template vue --vuetify --title "Meu Painel"Tudo do template vue vale aqui (dev, build e deploy). Mudam o
App.vuede exemplo (componentes Vuetify) e as dependências. As fontes de ícone vão no WAR. O próprio Fluig as serve. As URLs no CSS são relativas, sem CDN. Pesos de referência: JS ~190 KB (68 gzip) + CSS ~640 KB (91 gzip) + fonte ~400 KB (woff2). ⚠️ O tema do Vuetify não segue o dark mode do portal sozinho. ConfigurecreateVuetify({theme})se precisar. Para widget nova sem legado Vuetify, prefira o template vue puro (69 KB).
fluigcli widget list
Este comando lista os widgets customizados do servidor.
- Com o fluigcliHelper instalado, o comando usa a listagem dele. Esta listagem é completa. Ela traz o arquivo
.warde cada widget. Owidget importusa esse arquivo. - Sem o helper, o comando cai para a API nativa (
page-management/applications) com um aviso. A listagem funciona, mas pode omitir widgets. Isso foi validado na homologação: 3 de 28 não aparecem, embora instaladas. A API nativa também não traz o arquivo do import. No--json, o camposourceindica qual fonte respondeu (fluigcliHelperounative).
fluigcli widget import <code>... | --all
Este comando baixa e desempacota widgets em wcm/widget/<code>/. Ele segue este mapa:
| No WAR | No projeto |
|---|---|
resources/** | src/main/webapp/resources/** |
WEB-INF/classes/<arq> | src/main/resources/<arq> |
WEB-INF/classes/<pkg>/** | src/main/java/<pkg>/** |
WEB-INF/<arq> | src/main/webapp/WEB-INF/<arq> |
pom.xml | pom.xml |
O comando preserva os arquivos binários (imagens, fontes) byte a byte.
fluigcli widget export <NomeWidget>
Este comando empacota o WAR em memória (compressão STORE) a partir do layout local. Ele publica via upload nativo. O servidor instala a widget de forma assíncrona.
fluigcli widget export minhaWidget --server homologEmpacotamento (local → WAR):
| No projeto | No WAR |
|---|---|
src/main/webapp/WEB-INF/** | WEB-INF/** |
src/main/resources/** | WEB-INF/classes/** |
src/main/webapp/resources/** | resources/** |