Merge branch 'master' into typing/stores-grid-ui
This commit is contained in:
commit
3a6e0406cf
|
@ -51,6 +51,7 @@
|
||||||
}
|
}
|
||||||
input.hide-arrows {
|
input.hide-arrows {
|
||||||
-moz-appearance: textfield;
|
-moz-appearance: textfield;
|
||||||
|
appearance: textfield;
|
||||||
}
|
}
|
||||||
input[type="time"]::-webkit-calendar-picker-indicator {
|
input[type="time"]::-webkit-calendar-picker-indicator {
|
||||||
display: none;
|
display: none;
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
|
appearance: none;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
}
|
}
|
||||||
input::-webkit-slider-thumb {
|
input::-webkit-slider-thumb {
|
||||||
|
|
|
@ -124,8 +124,6 @@
|
||||||
.spectrum-Tabs-selectionIndicator.emphasized {
|
.spectrum-Tabs-selectionIndicator.emphasized {
|
||||||
background-color: var(--spectrum-global-color-blue-400);
|
background-color: var(--spectrum-global-color-blue-400);
|
||||||
}
|
}
|
||||||
.spectrum-Tabs--horizontal .spectrum-Tabs-selectionIndicator {
|
|
||||||
}
|
|
||||||
.noHorizPadding {
|
.noHorizPadding {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,6 +134,7 @@
|
||||||
.spectrum-Tooltip-label {
|
.spectrum-Tooltip-label {
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
-webkit-line-clamp: 3;
|
-webkit-line-clamp: 3;
|
||||||
|
line-clamp: 3;
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
|
|
@ -94,6 +94,7 @@
|
||||||
"@sveltejs/vite-plugin-svelte": "1.4.0",
|
"@sveltejs/vite-plugin-svelte": "1.4.0",
|
||||||
"@testing-library/jest-dom": "6.4.2",
|
"@testing-library/jest-dom": "6.4.2",
|
||||||
"@testing-library/svelte": "^4.1.0",
|
"@testing-library/svelte": "^4.1.0",
|
||||||
|
"@types/shortid": "^2.2.0",
|
||||||
"babel-jest": "^29.6.2",
|
"babel-jest": "^29.6.2",
|
||||||
"identity-obj-proxy": "^3.0.0",
|
"identity-obj-proxy": "^3.0.0",
|
||||||
"jest": "29.7.0",
|
"jest": "29.7.0",
|
||||||
|
|
|
@ -1507,7 +1507,12 @@ export const updateReferencesInObject = ({
|
||||||
|
|
||||||
// Migrate references
|
// Migrate references
|
||||||
// Switch all bindings to reference their ids
|
// Switch all bindings to reference their ids
|
||||||
export const migrateReferencesInObject = ({ obj, label = "steps", steps }) => {
|
export const migrateReferencesInObject = ({
|
||||||
|
obj,
|
||||||
|
label = "steps",
|
||||||
|
steps,
|
||||||
|
originalIndex,
|
||||||
|
}) => {
|
||||||
const stepIndexRegex = new RegExp(`{{\\s*${label}\\.(\\d+)\\.`, "g")
|
const stepIndexRegex = new RegExp(`{{\\s*${label}\\.(\\d+)\\.`, "g")
|
||||||
const updateActionStep = (str, index, replaceWith) =>
|
const updateActionStep = (str, index, replaceWith) =>
|
||||||
str.replace(`{{ ${label}.${index}.`, `{{ ${label}.${replaceWith}.`)
|
str.replace(`{{ ${label}.${index}.`, `{{ ${label}.${replaceWith}.`)
|
||||||
|
@ -1528,6 +1533,7 @@ export const migrateReferencesInObject = ({ obj, label = "steps", steps }) => {
|
||||||
migrateReferencesInObject({
|
migrateReferencesInObject({
|
||||||
obj: obj[key],
|
obj: obj[key],
|
||||||
steps,
|
steps,
|
||||||
|
originalIndex,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,54 @@
|
||||||
import { API } from "api"
|
import { API } from "api"
|
||||||
import { BudiStore } from "../BudiStore"
|
import { BudiStore } from "../BudiStore"
|
||||||
|
import {
|
||||||
|
App,
|
||||||
|
AppFeatures,
|
||||||
|
AppIcon,
|
||||||
|
AutomationSettings,
|
||||||
|
Plugin,
|
||||||
|
} from "@budibase/types"
|
||||||
|
|
||||||
export const INITIAL_APP_META_STATE = {
|
interface ClientFeatures {
|
||||||
|
spectrumThemes: boolean
|
||||||
|
intelligentLoading: boolean
|
||||||
|
deviceAwareness: boolean
|
||||||
|
state: boolean
|
||||||
|
rowSelection: boolean
|
||||||
|
customThemes: boolean
|
||||||
|
devicePreview: boolean
|
||||||
|
messagePassing: boolean
|
||||||
|
continueIfAction: boolean
|
||||||
|
showNotificationAction: boolean
|
||||||
|
sidePanel: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface TypeSupportPresets {
|
||||||
|
[key: string]: any
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AppMetaState {
|
||||||
|
appId: string
|
||||||
|
name: string
|
||||||
|
url: string
|
||||||
|
libraries: string[]
|
||||||
|
clientFeatures: ClientFeatures
|
||||||
|
typeSupportPresets: TypeSupportPresets
|
||||||
|
features: AppFeatures
|
||||||
|
clientLibPath: string
|
||||||
|
hasLock: boolean
|
||||||
|
appInstance: { _id: string } | null
|
||||||
|
initialised: boolean
|
||||||
|
hasAppPackage: boolean
|
||||||
|
usedPlugins: Plugin[] | null
|
||||||
|
automations: AutomationSettings
|
||||||
|
routes: { [key: string]: any }
|
||||||
|
version?: string
|
||||||
|
revertableVersion?: string
|
||||||
|
upgradableVersion?: string
|
||||||
|
icon?: AppIcon
|
||||||
|
}
|
||||||
|
|
||||||
|
export const INITIAL_APP_META_STATE: AppMetaState = {
|
||||||
appId: "",
|
appId: "",
|
||||||
name: "",
|
name: "",
|
||||||
url: "",
|
url: "",
|
||||||
|
@ -34,23 +81,27 @@ export const INITIAL_APP_META_STATE = {
|
||||||
routes: {},
|
routes: {},
|
||||||
}
|
}
|
||||||
|
|
||||||
export class AppMetaStore extends BudiStore {
|
export class AppMetaStore extends BudiStore<AppMetaState> {
|
||||||
constructor() {
|
constructor() {
|
||||||
super(INITIAL_APP_META_STATE)
|
super(INITIAL_APP_META_STATE)
|
||||||
}
|
}
|
||||||
|
|
||||||
reset() {
|
reset(): void {
|
||||||
this.store.set({ ...INITIAL_APP_META_STATE })
|
this.store.set({ ...INITIAL_APP_META_STATE })
|
||||||
}
|
}
|
||||||
|
|
||||||
syncAppPackage(pkg) {
|
syncAppPackage(pkg: {
|
||||||
|
application: App
|
||||||
|
clientLibPath: string
|
||||||
|
hasLock: boolean
|
||||||
|
}): void {
|
||||||
const { application: app, clientLibPath, hasLock } = pkg
|
const { application: app, clientLibPath, hasLock } = pkg
|
||||||
|
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
name: app.name,
|
name: app.name,
|
||||||
appId: app.appId,
|
appId: app.appId,
|
||||||
url: app.url,
|
url: app.url || "",
|
||||||
hasLock,
|
hasLock,
|
||||||
clientLibPath,
|
clientLibPath,
|
||||||
libraries: app.componentLibraries,
|
libraries: app.componentLibraries,
|
||||||
|
@ -58,8 +109,8 @@ export class AppMetaStore extends BudiStore {
|
||||||
appInstance: app.instance,
|
appInstance: app.instance,
|
||||||
revertableVersion: app.revertableVersion,
|
revertableVersion: app.revertableVersion,
|
||||||
upgradableVersion: app.upgradableVersion,
|
upgradableVersion: app.upgradableVersion,
|
||||||
usedPlugins: app.usedPlugins,
|
usedPlugins: app.usedPlugins || null,
|
||||||
icon: app.icon || {},
|
icon: app.icon,
|
||||||
features: {
|
features: {
|
||||||
...INITIAL_APP_META_STATE.features,
|
...INITIAL_APP_META_STATE.features,
|
||||||
...app.features,
|
...app.features,
|
||||||
|
@ -70,7 +121,7 @@ export class AppMetaStore extends BudiStore {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
syncClientFeatures(features) {
|
syncClientFeatures(features: Partial<ClientFeatures>): void {
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
clientFeatures: {
|
clientFeatures: {
|
||||||
|
@ -80,14 +131,14 @@ export class AppMetaStore extends BudiStore {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
syncClientTypeSupportPresets(typeSupportPresets) {
|
syncClientTypeSupportPresets(typeSupportPresets: TypeSupportPresets): void {
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
typeSupportPresets,
|
typeSupportPresets,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
async syncAppRoutes() {
|
async syncAppRoutes(): Promise<void> {
|
||||||
const resp = await API.fetchAppRoutes()
|
const resp = await API.fetchAppRoutes()
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
|
@ -96,7 +147,7 @@ export class AppMetaStore extends BudiStore {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returned from socket
|
// Returned from socket
|
||||||
syncMetadata(metadata) {
|
syncMetadata(metadata: { name: string; url: string; icon?: AppIcon }): void {
|
||||||
const { name, url, icon } = metadata
|
const { name, url, icon } = metadata
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
File diff suppressed because it is too large
Load Diff
|
@ -1,10 +1,28 @@
|
||||||
import { get } from "svelte/store"
|
import { get } from "svelte/store"
|
||||||
import { createBuilderWebsocket } from "./websocket.js"
|
import { createBuilderWebsocket } from "./websocket.js"
|
||||||
|
import { Socket } from "socket.io-client"
|
||||||
import { BuilderSocketEvent } from "@budibase/shared-core"
|
import { BuilderSocketEvent } from "@budibase/shared-core"
|
||||||
import { BudiStore } from "../BudiStore.js"
|
import { BudiStore } from "../BudiStore.js"
|
||||||
import { TOUR_KEYS } from "components/portal/onboarding/tours.js"
|
import { TOUR_KEYS } from "components/portal/onboarding/tours.js"
|
||||||
|
import { App } from "@budibase/types"
|
||||||
|
|
||||||
export const INITIAL_BUILDER_STATE = {
|
interface BuilderState {
|
||||||
|
previousTopNavPath: Record<string, string>
|
||||||
|
highlightedSetting: {
|
||||||
|
key: string
|
||||||
|
type: "info" | string
|
||||||
|
} | null
|
||||||
|
propertyFocus: string | null
|
||||||
|
builderSidePanel: boolean
|
||||||
|
onboarding: boolean
|
||||||
|
tourNodes: Record<string, HTMLElement> | null
|
||||||
|
tourKey: string | null
|
||||||
|
tourStepKey: string | null
|
||||||
|
hoveredComponentId: string | null
|
||||||
|
websocket?: Socket
|
||||||
|
}
|
||||||
|
|
||||||
|
export const INITIAL_BUILDER_STATE: BuilderState = {
|
||||||
previousTopNavPath: {},
|
previousTopNavPath: {},
|
||||||
highlightedSetting: null,
|
highlightedSetting: null,
|
||||||
propertyFocus: null,
|
propertyFocus: null,
|
||||||
|
@ -16,7 +34,9 @@ export const INITIAL_BUILDER_STATE = {
|
||||||
hoveredComponentId: null,
|
hoveredComponentId: null,
|
||||||
}
|
}
|
||||||
|
|
||||||
export class BuilderStore extends BudiStore {
|
export class BuilderStore extends BudiStore<BuilderState> {
|
||||||
|
websocket?: Socket
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super({ ...INITIAL_BUILDER_STATE })
|
super({ ...INITIAL_BUILDER_STATE })
|
||||||
|
|
||||||
|
@ -32,11 +52,9 @@ export class BuilderStore extends BudiStore {
|
||||||
this.registerTourNode = this.registerTourNode.bind(this)
|
this.registerTourNode = this.registerTourNode.bind(this)
|
||||||
this.destroyTourNode = this.destroyTourNode.bind(this)
|
this.destroyTourNode = this.destroyTourNode.bind(this)
|
||||||
this.startBuilderOnboarding = this.startBuilderOnboarding.bind(this)
|
this.startBuilderOnboarding = this.startBuilderOnboarding.bind(this)
|
||||||
|
|
||||||
this.websocket
|
|
||||||
}
|
}
|
||||||
|
|
||||||
init(app) {
|
init(app: App): void {
|
||||||
if (!app?.appId) {
|
if (!app?.appId) {
|
||||||
console.error("BuilderStore: No appId supplied for websocket")
|
console.error("BuilderStore: No appId supplied for websocket")
|
||||||
return
|
return
|
||||||
|
@ -46,45 +64,46 @@ export class BuilderStore extends BudiStore {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
refresh() {
|
refresh(): void {
|
||||||
this.store.set(this.store.get())
|
const currentState = get(this.store)
|
||||||
|
this.store.set(currentState)
|
||||||
}
|
}
|
||||||
|
|
||||||
reset() {
|
reset(): void {
|
||||||
this.store.set({ ...INITIAL_BUILDER_STATE })
|
this.store.set({ ...INITIAL_BUILDER_STATE })
|
||||||
this.websocket?.disconnect()
|
this.websocket?.disconnect()
|
||||||
this.websocket = null
|
this.websocket = undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
highlightSetting(key, type) {
|
highlightSetting(key?: string, type?: string): void {
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
highlightedSetting: key ? { key, type: type || "info" } : null,
|
highlightedSetting: key ? { key, type: type || "info" } : null,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
propertyFocus(key) {
|
propertyFocus(key: string | null): void {
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
propertyFocus: key,
|
propertyFocus: key,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
showBuilderSidePanel() {
|
showBuilderSidePanel(): void {
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
builderSidePanel: true,
|
builderSidePanel: true,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
hideBuilderSidePanel() {
|
hideBuilderSidePanel(): void {
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
builderSidePanel: false,
|
builderSidePanel: false,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
setPreviousTopNavPath(route, url) {
|
setPreviousTopNavPath(route: string, url: string): void {
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
previousTopNavPath: {
|
previousTopNavPath: {
|
||||||
|
@ -94,13 +113,13 @@ export class BuilderStore extends BudiStore {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
selectResource(id) {
|
selectResource(id: string): void {
|
||||||
this.websocket.emit(BuilderSocketEvent.SelectResource, {
|
this.websocket?.emit(BuilderSocketEvent.SelectResource, {
|
||||||
resourceId: id,
|
resourceId: id,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
registerTourNode(tourStepKey, node) {
|
registerTourNode(tourStepKey: string, node: HTMLElement): void {
|
||||||
this.update(state => {
|
this.update(state => {
|
||||||
const update = {
|
const update = {
|
||||||
...state,
|
...state,
|
||||||
|
@ -113,7 +132,7 @@ export class BuilderStore extends BudiStore {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
destroyTourNode(tourStepKey) {
|
destroyTourNode(tourStepKey: string): void {
|
||||||
const store = get(this.store)
|
const store = get(this.store)
|
||||||
if (store.tourNodes?.[tourStepKey]) {
|
if (store.tourNodes?.[tourStepKey]) {
|
||||||
const nodes = { ...store.tourNodes }
|
const nodes = { ...store.tourNodes }
|
||||||
|
@ -125,7 +144,7 @@ export class BuilderStore extends BudiStore {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
startBuilderOnboarding() {
|
startBuilderOnboarding(): void {
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
onboarding: true,
|
onboarding: true,
|
||||||
|
@ -133,19 +152,19 @@ export class BuilderStore extends BudiStore {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
endBuilderOnboarding() {
|
endBuilderOnboarding(): void {
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
onboarding: false,
|
onboarding: false,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
setTour(tourKey) {
|
setTour(tourKey?: string | null): void {
|
||||||
this.update(state => ({
|
this.update(state => ({
|
||||||
...state,
|
...state,
|
||||||
tourStepKey: null,
|
tourStepKey: null,
|
||||||
tourNodes: null,
|
tourNodes: null,
|
||||||
tourKey: tourKey,
|
tourKey: tourKey || null,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,28 +0,0 @@
|
||||||
import { writable } from "svelte/store"
|
|
||||||
|
|
||||||
export const INITIAL_CONTEXT_MENU_STATE = {
|
|
||||||
id: null,
|
|
||||||
items: [],
|
|
||||||
position: { x: 0, y: 0 },
|
|
||||||
visible: false,
|
|
||||||
}
|
|
||||||
|
|
||||||
export function createViewsStore() {
|
|
||||||
const store = writable({ ...INITIAL_CONTEXT_MENU_STATE })
|
|
||||||
|
|
||||||
const open = (id, items, position) => {
|
|
||||||
store.set({ id, items, position, visible: true })
|
|
||||||
}
|
|
||||||
|
|
||||||
const close = () => {
|
|
||||||
store.set({ ...INITIAL_CONTEXT_MENU_STATE })
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
subscribe: store.subscribe,
|
|
||||||
open,
|
|
||||||
close,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const contextMenuStore = createViewsStore()
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
import { writable } from "svelte/store"
|
||||||
|
|
||||||
|
interface Position {
|
||||||
|
x: number
|
||||||
|
y: number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface MenuItem {
|
||||||
|
label: string
|
||||||
|
icon?: string
|
||||||
|
action: () => void
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ContextMenuState {
|
||||||
|
id: string | null
|
||||||
|
items: MenuItem[]
|
||||||
|
position: Position
|
||||||
|
visible: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export const INITIAL_CONTEXT_MENU_STATE: ContextMenuState = {
|
||||||
|
id: null,
|
||||||
|
items: [],
|
||||||
|
position: { x: 0, y: 0 },
|
||||||
|
visible: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createViewsStore() {
|
||||||
|
const store = writable<ContextMenuState>({ ...INITIAL_CONTEXT_MENU_STATE })
|
||||||
|
|
||||||
|
const open = (id: string, items: MenuItem[], position: Position): void => {
|
||||||
|
store.set({ id, items, position, visible: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
const close = (): void => {
|
||||||
|
store.set({ ...INITIAL_CONTEXT_MENU_STATE })
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
subscribe: store.subscribe,
|
||||||
|
open,
|
||||||
|
close,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const contextMenuStore = createViewsStore()
|
|
@ -1,11 +1,12 @@
|
||||||
import { writable } from "svelte/store"
|
import { writable, type Writable } from "svelte/store"
|
||||||
import { API } from "api"
|
import { API } from "api"
|
||||||
import { notifications } from "@budibase/bbui"
|
import { notifications } from "@budibase/bbui"
|
||||||
|
import { DeploymentProgressResponse } from "@budibase/types"
|
||||||
|
|
||||||
export const createDeploymentStore = () => {
|
export const createDeploymentStore = () => {
|
||||||
let store = writable([])
|
let store: Writable<DeploymentProgressResponse[]> = writable([])
|
||||||
|
|
||||||
const load = async () => {
|
const load = async (): Promise<void> => {
|
||||||
try {
|
try {
|
||||||
store.set(await API.getAppDeployments())
|
store.set(await API.getAppDeployments())
|
||||||
} catch (err) {
|
} catch (err) {
|
|
@ -65,7 +65,7 @@ describe("Builder store", () => {
|
||||||
ctx.test.builderStore.reset()
|
ctx.test.builderStore.reset()
|
||||||
expect(disconnected).toBe(true)
|
expect(disconnected).toBe(true)
|
||||||
expect(ctx.test.store).toStrictEqual(INITIAL_BUILDER_STATE)
|
expect(ctx.test.store).toStrictEqual(INITIAL_BUILDER_STATE)
|
||||||
expect(ctx.test.builderStore.websocket).toBeNull()
|
expect(ctx.test.builderStore.websocket).toBeUndefined()
|
||||||
})
|
})
|
||||||
|
|
||||||
it("Attempt to emit a resource select event to the websocket on select", ctx => {
|
it("Attempt to emit a resource select event to the websocket on select", ctx => {
|
||||||
|
|
|
@ -22,6 +22,7 @@ export const createLicensingStore = () => {
|
||||||
backupsEnabled: false,
|
backupsEnabled: false,
|
||||||
brandingEnabled: false,
|
brandingEnabled: false,
|
||||||
scimEnabled: false,
|
scimEnabled: false,
|
||||||
|
environmentVariablesEnabled: false,
|
||||||
budibaseAIEnabled: false,
|
budibaseAIEnabled: false,
|
||||||
customAIConfigsEnabled: false,
|
customAIConfigsEnabled: false,
|
||||||
auditLogsEnabled: false,
|
auditLogsEnabled: false,
|
||||||
|
|
|
@ -73,6 +73,7 @@
|
||||||
.value {
|
.value {
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
-webkit-line-clamp: var(--content-lines);
|
-webkit-line-clamp: var(--content-lines);
|
||||||
|
line-clamp: var(--content-lines);
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
|
|
|
@ -93,6 +93,7 @@
|
||||||
.value {
|
.value {
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
-webkit-line-clamp: var(--content-lines);
|
-webkit-line-clamp: var(--content-lines);
|
||||||
|
line-clamp: var(--content-lines);
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
|
|
|
@ -74,12 +74,14 @@
|
||||||
.value {
|
.value {
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
-webkit-line-clamp: var(--content-lines);
|
-webkit-line-clamp: var(--content-lines);
|
||||||
|
line-clamp: var(--content-lines);
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
}
|
}
|
||||||
.number .value {
|
.number .value {
|
||||||
-webkit-line-clamp: 1;
|
-webkit-line-clamp: 1;
|
||||||
|
line-clamp: 1;
|
||||||
}
|
}
|
||||||
input {
|
input {
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
|
@ -110,5 +112,6 @@
|
||||||
}
|
}
|
||||||
input[type="number"] {
|
input[type="number"] {
|
||||||
-moz-appearance: textfield;
|
-moz-appearance: textfield;
|
||||||
|
appearance: textfield;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -133,11 +133,7 @@ export const deriveStores = (context: StoreContext): DerivedDatasourceStore => {
|
||||||
type = ($datasource as any).value?.datasource?.type
|
type = ($datasource as any).value?.datasource?.type
|
||||||
}
|
}
|
||||||
// Handle calculation views
|
// Handle calculation views
|
||||||
if (
|
if (type === "viewV2" && $definition?.type === ViewV2Type.CALCULATION) {
|
||||||
type === "viewV2" &&
|
|
||||||
"type" in $definition &&
|
|
||||||
$definition?.type === ViewV2Type.CALCULATION
|
|
||||||
) {
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return ["table", "viewV2", "link"].includes(type)
|
return ["table", "viewV2", "link"].includes(type)
|
||||||
|
|
|
@ -3,6 +3,11 @@ import { helpers } from "@budibase/shared-core"
|
||||||
import { Store as StoreContext } from "."
|
import { Store as StoreContext } from "."
|
||||||
import { UIUser } from "@budibase/types"
|
import { UIUser } from "@budibase/types"
|
||||||
|
|
||||||
|
interface UIEnrichedUser extends UIUser {
|
||||||
|
color: string
|
||||||
|
label: string
|
||||||
|
}
|
||||||
|
|
||||||
interface UsersStore {
|
interface UsersStore {
|
||||||
users: Writable<UIUser[]>
|
users: Writable<UIUser[]>
|
||||||
}
|
}
|
||||||
|
@ -12,21 +17,22 @@ interface DerivedUsersStore {
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ActionUserStore {
|
interface ActionUserStore {
|
||||||
users: UsersStore["users"] & {
|
users: UsersStore["users"] &
|
||||||
actions: {
|
Readable<UIEnrichedUser[]> & {
|
||||||
updateUser: (user: UIUser) => void
|
actions: {
|
||||||
removeUser: (sessionId: string) => void
|
updateUser: (user: UIUser) => void
|
||||||
|
removeUser: (sessionId: string) => void
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Store = UsersStore & DerivedUsersStore
|
export type Store = DerivedUsersStore & ActionUserStore
|
||||||
|
|
||||||
export const createStores = (): UsersStore => {
|
export const createStores = (): UsersStore => {
|
||||||
const users = writable<UIUser[]>([])
|
const users = writable<UIUser[]>([])
|
||||||
|
|
||||||
const enrichedUsers = derived(users, $users => {
|
const enrichedUsers = derived(users, $users => {
|
||||||
return $users.map(user => ({
|
return $users.map<UIEnrichedUser>(user => ({
|
||||||
...user,
|
...user,
|
||||||
color: helpers.getUserColor(user),
|
color: helpers.getUserColor(user),
|
||||||
label: helpers.getUserLabel(user),
|
label: helpers.getUserLabel(user),
|
||||||
|
|
|
@ -456,7 +456,7 @@ export function filterAutomation(appId: string, tableId?: string): Automation {
|
||||||
icon: "Icon",
|
icon: "Icon",
|
||||||
id: "a",
|
id: "a",
|
||||||
type: AutomationStepType.TRIGGER,
|
type: AutomationStepType.TRIGGER,
|
||||||
event: "row:save",
|
event: AutomationEventType.ROW_SAVE,
|
||||||
stepId: AutomationTriggerStepId.ROW_SAVED,
|
stepId: AutomationTriggerStepId.ROW_SAVED,
|
||||||
inputs: {
|
inputs: {
|
||||||
tableId: tableId!,
|
tableId: tableId!,
|
||||||
|
@ -498,7 +498,7 @@ export function updateRowAutomationWithFilters(
|
||||||
icon: "Icon",
|
icon: "Icon",
|
||||||
id: "a",
|
id: "a",
|
||||||
type: AutomationStepType.TRIGGER,
|
type: AutomationStepType.TRIGGER,
|
||||||
event: "row:update",
|
event: AutomationEventType.ROW_UPDATE,
|
||||||
stepId: AutomationTriggerStepId.ROW_UPDATED,
|
stepId: AutomationTriggerStepId.ROW_UPDATED,
|
||||||
inputs: { tableId },
|
inputs: { tableId },
|
||||||
schema: TRIGGER_DEFINITIONS.ROW_UPDATED.schema,
|
schema: TRIGGER_DEFINITIONS.ROW_UPDATED.schema,
|
||||||
|
@ -513,7 +513,7 @@ export function basicAutomationResults(
|
||||||
return {
|
return {
|
||||||
automationId,
|
automationId,
|
||||||
status: AutomationStatus.SUCCESS,
|
status: AutomationStatus.SUCCESS,
|
||||||
trigger: "trigger",
|
trigger: "trigger" as any,
|
||||||
steps: [
|
steps: [
|
||||||
{
|
{
|
||||||
stepId: AutomationActionStepId.SERVER_LOG,
|
stepId: AutomationActionStepId.SERVER_LOG,
|
||||||
|
|
|
@ -148,6 +148,7 @@ export interface Automation extends Document {
|
||||||
|
|
||||||
interface BaseIOStructure {
|
interface BaseIOStructure {
|
||||||
type?: AutomationIOType
|
type?: AutomationIOType
|
||||||
|
subtype?: AutomationIOType
|
||||||
customType?: AutomationCustomIOType
|
customType?: AutomationCustomIOType
|
||||||
title?: string
|
title?: string
|
||||||
description?: string
|
description?: string
|
||||||
|
@ -192,7 +193,7 @@ export enum AutomationStoppedReason {
|
||||||
export interface AutomationResults {
|
export interface AutomationResults {
|
||||||
automationId?: string
|
automationId?: string
|
||||||
status?: AutomationStatus
|
status?: AutomationStatus
|
||||||
trigger?: any
|
trigger?: AutomationTrigger
|
||||||
steps: {
|
steps: {
|
||||||
stepId: AutomationTriggerStepId | AutomationActionStepId
|
stepId: AutomationTriggerStepId | AutomationActionStepId
|
||||||
inputs: {
|
inputs: {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import {
|
||||||
AutomationFeature,
|
AutomationFeature,
|
||||||
InputOutputBlock,
|
InputOutputBlock,
|
||||||
AutomationTriggerStepId,
|
AutomationTriggerStepId,
|
||||||
|
AutomationEventType,
|
||||||
} from "./automation"
|
} from "./automation"
|
||||||
import {
|
import {
|
||||||
CollectStepInputs,
|
CollectStepInputs,
|
||||||
|
@ -142,6 +143,7 @@ export type ActionImplementations<T extends Hosting> = {
|
||||||
export interface AutomationStepSchemaBase {
|
export interface AutomationStepSchemaBase {
|
||||||
name: string
|
name: string
|
||||||
stepTitle?: string
|
stepTitle?: string
|
||||||
|
event?: AutomationEventType
|
||||||
tagline: string
|
tagline: string
|
||||||
icon: string
|
icon: string
|
||||||
description: string
|
description: string
|
||||||
|
@ -344,7 +346,7 @@ export interface AutomationTriggerSchema<
|
||||||
> extends AutomationStepSchemaBase {
|
> extends AutomationStepSchemaBase {
|
||||||
id: string
|
id: string
|
||||||
type: AutomationStepType.TRIGGER
|
type: AutomationStepType.TRIGGER
|
||||||
event?: string
|
event?: AutomationEventType
|
||||||
cronJobId?: string
|
cronJobId?: string
|
||||||
stepId: TTrigger
|
stepId: TTrigger
|
||||||
inputs: AutomationTriggerInputs<TTrigger> & Record<string, any> // The record union to be removed once the types are fixed
|
inputs: AutomationTriggerInputs<TTrigger> & Record<string, any> // The record union to be removed once the types are fixed
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
export interface BranchPath {
|
||||||
|
stepIdx: number
|
||||||
|
branchIdx: number
|
||||||
|
branchStepId: string
|
||||||
|
id: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BlockDefinitions {
|
||||||
|
TRIGGER: Record<string, any>
|
||||||
|
CREATABLE_TRIGGER: Record<string, any>
|
||||||
|
ACTION: Record<string, any>
|
||||||
|
}
|
|
@ -1,2 +1,3 @@
|
||||||
export * from "./integration"
|
export * from "./integration"
|
||||||
|
export * from "./automations"
|
||||||
export * from "./grid"
|
export * from "./grid"
|
||||||
|
|
36
yarn.lock
36
yarn.lock
|
@ -5946,6 +5946,11 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/shortid@^2.2.0":
|
||||||
|
version "2.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/shortid/-/shortid-2.2.0.tgz#905990fc4275f77e60ab0cd9f791b91a3d4bff04"
|
||||||
|
integrity sha512-jBG2FgBxcaSf0h662YloTGA32M8UtNbnTPekUr/eCmWXq0JWQXgNEQ/P5Gf05Cv66QZtE1Ttr83I1AJBPdzCBg==
|
||||||
|
|
||||||
"@types/ssh2-streams@*":
|
"@types/ssh2-streams@*":
|
||||||
version "0.1.12"
|
version "0.1.12"
|
||||||
resolved "https://registry.yarnpkg.com/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz#e68795ba2bf01c76b93f9c9809e1f42f0eaaec5f"
|
resolved "https://registry.yarnpkg.com/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz#e68795ba2bf01c76b93f9c9809e1f42f0eaaec5f"
|
||||||
|
@ -18639,16 +18644,7 @@ string-length@^4.0.1:
|
||||||
char-regex "^1.0.2"
|
char-regex "^1.0.2"
|
||||||
strip-ansi "^6.0.0"
|
strip-ansi "^6.0.0"
|
||||||
|
|
||||||
"string-width-cjs@npm:string-width@^4.2.0":
|
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
|
||||||
version "4.2.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
|
||||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
|
||||||
dependencies:
|
|
||||||
emoji-regex "^8.0.0"
|
|
||||||
is-fullwidth-code-point "^3.0.0"
|
|
||||||
strip-ansi "^6.0.1"
|
|
||||||
|
|
||||||
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
|
|
||||||
version "4.2.3"
|
version "4.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||||
|
@ -18740,7 +18736,7 @@ stringify-object@^3.2.1:
|
||||||
is-obj "^1.0.1"
|
is-obj "^1.0.1"
|
||||||
is-regexp "^1.0.0"
|
is-regexp "^1.0.0"
|
||||||
|
|
||||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
|
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||||
version "6.0.1"
|
version "6.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||||
|
@ -18754,13 +18750,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
ansi-regex "^4.1.0"
|
ansi-regex "^4.1.0"
|
||||||
|
|
||||||
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
|
||||||
version "6.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
|
||||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
|
||||||
dependencies:
|
|
||||||
ansi-regex "^5.0.1"
|
|
||||||
|
|
||||||
strip-ansi@^7.0.1:
|
strip-ansi@^7.0.1:
|
||||||
version "7.0.1"
|
version "7.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
|
||||||
|
@ -20508,7 +20497,7 @@ worker-farm@1.7.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
errno "~0.1.7"
|
errno "~0.1.7"
|
||||||
|
|
||||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
|
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||||
|
@ -20526,15 +20515,6 @@ wrap-ansi@^5.1.0:
|
||||||
string-width "^3.0.0"
|
string-width "^3.0.0"
|
||||||
strip-ansi "^5.0.0"
|
strip-ansi "^5.0.0"
|
||||||
|
|
||||||
wrap-ansi@^7.0.0:
|
|
||||||
version "7.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
|
||||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
|
||||||
dependencies:
|
|
||||||
ansi-styles "^4.0.0"
|
|
||||||
string-width "^4.1.0"
|
|
||||||
strip-ansi "^6.0.0"
|
|
||||||
|
|
||||||
wrap-ansi@^8.1.0:
|
wrap-ansi@^8.1.0:
|
||||||
version "8.1.0"
|
version "8.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
|
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
|
||||||
|
|
Loading…
Reference in New Issue