Tidy up standard components
This commit is contained in:
parent
499ad2e35d
commit
921cae0cbc
|
@ -1,46 +0,0 @@
|
||||||
const COOKIE_SEPARATOR = ";"
|
|
||||||
const APP_PREFIX = "app_"
|
|
||||||
const KEY_VALUE_SPLIT = "="
|
|
||||||
|
|
||||||
function confirmAppId(possibleAppId) {
|
|
||||||
return possibleAppId && possibleAppId.startsWith(APP_PREFIX)
|
|
||||||
? possibleAppId
|
|
||||||
: undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
function tryGetFromCookie({ cookies }) {
|
|
||||||
const cookie = cookies
|
|
||||||
.split(COOKIE_SEPARATOR)
|
|
||||||
.find(cookie => cookie.trim().startsWith("budibase:currentapp"))
|
|
||||||
let appId
|
|
||||||
if (cookie && cookie.split(KEY_VALUE_SPLIT).length === 2) {
|
|
||||||
appId = cookie.split("=")[1]
|
|
||||||
}
|
|
||||||
return confirmAppId(appId)
|
|
||||||
}
|
|
||||||
|
|
||||||
function tryGetFromPath() {
|
|
||||||
const appId = location.pathname.split("/")[1]
|
|
||||||
return confirmAppId(appId)
|
|
||||||
}
|
|
||||||
|
|
||||||
function tryGetFromSubdomain() {
|
|
||||||
const parts = window.location.host.split(".")
|
|
||||||
const appId = parts[1] ? parts[0] : undefined
|
|
||||||
return confirmAppId(appId)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const getAppId = cookies => {
|
|
||||||
const functions = [tryGetFromSubdomain, tryGetFromPath, tryGetFromCookie]
|
|
||||||
// try getting the app Id in order
|
|
||||||
let appId
|
|
||||||
for (let func of functions) {
|
|
||||||
appId = func({ cookies })
|
|
||||||
if (appId) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return appId
|
|
||||||
}
|
|
||||||
|
|
||||||
export const getAppIdFromPath = getAppId
|
|
|
@ -1,5 +1,4 @@
|
||||||
<script>
|
<script>
|
||||||
import { buildStyle } from "./buildStyle.js"
|
|
||||||
export let className = ""
|
export let className = ""
|
||||||
export let type
|
export let type
|
||||||
export let text = ""
|
export let text = ""
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
import { buildStyle } from "./buildStyle"
|
import { buildStyle } from "./helpers"
|
||||||
|
|
||||||
export let className = ""
|
export let className = ""
|
||||||
export let url = ""
|
export let url = ""
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
export default ({ rows }) =>
|
|
||||||
rows.map(r => ({
|
|
||||||
name: `Save ${r.name} Button`,
|
|
||||||
props: buttonProps(r),
|
|
||||||
}))
|
|
||||||
|
|
||||||
const buttonProps = row => ({
|
|
||||||
_component: "@budibase/standard-components/button",
|
|
||||||
_children: [
|
|
||||||
{
|
|
||||||
_component: "@budibase/standard-components/text",
|
|
||||||
text: `Save ${row.name}`,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
onClick: [
|
|
||||||
{
|
|
||||||
"##eventHandlerType": "Save Row",
|
|
||||||
parameters: {
|
|
||||||
statePath: `${row.name}`,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
|
@ -1,33 +0,0 @@
|
||||||
const apiCall = method => async (
|
|
||||||
url,
|
|
||||||
body,
|
|
||||||
headers = {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
}
|
|
||||||
) => {
|
|
||||||
const appId = location.pathname.split("/")[1]
|
|
||||||
if (appId) {
|
|
||||||
headers["x-budibase-app-id"] = appId
|
|
||||||
}
|
|
||||||
const response = await fetch(url, {
|
|
||||||
method: method,
|
|
||||||
body: body && JSON.stringify(body),
|
|
||||||
headers,
|
|
||||||
})
|
|
||||||
|
|
||||||
return response
|
|
||||||
}
|
|
||||||
|
|
||||||
export const post = apiCall("POST")
|
|
||||||
export const get = apiCall("GET")
|
|
||||||
export const patch = apiCall("PATCH")
|
|
||||||
export const del = apiCall("DELETE")
|
|
||||||
export const put = apiCall("PUT")
|
|
||||||
|
|
||||||
export default {
|
|
||||||
post: apiCall("POST"),
|
|
||||||
get: apiCall("GET"),
|
|
||||||
patch: apiCall("PATCH"),
|
|
||||||
delete: apiCall("DELETE"),
|
|
||||||
put: apiCall("PUT"),
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
import { Modal, ModalContent, Icon } from "@budibase/bbui"
|
import { Modal, ModalContent } from "@budibase/bbui"
|
||||||
import { createEventDispatcher } from "svelte"
|
import { createEventDispatcher } from "svelte"
|
||||||
|
|
||||||
const dispatch = createEventDispatcher()
|
const dispatch = createEventDispatcher()
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
import { Heading, Body, Button, Dropzone } from "@budibase/bbui"
|
import { Dropzone } from "@budibase/bbui"
|
||||||
import { FILE_TYPES } from "./fileTypes"
|
|
||||||
|
|
||||||
const BYTES_IN_MB = 1000000
|
const BYTES_IN_MB = 1000000
|
||||||
|
|
||||||
|
@ -15,7 +14,7 @@
|
||||||
|
|
||||||
async function processFiles(fileList) {
|
async function processFiles(fileList) {
|
||||||
let data = new FormData()
|
let data = new FormData()
|
||||||
for (var i = 0; i < fileList.length; i++) {
|
for (let i = 0; i < fileList.length; i++) {
|
||||||
data.append("file", fileList[i])
|
data.append("file", fileList[i])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,8 +26,7 @@
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const processedFiles = await response.json()
|
return await response.json()
|
||||||
return processedFiles
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
export const buildStyle = styles => {
|
|
||||||
let str = ""
|
|
||||||
for (let s in styles) {
|
|
||||||
if (styles[s]) {
|
|
||||||
str += `${s}: ${styles[s]}; `
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return str
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
// https://github.com/kaisermann/svelte-css-vars
|
|
||||||
|
|
||||||
export const cssVars = (node, props) => {
|
|
||||||
Object.entries(props).forEach(([key, value]) => {
|
|
||||||
node.style.setProperty(`--${key}`, value)
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
|
||||||
update(new_props) {
|
|
||||||
Object.entries(new_props).forEach(([key, value]) => {
|
|
||||||
node.style.setProperty(`--${key}`, value)
|
|
||||||
delete props[key]
|
|
||||||
})
|
|
||||||
|
|
||||||
Object.keys(props).forEach(name => node.style.removeProperty(`--${name}`))
|
|
||||||
props = new_props
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const createClasses = classes => {
|
|
||||||
let all = ""
|
|
||||||
for (let cls in classes) {
|
|
||||||
if (classes[cls]) {
|
|
||||||
all = all + " " + cls
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return all
|
|
||||||
}
|
|
||||||
|
|
||||||
export default cssVars
|
|
|
@ -1 +0,0 @@
|
||||||
export const emptyProps = () => ({ _component: "" })
|
|
|
@ -1,87 +0,0 @@
|
||||||
import api from "./api"
|
|
||||||
|
|
||||||
export default async function fetchData(datasource, store) {
|
|
||||||
const { type, name } = datasource
|
|
||||||
|
|
||||||
if (name) {
|
|
||||||
let rows = []
|
|
||||||
if (type === "table") {
|
|
||||||
rows = await fetchTableData()
|
|
||||||
} else if (type === "view") {
|
|
||||||
rows = await fetchViewData()
|
|
||||||
} else if (type === "link") {
|
|
||||||
rows = await fetchLinkedRowsData()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fetch table schema so we can check for linked rows
|
|
||||||
if (rows && rows.length && datasource.tableId) {
|
|
||||||
const schema = await fetchSchema(datasource.tableId)
|
|
||||||
const keys = Object.keys(schema)
|
|
||||||
rows.forEach(row => {
|
|
||||||
for (let key of keys) {
|
|
||||||
const type = schema[key].type
|
|
||||||
if (type === "link") {
|
|
||||||
row[`${key}_count`] = Array.isArray(row[key]) ? row[key].length : 0
|
|
||||||
} else if (type === "attachment") {
|
|
||||||
let url = null
|
|
||||||
if (Array.isArray(row[key]) && row[key][0] != null) {
|
|
||||||
url = row[key][0].url
|
|
||||||
}
|
|
||||||
row[`${key}_first`] = url
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return rows
|
|
||||||
} else {
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchTableData() {
|
|
||||||
if (!name.startsWith("all_")) {
|
|
||||||
throw new Error("Incorrect table convention - must begin with all_")
|
|
||||||
}
|
|
||||||
const tablesResponse = await api.get(`/api/views/${name}`)
|
|
||||||
return await tablesResponse.json()
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchViewData() {
|
|
||||||
const { field, groupBy, calculation } = datasource
|
|
||||||
const params = new URLSearchParams()
|
|
||||||
|
|
||||||
if (calculation) {
|
|
||||||
params.set("field", field)
|
|
||||||
params.set("calculation", calculation)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (groupBy) {
|
|
||||||
params.set("group", groupBy)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (groupBy) params.set("group", groupBy)
|
|
||||||
|
|
||||||
let QUERY_VIEW_URL = field
|
|
||||||
? `/api/views/${name}?${params}`
|
|
||||||
: `/api/views/${name}`
|
|
||||||
|
|
||||||
const response = await api.get(QUERY_VIEW_URL)
|
|
||||||
return await response.json()
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchLinkedRowsData() {
|
|
||||||
if (!store || !store.data || !store.data._id) {
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
const QUERY_URL = `/api/${store.data.tableId}/${store.data._id}/enrich`
|
|
||||||
const response = await api.get(QUERY_URL)
|
|
||||||
const row = await response.json()
|
|
||||||
return row[datasource.fieldName]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function fetchSchema(id) {
|
|
||||||
const FETCH_TABLE_URL = `/api/tables/${id}`
|
|
||||||
const response = await api.get(FETCH_TABLE_URL)
|
|
||||||
return (await response.json()).schema
|
|
||||||
}
|
|
|
@ -1 +1,49 @@
|
||||||
export const capitalise = s => s.substring(0, 1).toUpperCase() + s.substring(1)
|
/**
|
||||||
|
* Capitalises a string.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
export const capitalise = string => {
|
||||||
|
return string.substring(0, 1).toUpperCase() + string.substring(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a style string from a style object.
|
||||||
|
*
|
||||||
|
* @param styles
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
export const buildStyle = styles => {
|
||||||
|
let str = ""
|
||||||
|
Object.entries(styles).forEach(([style, value]) => {
|
||||||
|
if (style && value) {
|
||||||
|
str += `${style}: ${value}; `
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Svelte action to set CSS variables on a DOM node.
|
||||||
|
*
|
||||||
|
* @param node
|
||||||
|
* @param props
|
||||||
|
*/
|
||||||
|
export const cssVars = (node, props) => {
|
||||||
|
Object.entries(props).forEach(([key, value]) => {
|
||||||
|
node.style.setProperty(`--${key}`, value)
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
update(new_props) {
|
||||||
|
Object.entries(new_props).forEach(([key, value]) => {
|
||||||
|
node.style.setProperty(`--${key}`, value)
|
||||||
|
delete props[key]
|
||||||
|
})
|
||||||
|
|
||||||
|
Object.keys(props).forEach(name => node.style.removeProperty(`--${name}`))
|
||||||
|
props = new_props
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="18"
|
|
||||||
height="18">
|
|
||||||
<path fill="none" d="M0 0h24v24H0z" />
|
|
||||||
<path
|
|
||||||
d="M13 16.172l5.364-5.364 1.414 1.414L12 20l-7.778-7.778 1.414-1.414L11
|
|
||||||
16.172V4h2v12.172z" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 251 B |
|
@ -1,10 +0,0 @@
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="18"
|
|
||||||
height="18">
|
|
||||||
<path fill="none" d="M0 0h24v24H0z" />
|
|
||||||
<path
|
|
||||||
d="M13 7.828V20h-2V7.828l-5.364 5.364-1.414-1.414L12 4l7.778 7.778-1.414
|
|
||||||
1.414L13 7.828z" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 249 B |
|
@ -7,11 +7,10 @@ export { default as input } from "./Input.svelte"
|
||||||
export { default as textfield } from "./Textfield.svelte"
|
export { default as textfield } from "./Textfield.svelte"
|
||||||
export { default as button } from "./Button.svelte"
|
export { default as button } from "./Button.svelte"
|
||||||
export { default as login } from "./Login.svelte"
|
export { default as login } from "./Login.svelte"
|
||||||
export { default as saveRowButton } from "./Templates/saveRowButton"
|
|
||||||
export { default as link } from "./Link.svelte"
|
export { default as link } from "./Link.svelte"
|
||||||
export { default as image } from "./Image.svelte"
|
export { default as image } from "./Image.svelte"
|
||||||
export { default as Navigation } from "./Navigation.svelte"
|
export { default as Navigation } from "./Navigation.svelte"
|
||||||
export { default as datagrid } from "./DataGrid/Component.svelte"
|
export { default as datagrid } from "./grid/Component.svelte"
|
||||||
export { default as dataform } from "./DataForm.svelte"
|
export { default as dataform } from "./DataForm.svelte"
|
||||||
export { default as dataformwide } from "./DataFormWide.svelte"
|
export { default as dataformwide } from "./DataFormWide.svelte"
|
||||||
export { default as datalist } from "./DataList.svelte"
|
export { default as datalist } from "./DataList.svelte"
|
||||||
|
@ -25,4 +24,4 @@ export { default as rowdetail } from "./RowDetail.svelte"
|
||||||
export { default as newrow } from "./NewRow.svelte"
|
export { default as newrow } from "./NewRow.svelte"
|
||||||
export { default as datepicker } from "./DatePicker.svelte"
|
export { default as datepicker } from "./DatePicker.svelte"
|
||||||
export { default as icon } from "./Icon.svelte"
|
export { default as icon } from "./Icon.svelte"
|
||||||
export * from "./Chart"
|
export * from "./charts"
|
||||||
|
|
Loading…
Reference in New Issue