Merge branch 'master' into grid-tweaks

This commit is contained in:
Mihail Hadzhiev 2023-11-03 10:20:15 +02:00 committed by GitHub
commit bd4c50be31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 182 additions and 160 deletions

View File

@ -11,10 +11,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: peter-evans/repository-dispatch@v2 - uses: peter-evans/repository-dispatch@v2
env:
PAYLOAD_VERSION: ${{ github.sha }}
REF_NAME: ${{ github.ref_name}}
with: with:
repository: budibase/budibase-deploys repository: budibase/budibase-deploys
event-type: budicloud-qa-deploy event-type: budicloud-qa-deploy
token: ${{ secrets.GH_ACCESS_TOKEN }} token: ${{ secrets.GH_ACCESS_TOKEN }}
client-payload: |-
{
"PAYLOAD_VERSION": "${{ github.sha }}",
"REF_NAME": "${{ github.ref_name}}"
}

View File

@ -165,17 +165,14 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Get the current budibase release version
id: version
run: |
release_version=$(cat lerna.json | jq -r '.version')
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
- uses: passeidireto/trigger-external-workflow-action@main - uses: peter-evans/repository-dispatch@v2
env:
PAYLOAD_VERSION: ${{ env.RELEASE_VERSION }}
REF_NAME: ${{ github.ref_name}}
with: with:
repository: budibase/budibase-deploys repository: budibase/budibase-deploys
event: budicloud-qa-deploy event-type: budicloud-qa-deploy
github_pat: ${{ secrets.GH_ACCESS_TOKEN }} github_pat: ${{ secrets.GH_ACCESS_TOKEN }}
client-payload: |-
{
"PAYLOAD_VERSION": "${{ github.ref_name }}",
"REF_NAME": "${{ github.ref_name}}"
}

View File

@ -66,7 +66,7 @@ jobs:
context: . context: .
push: true push: true
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
build-args: BUDIBASE_VERSION=$BUDIBASE_VERSION build-args: BUDIBASE_VERSION=${{ env.BUDIBASE_VERSION }}
tags: budibase/budibase,budibase/budibase:${{ env.RELEASE_VERSION }} tags: budibase/budibase,budibase/budibase:${{ env.RELEASE_VERSION }}
file: ./hosting/single/Dockerfile.v2 file: ./hosting/single/Dockerfile.v2
env: env:
@ -79,7 +79,7 @@ jobs:
platforms: linux/amd64 platforms: linux/amd64
build-args: | build-args: |
TARGETBUILD=aas TARGETBUILD=aas
BUDIBASE_VERSION=$BUDIBASE_VERSION BUDIBASE_VERSION=${{ env.BUDIBASE_VERSION }}
tags: budibase/budibase-aas,budibase/budibase-aas:${{ env.RELEASE_VERSION }} tags: budibase/budibase-aas,budibase/budibase-aas:${{ env.RELEASE_VERSION }}
file: ./hosting/single/Dockerfile.v2 file: ./hosting/single/Dockerfile.v2
env: env:

View File

@ -1,5 +1,5 @@
{ {
"version": "2.12.4", "version": "2.12.7",
"npmClient": "yarn", "npmClient": "yarn",
"packages": [ "packages": [
"packages/*" "packages/*"

View File

@ -30,15 +30,15 @@
part2: PrettyRelationshipDefinitions.MANY, part2: PrettyRelationshipDefinitions.MANY,
}, },
[RelationshipType.MANY_TO_ONE]: { [RelationshipType.MANY_TO_ONE]: {
part1: PrettyRelationshipDefinitions.ONE, part1: PrettyRelationshipDefinitions.MANY,
part2: PrettyRelationshipDefinitions.MANY, part2: PrettyRelationshipDefinitions.ONE,
}, },
} }
let relationshipOpts1 = Object.values(PrettyRelationshipDefinitions) let relationshipOpts1 = Object.values(PrettyRelationshipDefinitions)
let relationshipOpts2 = Object.values(PrettyRelationshipDefinitions) let relationshipOpts2 = Object.values(PrettyRelationshipDefinitions)
let relationshipPart1 = PrettyRelationshipDefinitions.MANY let relationshipPart1 = PrettyRelationshipDefinitions.ONE
let relationshipPart2 = PrettyRelationshipDefinitions.ONE let relationshipPart2 = PrettyRelationshipDefinitions.MANY
let originalFromColumnName = toRelationship.name, let originalFromColumnName = toRelationship.name,
originalToColumnName = fromRelationship.name originalToColumnName = fromRelationship.name

View File

@ -1,5 +1,5 @@
import { Checkbox, Select, RadioGroup, Stepper, Input } from "@budibase/bbui" import { Checkbox, Select, RadioGroup, Stepper, Input } from "@budibase/bbui"
import DataSourceSelect from "./controls/DataSourceSelect.svelte" import DataSourceSelect from "./controls/DataSourceSelect/DataSourceSelect.svelte"
import S3DataSourceSelect from "./controls/S3DataSourceSelect.svelte" import S3DataSourceSelect from "./controls/S3DataSourceSelect.svelte"
import DataProviderSelect from "./controls/DataProviderSelect.svelte" import DataProviderSelect from "./controls/DataProviderSelect.svelte"
import ButtonActionEditor from "./controls/ButtonActionEditor/ButtonActionEditor.svelte" import ButtonActionEditor from "./controls/ButtonActionEditor/ButtonActionEditor.svelte"

View File

@ -0,0 +1,55 @@
<script>
import { Divider, Heading } from "@budibase/bbui"
export let dividerState
export let heading
export let dataSet
export let value
export let onSelect
</script>
{#if dividerState}
<Divider />
{/if}
{#if heading}
<div class="title">
<Heading size="XS">{heading}</Heading>
</div>
{/if}
<ul class="spectrum-Menu" role="listbox">
{#each dataSet as data}
<li
class="spectrum-Menu-item"
class:is-selected={value?.label === data.label &&
value?.type === data.type}
role="option"
aria-selected="true"
tabindex="0"
on:click={() => onSelect(data)}
>
<span class="spectrum-Menu-itemLabel">
{data.label}
</span>
<svg
class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
focusable="false"
aria-hidden="true"
>
<use xlink:href="#spectrum-css-icon-Checkmark100" />
</svg>
</li>
{/each}
</ul>
<style>
.title {
padding: 0 var(--spacing-m) var(--spacing-s) var(--spacing-m);
}
ul {
list-style: none;
padding-left: 0px;
margin: 0px;
width: 100%;
}
</style>

View File

@ -7,10 +7,8 @@
import { import {
Button, Button,
Popover, Popover,
Divider,
Select, Select,
Layout, Layout,
Heading,
Drawer, Drawer,
DrawerContent, DrawerContent,
Icon, Icon,
@ -32,6 +30,7 @@
import IntegrationQueryEditor from "components/integration/index.svelte" import IntegrationQueryEditor from "components/integration/index.svelte"
import { makePropSafe as safe } from "@budibase/string-templates" import { makePropSafe as safe } from "@budibase/string-templates"
import ClientBindingPanel from "components/common/bindings/ClientBindingPanel.svelte" import ClientBindingPanel from "components/common/bindings/ClientBindingPanel.svelte"
import DataSourceCategory from "components/design/settings/controls/DataSourceSelect/DataSourceCategory.svelte"
import { API } from "api" import { API } from "api"
export let value = {} export let value = {}
@ -279,102 +278,81 @@
</div> </div>
<Popover bind:this={dropdownRight} anchor={anchorRight}> <Popover bind:this={dropdownRight} anchor={anchorRight}>
<div class="dropdown"> <div class="dropdown">
<div class="title"> <DataSourceCategory
<Heading size="XS">Tables</Heading> heading="Tables"
</div> dataSet={tables}
<ul> {value}
{#each tables as table} onSelect={handleSelected}
<li on:click={() => handleSelected(table)}>{table.label}</li> />
{/each}
</ul>
{#if views?.length} {#if views?.length}
<Divider /> <DataSourceCategory
<div class="title"> dividerState={true}
<Heading size="XS">Views</Heading> heading="Views"
</div> dataSet={views}
<ul> {value}
{#each views as view} onSelect={handleSelected}
<li on:click={() => handleSelected(view)}>{view.label}</li> />
{/each}
</ul>
{/if} {/if}
{#if queries?.length} {#if queries?.length}
<Divider /> <DataSourceCategory
<div class="title"> dividerState={true}
<Heading size="XS">Queries</Heading> heading="Queries"
</div> dataSet={queries}
<ul> {value}
{#each queries as query} onSelect={handleSelected}
<li />
class:selected={value === query}
on:click={() => handleSelected(query)}
>
{query.label}
</li>
{/each}
</ul>
{/if} {/if}
{#if links?.length} {#if links?.length}
<Divider /> <DataSourceCategory
<div class="title"> dividerState={true}
<Heading size="XS">Relationships</Heading> heading="Links"
</div> dataSet={links}
<ul> {value}
{#each links as link} onSelect={handleSelected}
<li on:click={() => handleSelected(link)}>{link.label}</li> />
{/each}
</ul>
{/if} {/if}
{#if fields?.length} {#if fields?.length}
<Divider /> <DataSourceCategory
<div class="title"> dividerState={true}
<Heading size="XS">Fields</Heading> heading="Fields"
</div> dataSet={fields}
<ul> {value}
{#each fields as field} onSelect={handleSelected}
<li on:click={() => handleSelected(field)}>{field.label}</li> />
{/each}
</ul>
{/if} {/if}
{#if jsonArrays?.length} {#if jsonArrays?.length}
<Divider /> <DataSourceCategory
<div class="title"> dividerState={true}
<Heading size="XS">JSON Arrays</Heading> heading="JSON Arrays"
</div> dataSet={jsonArrays}
<ul> {value}
{#each jsonArrays as field} onSelect={handleSelected}
<li on:click={() => handleSelected(field)}>{field.label}</li> />
{/each}
</ul>
{/if} {/if}
{#if showDataProviders && dataProviders?.length} {#if showDataProviders && dataProviders?.length}
<Divider /> <DataSourceCategory
<div class="title"> dividerState={true}
<Heading size="XS">Data Providers</Heading> heading="Data Providers"
</div> dataSet={dataProviders}
<ul> {value}
{#each dataProviders as provider} onSelect={handleSelected}
<li />
class:selected={value === provider} {/if}
on:click={() => handleSelected(provider)} <DataSourceCategory
> dividerState={true}
{provider.label} heading="Other"
</li> dataSet={[custom]}
{/each} {value}
</ul> onSelect={handleSelected}
/>
{#if otherSources?.length}
<DataSourceCategory
dividerState={false}
dataSet={otherSources}
{value}
onSelect={handleSelected}
/>
{/if} {/if}
<Divider />
<div class="title">
<Heading size="XS">Other</Heading>
</div>
<ul>
<li on:click={() => handleSelected(custom)}>{custom.label}</li>
{#if otherSources?.length}
{#each otherSources as source}
<li on:click={() => handleSelected(source)}>{source.label}</li>
{/each}
{/if}
</ul>
</div> </div>
</Popover> </Popover>
@ -398,31 +376,6 @@
.dropdown { .dropdown {
padding: var(--spacing-m) 0; padding: var(--spacing-m) 0;
z-index: 99999999; z-index: 99999999;
overflow-y: scroll;
}
.title {
padding: 0 var(--spacing-m) var(--spacing-s) var(--spacing-m);
}
ul {
list-style: none;
padding-left: 0px;
margin: 0px;
}
li {
cursor: pointer;
margin: 0px;
padding: var(--spacing-s) var(--spacing-m);
font-size: var(--font-size-m);
}
.selected {
color: var(--spectrum-global-color-blue-600);
}
li:hover {
background-color: var(--spectrum-global-color-gray-200);
} }
.icon { .icon {

View File

@ -1,5 +1,5 @@
<script> <script>
import DataSourceSelect from "./DataSourceSelect.svelte" import DataSourceSelect from "./DataSourceSelect/DataSourceSelect.svelte"
const otherSources = [{ name: "Custom", label: "Custom" }] const otherSources = [{ name: "Custom", label: "Custom" }]
</script> </script>

View File

@ -7,6 +7,7 @@ import {
isBBReferenceField, isBBReferenceField,
isRelationshipField, isRelationshipField,
LinkDocument, LinkDocument,
LinkInfo,
RelationshipFieldMetadata, RelationshipFieldMetadata,
RelationshipType, RelationshipType,
Row, Row,
@ -125,7 +126,23 @@ abstract class UserColumnMigrator implements ColumnMigrator {
protected newColumn: BBReferenceFieldMetadata protected newColumn: BBReferenceFieldMetadata
) {} ) {}
abstract updateRow(row: Row, link: LinkDocument): void abstract updateRow(row: Row, linkInfo: LinkInfo): void
pickUserTableLinkSide(link: LinkDocument): LinkInfo {
if (link.doc1.tableId === InternalTable.USER_METADATA) {
return link.doc1
} else {
return link.doc2
}
}
pickOtherTableLinkSide(link: LinkDocument): LinkInfo {
if (link.doc1.tableId === InternalTable.USER_METADATA) {
return link.doc2
} else {
return link.doc1
}
}
async doMigration(): Promise<MigrationResult> { async doMigration(): Promise<MigrationResult> {
let oldTable = cloneDeep(this.table) let oldTable = cloneDeep(this.table)
@ -137,15 +154,17 @@ abstract class UserColumnMigrator implements ColumnMigrator {
let links = await sdk.links.fetchWithDocument(this.table._id!) let links = await sdk.links.fetchWithDocument(this.table._id!)
for (let link of links) { for (let link of links) {
const userSide = this.pickUserTableLinkSide(link)
const otherSide = this.pickOtherTableLinkSide(link)
if ( if (
link.doc1.tableId !== this.table._id || otherSide.tableId !== this.table._id ||
link.doc1.fieldName !== this.oldColumn.name || otherSide.fieldName !== this.oldColumn.name ||
link.doc2.tableId !== InternalTable.USER_METADATA userSide.tableId !== InternalTable.USER_METADATA
) { ) {
continue continue
} }
let row = rowsById[link.doc1.rowId] let row = rowsById[otherSide.rowId]
if (!row) { if (!row) {
// This can happen if the row has been deleted but the link hasn't, // This can happen if the row has been deleted but the link hasn't,
// which was a state that was found during the initial testing of this // which was a state that was found during the initial testing of this
@ -153,7 +172,7 @@ abstract class UserColumnMigrator implements ColumnMigrator {
continue continue
} }
this.updateRow(row, link) this.updateRow(row, userSide)
} }
let db = context.getAppDB() let db = context.getAppDB()
@ -175,20 +194,20 @@ abstract class UserColumnMigrator implements ColumnMigrator {
} }
class SingleUserColumnMigrator extends UserColumnMigrator { class SingleUserColumnMigrator extends UserColumnMigrator {
updateRow(row: Row, link: LinkDocument): void { updateRow(row: Row, linkInfo: LinkInfo): void {
row[this.newColumn.name] = dbCore.getGlobalIDFromUserMetadataID( row[this.newColumn.name] = dbCore.getGlobalIDFromUserMetadataID(
link.doc2.rowId linkInfo.rowId
) )
} }
} }
class MultiUserColumnMigrator extends UserColumnMigrator { class MultiUserColumnMigrator extends UserColumnMigrator {
updateRow(row: Row, link: LinkDocument): void { updateRow(row: Row, linkInfo: LinkInfo): void {
if (!row[this.newColumn.name]) { if (!row[this.newColumn.name]) {
row[this.newColumn.name] = [] row[this.newColumn.name] = []
} }
row[this.newColumn.name].push( row[this.newColumn.name].push(
dbCore.getGlobalIDFromUserMetadataID(link.doc2.rowId) dbCore.getGlobalIDFromUserMetadataID(linkInfo.rowId)
) )
} }
} }

View File

@ -1,17 +1,15 @@
import { Document } from "../document" import { Document } from "../document"
export interface LinkInfo {
rowId: string
fieldName: string
tableId: string
}
export interface LinkDocument extends Document { export interface LinkDocument extends Document {
type: string type: string
doc1: { doc1: LinkInfo
rowId: string doc2: LinkInfo
fieldName: string
tableId: string
}
doc2: {
rowId: string
fieldName: string
tableId: string
}
} }
export interface LinkDocumentValue { export interface LinkDocumentValue {

View File

@ -1,18 +1,16 @@
## Description ## Description
_Describe the problem or feature in addition to a link to the relevant github issues._ _Describe the problem or feature in addition to a link to the relevant github issues._
Addresses: Addresses:
- `<Enter the Link to the issue(s) this PR addresses>` - `<Enter the Link to the issue(s) this PR addresses>`
- ...more if required - ...more if required
## App Export ## App Export
- If possible, attach an app export file along with your request template to make QA testing easier, with minimal setup. - If possible, attach an app export file along with your request template to make QA testing easier, with minimal setup.
## Screenshots ## Screenshots
_If a UI facing feature, a short video of the happy path, and some screenshots of the new functionality._ _If a UI facing feature, a short video of the happy path, and some screenshots of the new functionality._
## Documentation
- [ ] I have reviewed the budibase documentatation to verify if this feature requires any changes. If changes or new docs are required I have written them.