From 41f1283e9d393393c651b8ac5a28cae09733f1fd Mon Sep 17 00:00:00 2001 From: Kelani Tolulope Date: Fri, 9 Dec 2022 11:47:10 +0100 Subject: [PATCH] Add navigational page block --- .../src/assets/PageBlocks/Navigation.png | Bin 0 -> 12012 bytes .../compose/src/assets/PageBlocks/index.js | 1 + .../Admin/Page/Builder/Selector.vue | 5 + .../components/PageBlocks/Navigation/Base.vue | 158 ++++++++++ .../PageBlocks/Navigation/Configurator.vue | 274 ++++++++++++++++++ .../Navigation/NavTypes/ComposePage.vue | 115 ++++++++ .../Navigation/NavTypes/Dropdown.vue | 148 ++++++++++ .../PageBlocks/Navigation/NavTypes/Text.vue | 21 ++ .../PageBlocks/Navigation/NavTypes/Url.vue | 47 +++ .../PageBlocks/Navigation/NavTypes/base.vue | 25 ++ .../src/components/PageBlocks/base.vue | 1 - .../src/components/PageBlocks/index.js | 4 + lib/js/src/compose/types/page-block/index.ts | 2 +- .../types/page-block/navigation/index.ts | 51 ++++ .../page-block/navigation/navigation-item.ts | 72 +++++ locale/en/corteza-webapp-compose/block.yaml | 50 ++++ 16 files changed, 972 insertions(+), 2 deletions(-) create mode 100644 client/web/compose/src/assets/PageBlocks/Navigation.png create mode 100644 client/web/compose/src/components/PageBlocks/Navigation/Base.vue create mode 100644 client/web/compose/src/components/PageBlocks/Navigation/Configurator.vue create mode 100644 client/web/compose/src/components/PageBlocks/Navigation/NavTypes/ComposePage.vue create mode 100644 client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Dropdown.vue create mode 100644 client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Text.vue create mode 100644 client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Url.vue create mode 100644 client/web/compose/src/components/PageBlocks/Navigation/NavTypes/base.vue create mode 100644 lib/js/src/compose/types/page-block/navigation/index.ts create mode 100644 lib/js/src/compose/types/page-block/navigation/navigation-item.ts diff --git a/client/web/compose/src/assets/PageBlocks/Navigation.png b/client/web/compose/src/assets/PageBlocks/Navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..57ec0c2409e9c7df32d4bee3afd0704e40853b8d GIT binary patch literal 12012 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 Gg8m2L2BXjb literal 0 HcmV?d00001 diff --git a/client/web/compose/src/assets/PageBlocks/index.js b/client/web/compose/src/assets/PageBlocks/index.js index 25e00db23..5cbb221c9 100644 --- a/client/web/compose/src/assets/PageBlocks/index.js +++ b/client/web/compose/src/assets/PageBlocks/index.js @@ -15,3 +15,4 @@ export const Report = require('./Report.png') export const Progress = require('./Progress.png') export const Nylas = require('./Nylas.jpg') export const Geometry = require('./Geometry.png') +export const Navigation = require('./Navigation.png') diff --git a/client/web/compose/src/components/Admin/Page/Builder/Selector.vue b/client/web/compose/src/components/Admin/Page/Builder/Selector.vue index 6638dd148..ca4a8aaff 100644 --- a/client/web/compose/src/components/Admin/Page/Builder/Selector.vue +++ b/client/web/compose/src/components/Admin/Page/Builder/Selector.vue @@ -149,6 +149,11 @@ export default { block: new compose.PageBlockGeometry(), image: images.Geometry, }, + { + label: this.$t('navigation.label'), + block: new compose.PageBlockNavigation(), + image: images.Navigation, + }, ], } }, diff --git a/client/web/compose/src/components/PageBlocks/Navigation/Base.vue b/client/web/compose/src/components/PageBlocks/Navigation/Base.vue new file mode 100644 index 000000000..d4941f45c --- /dev/null +++ b/client/web/compose/src/components/PageBlocks/Navigation/Base.vue @@ -0,0 +1,158 @@ + + diff --git a/client/web/compose/src/components/PageBlocks/Navigation/Configurator.vue b/client/web/compose/src/components/PageBlocks/Navigation/Configurator.vue new file mode 100644 index 000000000..f12c9e902 --- /dev/null +++ b/client/web/compose/src/components/PageBlocks/Navigation/Configurator.vue @@ -0,0 +1,274 @@ + + + + + diff --git a/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/ComposePage.vue b/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/ComposePage.vue new file mode 100644 index 000000000..10d3a2fc7 --- /dev/null +++ b/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/ComposePage.vue @@ -0,0 +1,115 @@ + + + diff --git a/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Dropdown.vue b/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Dropdown.vue new file mode 100644 index 000000000..a6f7fc1de --- /dev/null +++ b/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Dropdown.vue @@ -0,0 +1,148 @@ + + + diff --git a/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Text.vue b/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Text.vue new file mode 100644 index 000000000..4d890acf5 --- /dev/null +++ b/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Text.vue @@ -0,0 +1,21 @@ + + + diff --git a/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Url.vue b/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Url.vue new file mode 100644 index 000000000..0328bbed5 --- /dev/null +++ b/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/Url.vue @@ -0,0 +1,47 @@ + + + diff --git a/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/base.vue b/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/base.vue new file mode 100644 index 000000000..5ba7783cf --- /dev/null +++ b/client/web/compose/src/components/PageBlocks/Navigation/NavTypes/base.vue @@ -0,0 +1,25 @@ + diff --git a/client/web/compose/src/components/PageBlocks/base.vue b/client/web/compose/src/components/PageBlocks/base.vue index e1aedd1c2..7b0140421 100644 --- a/client/web/compose/src/components/PageBlocks/base.vue +++ b/client/web/compose/src/components/PageBlocks/base.vue @@ -75,7 +75,6 @@ export default { get () { return this.block.options }, - set (options) { this.block.options = options }, diff --git a/client/web/compose/src/components/PageBlocks/index.js b/client/web/compose/src/components/PageBlocks/index.js index d71bb41d3..e4082b1d0 100644 --- a/client/web/compose/src/components/PageBlocks/index.js +++ b/client/web/compose/src/components/PageBlocks/index.js @@ -36,6 +36,8 @@ import NylasBase from './Nylas/NylasBase' import NylasConfigurator from './Nylas/NylasConfigurator' import GeometryBase from './GeometryBase' import GeometryConfigurator from './GeometryConfigurator/index' +import NavigationConfigurator from './Navigation/Configurator' +import NavigationBase from './Navigation/Base' /** * List of all known page block components @@ -77,6 +79,8 @@ const Registry = { NylasConfigurator, GeometryBase, GeometryConfigurator, + NavigationConfigurator, + NavigationBase, } const defaultMode = 'Base' diff --git a/lib/js/src/compose/types/page-block/index.ts b/lib/js/src/compose/types/page-block/index.ts index c982059ea..c99b6789d 100644 --- a/lib/js/src/compose/types/page-block/index.ts +++ b/lib/js/src/compose/types/page-block/index.ts @@ -16,7 +16,7 @@ export { PageBlockReport } from './report' export { PageBlockProgress } from './progress' export { PageBlockNylas } from './nylas' export { PageBlockGeometry } from './geometry' - +export { PageBlockNavigation } from './navigation' export function PageBlockMaker (i: { kind: string }): T { const PageBlockTemp = Registry.get(i.kind) diff --git a/lib/js/src/compose/types/page-block/navigation/index.ts b/lib/js/src/compose/types/page-block/navigation/index.ts new file mode 100644 index 000000000..d68e9e9b2 --- /dev/null +++ b/lib/js/src/compose/types/page-block/navigation/index.ts @@ -0,0 +1,51 @@ +import { PageBlock, PageBlockInput, Registry } from '../base' +import NavigationItem, { NavigationItemInput } from './navigation-item' + +const kind = 'Navigation' + +interface DisplayOptions { + appearance: string; + alignment: string; + fillJustify: string; +} + +interface Options { + display: DisplayOptions; + navigationItems: NavigationItem[]; +} + +const defaults: Readonly = Object.freeze({ + display: { + appearance: 'tabs', + alignment: 'center', + fillJustify: 'justify', + }, + navigationItems: [], +}) + +export class PageBlockNavigation extends PageBlock { + readonly kind = kind; + + options: Options = { ...defaults }; + + constructor (i?: PageBlockInput) { + super(i) + this.applyOptions(i?.options as Partial) + } + + applyOptions (o?: Partial): void { + if (!o) return + + this.options.navigationItems = (o.navigationItems || []).map(f => new NavigationItem(f)) + + if (o.display) { + this.options.display = o.display + } + } + + static makeNavigationItem (item?: NavigationItemInput): NavigationItem { + return new NavigationItem(item) + } +} + +Registry.set(kind, PageBlockNavigation) diff --git a/lib/js/src/compose/types/page-block/navigation/navigation-item.ts b/lib/js/src/compose/types/page-block/navigation/navigation-item.ts new file mode 100644 index 000000000..34ed75b10 --- /dev/null +++ b/lib/js/src/compose/types/page-block/navigation/navigation-item.ts @@ -0,0 +1,72 @@ +import { Apply } from '../../../../cast' + +interface DropdownItem { + label: string; + url: string; + delimiter: boolean; + target: string; +} + +interface Dropdown { + label: string; + items: DropdownItem[] +} + +interface ItemOptions { + label: string; + url: string; + target: string; + delimiter: boolean; + pageID: string; + displaySubPages: boolean; + dropdown: Dropdown; + align: string; +} + +interface NavigationItemOptions { + enabled: boolean; + textColor: string; + backgroundColor: string; + item: ItemOptions; +} + +export type NavigationItemInput = Partial | NavigationItem + +const defOptions = { + enabled: true, + textColor: '#0B344E', + backgroundColor: '', + item: { + label: '', + url: '', + target: '', + delimiter: false, + pageID: '', + displaySubPages: false, + align: 'bottom', + dropdown: { + label: "", + items: [] + }, + }, +} + +export default class NavigationItem { + public type = '' + + public options: NavigationItemOptions = { ...defOptions } + + constructor (i?: NavigationItemInput) { + this.apply(i) + } + + apply (i?: NavigationItemInput): void { + if (!i) return + + Apply(this, i, String, 'type') + + if (i.options) { + this.options = { ...this.options, ...i.options } + } + } +} diff --git a/locale/en/corteza-webapp-compose/block.yaml b/locale/en/corteza-webapp-compose/block.yaml index 4598f6877..ec388deac 100644 --- a/locale/en/corteza-webapp-compose/block.yaml +++ b/locale/en/corteza-webapp-compose/block.yaml @@ -505,6 +505,56 @@ comment: footnote: 'Field value will be used as reference' navigation: chart: Charts + label: Navigation + displayOptions: Display options + appearance: Appearance + alignment: Alignment + fillJustify: Fill and Justify + fieldLabel: Label + enabled: Enabled + openIn: Open in + navigationItems: Navigation items + type: Type + disabled: Disabled + color: Color + background: Background + url: URL + drop: Dropdown position + add: Add + composePage: Compose page + tabs: Tabs + pills: Pills + small: Small + center: Center + left: Left + right: Right + bottom: Bottom + top: Top + fill: Fill + justify: Justify + primary: Primary + secondary: Secondary + success: Success + warning: Warning + danger: Danger + info: Info + text: Text + dropdown: Dropdown + multi: Multiline + sameTab: Same tab + selectOpenInType: Select open in type + newTab: New tab + dropdownItems: Dropdown items + delimiter: Delimiter + none: None + displaySubPages: Display sub-pages + selectBackground: Select background + preview: + preview: Preview + label: Label + home: Home + dropdown: dropdown + about: about report: label: Report scenario: