diff options
| author | Geireann Lindfield Roberts <60007097+geireann@users.noreply.github.com> | 2023-07-17 23:11:35 -0400 |
|---|---|---|
| committer | Geireann Lindfield Roberts <60007097+geireann@users.noreply.github.com> | 2023-07-17 23:11:35 -0400 |
| commit | 54308259a8cd3ac98aaee550ea01ad97f17172e6 (patch) | |
| tree | d3bd71ed669ac12eb6173a8a0632e5b276578d3b /src/client/views/nodes/button | |
| parent | 241332557f10fa97718200821374755b68e4fe10 (diff) | |
so many updates
Diffstat (limited to 'src/client/views/nodes/button')
| -rw-r--r-- | src/client/views/nodes/button/FontIconBox.scss | 438 | ||||
| -rw-r--r-- | src/client/views/nodes/button/FontIconBox.tsx | 385 |
2 files changed, 0 insertions, 823 deletions
diff --git a/src/client/views/nodes/button/FontIconBox.scss b/src/client/views/nodes/button/FontIconBox.scss deleted file mode 100644 index 9d9fa26b0..000000000 --- a/src/client/views/nodes/button/FontIconBox.scss +++ /dev/null @@ -1,438 +0,0 @@ -@import '../../global/globalCssVariables'; - -.menuButton { - height: 100%; - display: flex; - justify-content: center; - align-items: center; - font-size: 80%; - border-radius: $standard-border-radius; - transition: 0.15s; - - .menuButton-wrap { - grid-column: 1; - justify-content: center; - align-items: center; - text-align: center; - } - - .fontIconBox-label { - color: $white; - bottom: -1; - position: absolute; - text-align: center; - font-size: 7px; - letter-spacing: normal; - background-color: inherit; - border-radius: 8px; - padding: 0; - width: 100%; - font-family: 'system-ui'; - text-transform: uppercase; - font-weight: bold; - transition: 0.15s; - } - - .fontIconBox-icon { - width: 80%; - height: 80%; - } - - &.clickBtn, - &.clickBtnLabel { - cursor: pointer; - flex-direction: column; - - svg { - width: 50% !important; - height: 50%; - } - } - - &.clickBtnLabel { - svg { - margin-top: -4px; - } - } - - &.textBtn { - display: grid; - /* grid-row: auto; */ - grid-auto-flow: column; - cursor: pointer; - width: 100%; - justify-content: center; - align-items: center; - justify-items: center; - } - - &.tglBtn, - &.tglBtnLabel { - cursor: pointer; - flex-direction: column; - - &.switch { - //TOGGLE - - .switch { - position: relative; - display: inline-block; - width: 100%; - height: 25px; - margin: 0; - } - - .switch input { - opacity: 0; - width: 0; - height: 0; - } - - .slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: lightgrey; - -webkit-transition: 0.4s; - transition: 0.4s; - } - - .slider:before { - position: absolute; - content: ''; - height: 21px; - width: 21px; - left: 2px; - bottom: 2px; - background-color: $white; - -webkit-transition: 0.4s; - transition: 0.4s; - } - - input:checked + .slider { - background-color: $medium-blue; - } - - input:focus + .slider { - box-shadow: 0 0 1px $medium-blue; - } - - input:checked + .slider:before { - -webkit-transform: translateX(26px); - -ms-transform: translateX(26px); - transform: translateX(26px); - } - - /* Rounded sliders */ - .slider.round { - border-radius: $standard-border-radius; - } - - .slider.round:before { - border-radius: $standard-border-radius; - } - } - - svg { - width: 50% !important; - height: 50%; - } - - &:hover { - background-color: rgba(0, 0, 0, 0.3); - } - } - - &.tglBtnLabel { - svg { - margin-top: -4px; - } - } - - &.toolBtn, - &.toolBtnLabel { - cursor: pointer; - width: 100%; - border-radius: 100%; - flex-direction: column; - // margin-top: -4px; - - svg { - width: 60% !important; - height: 60%; - } - } - - &.toolBtnLabel { - svg { - margin-top: -4px; - } - } - - &.menuBtn { - cursor: pointer !important; - border-radius: 0px; - flex-direction: column; - - svg { - width: 45% !important; - height: 45%; - } - - &:hover { - filter: brightness(0.85); - } - } - - &.colorBtn, - &.colorBtnLabel { - color: black; - cursor: pointer; - flex-direction: column; - background: transparent; - - .colorButton-color { - margin-top: 3px; - width: 80%; - height: 3px; - } - - .menuButton-dropdownBox { - position: absolute; - width: fit-content; - height: fit-content; - color: black; - top: 100%; - left: 0; - z-index: 21; - background-color: #e3e3e3; - box-shadow: 0px 3px 4px rgba(0, 0, 0, 0.3); - border-radius: 3px; - } - } - - &.colorBtnLabel { - svg { - margin-top: -4px; - } - } - - &.drpdownList { - width: 100%; - display: grid; - grid-auto-columns: 80px 20px; - justify-items: center; - font-family: 'Roboto'; - white-space: nowrap; - text-overflow: ellipsis; - font-size: 13; - font-weight: 600; - overflow: hidden; - cursor: pointer; - background: transparent; - align-content: center; - align-items: center; - - .menuButton-dropdownList { - position: absolute; - width: 150px; - height: fit-content; - top: 100%; - z-index: 21; - background-color: $white; - box-shadow: 0px 3px 4px rgba(0, 0, 0, 0.3); - padding: 1px; - - .list-item { - color: $black; - width: 100%; - height: 25px; - font-weight: 400; - display: flex; - justify-content: left; - align-items: center; - padding-left: 5px; - } - - .list-item:hover { - background-color: lightgrey; - } - } - } - - &.numBtn { - cursor: pointer; - background: transparent; - - &.slider { - color: $white; - cursor: pointer; - flex-direction: column; - background: transparent; - - .menu-slider { - width: 100px; - } - - .menuButton-dropdownBox { - position: absolute; - width: fit-content; - height: fit-content; - top: 100%; - z-index: 21; - background-color: #e3e3e3; - box-shadow: 0px 3px 4px rgba(0, 0, 0, 0.3); - border-radius: $standard-border-radius; - - .menu-slider { - height: 10px; - } - input[type='range']::-webkit-slider-runnable-track { - background: gray; - height: 3px; - } - - input[type='range']::-webkit-slider-thumb { - box-shadow: 1px 1px 1px #000000; - border: 1px solid #000000; - height: 10px; - width: 10px; - border-radius: 5px; - background: #ffffff; - cursor: pointer; - -webkit-appearance: none; - margin-top: -4px; - } - } - } - - .button { - width: 25%; - display: flex; - align-items: center; - justify-content: center; - - &.number { - width: 50%; - - .button-input { - background: none; - border: none; - text-align: right; - width: 100%; - color: $white; - height: 100%; - text-align: center; - } - - .button-input:focus { - outline: none; - } - } - } - - &.list { - width: 100%; - justify-content: space-around; - border: $standard-border; - - .menuButton-dropdownList { - position: absolute; - width: fit-content; - height: fit-content; - min-width: 50%; - max-height: 50vh; - overflow-y: scroll; - top: 100%; - z-index: 21; - background-color: $white; - box-shadow: 0px 3px 4px rgba(0, 0, 0, 0.3); - padding: 1px; - - .list-item { - color: $black; - width: 100%; - height: 25px; - font-weight: 400; - display: flex; - justify-content: center; - align-items: center; - } - - .list-item:hover { - background-color: lightgrey; - } - } - } - } - - &.editableText { - cursor: text; - display: flex; - flex-direction: row; - gap: 5px; - padding-left: 10px; - justify-content: flex-start; - color: black; - background-color: $light-gray; - padding: 5px; - padding-left: 10px; - width: 100%; - height: 100%; - } - - &.drpDownBtn { - cursor: pointer; - background: transparent; - border: solid 0.5px grey; - - &.true { - background: rgba(0, 0, 0, 0.3); - } - - .menuButton-dropdownBox { - position: absolute; - width: 150px; - height: 250px; - top: 100%; - background-color: #e3e3e3; - box-shadow: 0px 3px 4px rgba(0, 0, 0, 0.3); - border-radius: $standard-border-radius; - } - } - - .menuButton-dropdown { - display: flex; - justify-content: center; - align-items: center; - font-size: 15px; - grid-column: 2; - border-radius: 0px 7px 7px 0px; - width: 13px; - height: 100%; - right: 0; - } - - .menuButton-dropdown-header { - width: 100%; - font-weight: 300; - padding: 5px; - overflow: hidden; - font-size: 12px; - white-space: nowrap; - text-overflow: ellipsis; - } - - .dropbox-background { - width: 200vw; - height: 200vh; - top: -100vh; - z-index: 20; - left: -100vw; - background: transparent; - position: fixed; - } -} diff --git a/src/client/views/nodes/button/FontIconBox.tsx b/src/client/views/nodes/button/FontIconBox.tsx deleted file mode 100644 index e31407f4b..000000000 --- a/src/client/views/nodes/button/FontIconBox.tsx +++ /dev/null @@ -1,385 +0,0 @@ -import { IconProp } from '@fortawesome/fontawesome-svg-core'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { Button, ColorPicker, Dropdown, DropdownType, EditableText, IconButton, IListItemProps, NumberDropdown, NumberDropdownType, Size, Toggle, ToggleType, Type } from 'browndash-components'; -import { action, computed, observable } from 'mobx'; -import { observer } from 'mobx-react'; -import * as React from 'react'; -import { Doc, StrListCast } from '../../../../fields/Doc'; -import { ScriptField } from '../../../../fields/ScriptField'; -import { BoolCast, Cast, NumCast, ScriptCast, StrCast } from '../../../../fields/Types'; -import { CollectionViewType, DocumentType } from '../../../documents/DocumentTypes'; -import { SelectionManager } from '../../../util/SelectionManager'; -import { undoable, UndoManager } from '../../../util/UndoManager'; -import { ContextMenu } from '../../ContextMenu'; -import { DocComponent } from '../../DocComponent'; -import { EditableView } from '../../EditableView'; -import { Colors } from '../../global/globalEnums'; -import { StyleProp } from '../../StyleProvider'; -import { FieldView, FieldViewProps } from '.././FieldView'; -import { OpenWhere } from '../DocumentView'; -import { RichTextMenu } from '../formattedText/RichTextMenu'; -import './FontIconBox.scss'; - -export enum ButtonType { - TextButton = 'textBtn', - MenuButton = 'menuBtn', - DropdownList = 'drpdownList', - DropdownButton = 'drpdownBtn', - ClickButton = 'clickBtn', - DoubleButton = 'dblBtn', - ToggleButton = 'tglBtn', - ColorButton = 'colorBtn', - ToolButton = 'toolBtn', - NumberSliderButton = 'numSliderBtn', - NumberDropdownButton = 'numDropdownBtn', - NumberInlineButton = 'numInlineBtn', - EditableText = 'editableText', -} - -export interface ButtonProps extends FieldViewProps { - type?: ButtonType; -} -@observer -export class FontIconBox extends DocComponent<ButtonProps>() { - public static LayoutString(fieldKey: string) { - return FieldView.LayoutString(FontIconBox, fieldKey); - } - @observable noTooltip = false; - showTemplate = (): void => { - const dragFactory = Cast(this.layoutDoc.dragFactory, Doc, null); - dragFactory && this.props.addDocTab(dragFactory, OpenWhere.addRight); - }; - dragAsTemplate = (): void => { - this.layoutDoc.onDragStart = ScriptField.MakeFunction('getCopy(this.dragFactory, true)'); - }; - useAsPrototype = (): void => { - this.layoutDoc.onDragStart = ScriptField.MakeFunction('makeDelegate(this.dragFactory, true)'); - }; - - specificContextMenu = (): void => { - if (!Doc.noviceMode) { - const cm = ContextMenu.Instance; - cm.addItem({ description: 'Show Template', event: this.showTemplate, icon: 'tag' }); - cm.addItem({ description: 'Use as Render Template', event: this.dragAsTemplate, icon: 'tag' }); - cm.addItem({ description: 'Use as Prototype', event: this.useAsPrototype, icon: 'tag' }); - } - }; - - static GetShowLabels() { - return BoolCast(Doc.UserDoc()._showLabel); - } - static SetShowLabels(show: boolean) { - Doc.UserDoc()._showLabel = show; - } - static GetRecognizeGestures() { - return BoolCast(Doc.UserDoc()._recognizeGestures); - } - static SetRecognizeGestures(show: boolean) { - Doc.UserDoc()._recognizeGestures = show; - } - - // Determining UI Specs - @computed get label() { - return StrCast(this.rootDoc.icon_label, StrCast(this.rootDoc.title)); - } - Icon = (color: string, iconFalse?: boolean) => { - let icon; - if (iconFalse ) { - icon = StrCast(this.dataDoc[this.fieldKey ?? 'iconFalse'] ?? this.dataDoc.icon, 'user') as any; - if (icon) return <FontAwesomeIcon className={`fontIconBox-icon-${this.type}`} icon={icon} color={color} /> - else return null - } - icon = StrCast(this.dataDoc[this.fieldKey ?? 'icon'] ?? this.dataDoc.icon, 'user') as any; - const trailsIcon = () => <img src={`/assets/${'presTrails.png'}`} style={{ width: 30, height: 30, filter: `invert(${color === Colors.DARK_GRAY ? '0%' : '100%'})` }} />; - return !icon ? null : icon === 'pres-trail' ? trailsIcon() : <FontAwesomeIcon className={`fontIconBox-icon-${this.type}`} icon={icon} color={color} />; - }; - @computed get dropdown() { - return BoolCast(this.rootDoc.dropDownOpen); - } - @computed get buttonList() { - return StrListCast(this.rootDoc.btnList); - } - @computed get type() { - return StrCast(this.rootDoc.btnType); - } - - /** - * Types of buttons in dash: - * - Main menu button (LHS) - * - Tool button - * - Expandable button (CollectionLinearView) - * - Button inside of CollectionLinearView vs. outside of CollectionLinearView - * - Action button - * - Dropdown button - * - Color button - * - Dropdown list - * - Number button - **/ - - _batch: UndoManager.Batch | undefined = undefined; - /** - * Number button - */ - @computed get numberDropdown() { - let type: NumberDropdownType; - switch(this.type) { - case ButtonType.NumberDropdownButton: - type = 'dropdown' - break; - case ButtonType.NumberInlineButton: - type = 'input' - break; - case ButtonType.NumberSliderButton: - default: - type = 'slider' - break; - } - const numScript = (value?: number) => ScriptCast(this.rootDoc.script).script.run({ self: this.rootDoc, value, _readOnly_: value === undefined }); - const color = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.Color); - // Script for checking the outcome of the toggle - const checkResult = Number(Number(numScript().result ?? 0).toPrecision(NumCast(this.dataDoc.numPrecision, 3))); - const label = !FontIconBox.GetShowLabels() ? null : <div className="fontIconBox-label">{this.label}</div>; - - return <NumberDropdown - color={color} - numberDropdownType={type} - showPlusMinus={false} - min={NumCast(this.rootDoc.numBtnMin, 0)} - max={NumCast(this.rootDoc.numBtnMax, 100)} - number={checkResult} - setNumber={undoable(value => numScript(value), `${this.rootDoc.title} button set from list`)} - /> - } - - /** - * Dropdown button - */ - @computed get dropdownButton() { - const active: string = StrCast(this.rootDoc.dropDownOpen); - const color = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.Color); - const backgroundColor = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.BackgroundColor); - return ( - <div - className={`menuButton ${this.type} ${active}`} - style={{ color: color, backgroundColor: backgroundColor, borderBottomLeftRadius: this.dropdown ? 0 : undefined }} - onClick={action(() => { - this.rootDoc.dropDownOpen = !this.rootDoc.dropDownOpen; - this.noTooltip = this.rootDoc.dropDownOpen; - Doc.UnBrushAllDocs(); - })}> - {this.Icon(color)} - {!this.label || !FontIconBox.GetShowLabels() ? null : ( - <div className="fontIconBox-label" style={{ color: color, backgroundColor: backgroundColor }}> - {' '} - {this.label}{' '} - </div> - )} - <div className="menuButton-dropdown" style={{ borderBottomRightRadius: this.dropdown ? 0 : undefined }}> - <FontAwesomeIcon icon={'caret-down'} color={color} size="sm" /> - </div> - {this.rootDoc.dropDownOpen ? <div className="menuButton-dropdownBox">{/* DROPDOWN BOX CONTENTS */}</div> : null} - </div> - ); - } - - /** - * Dropdown list - */ - @computed get dropdownListButton() { - const active: string = StrCast(this.rootDoc.dropDownOpen); - const color = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.Color); - const backgroundColor = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.BackgroundColor); - - const script = ScriptCast(this.rootDoc.script); - - let noviceList: string[] = []; - let text: string | undefined; - let dropdown = true; - let icon: IconProp = 'caret-down'; - try { - if (script?.script.originalScript.startsWith('setView')) { - const selected = SelectionManager.Docs().lastElement(); - console.log('selected') - if (selected) { - if (StrCast(selected.type) === DocumentType.COL) { - text = StrCast(selected._type_collection); - } else { - console.log("doc selected", selected.title) - dropdown = false; - text = selected.type === DocumentType.RTF ? 'Text' : StrCast(selected.type); - icon = Doc.toIcon(selected); - return <div>Hi!</div> - } - } else { - dropdown = false; - icon = 'globe-asia'; - text = 'User Default'; - return <div>Hi!</div> - } - noviceList = [CollectionViewType.Freeform, CollectionViewType.Schema, CollectionViewType.Stacking, CollectionViewType.NoteTaking]; - } else text = StrCast((RichTextMenu.Instance?.TextView?.EditorView ? RichTextMenu.Instance : Doc.UserDoc()).fontFamily); - } catch (e) { - console.log(e); - } - - console.log("current item: ", text); - - // Get items to place into the list - const list: IListItemProps[] = this.buttonList - .filter(value => !Doc.noviceMode || !noviceList.length || noviceList.includes(value)) - .map(value => ( - { - text: value, - val: value, - style: { fontFamily: value }, - onClick: undoable(() => script.script.run({ self: this.rootDoc, value }), value) - // shortcut: '#', - } - )); - - - return ( - <Dropdown - selectedVal={text} - setSelectedVal={undoable((val) => script.script.run({ self: this.rootDoc, val }), `dropdown select ${this.label}`)} - color={Colors.WHITE} - type={Type.PRIM} - dropdownType={DropdownType.SELECT} - items={list} - tooltip={this.label} - /> - ) - } - - - @computed get colorScript() { - return ScriptCast(this.rootDoc.script); - } - - /** - * Color button - */ - @computed get colorButton() { - const color = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.Color); - const backgroundColor = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.BackgroundColor); - const curColor = this.colorScript?.script.run({ self: this.rootDoc, value: undefined, _readOnly_: true }).result ?? 'transparent'; - const tooltip: string = StrCast(this.rootDoc.toolTip); - - return ( - <ColorPicker - setSelectedColor={(value) => { - const s = this.colorScript; - s && undoable(() => s.script.run({ self: this.rootDoc, value: value, _readOnly_: false }).result, `Set ${tooltip} to ${value}`)(); - }} - selectedColor={curColor} - type={Type.PRIM} - color={color} - icon={this.Icon(color)!} - tooltip={tooltip} - label={this.label} - /> - ) - } - - @computed get toggleButton() { - // Determine the type of toggle button - const switchToggle: boolean = BoolCast(this.rootDoc.switchToggle); - const buttonText: string = StrCast(this.rootDoc.buttonText); - const tooltip: string = StrCast(this.rootDoc.toolTip); - - // Colors - const color = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.Color); - const backgroundColor = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.BackgroundColor); - - console.log(buttonText, tooltip); - return ( - <Toggle tooltip={`Toggle + ${tooltip}`} toggleType={ToggleType.BUTTON} type={Type.PRIM} toggleStatus={switchToggle} text={buttonText} color={color} icon={this.Icon(color)!} label={this.label}/> - ) - } - - /** - * Default - */ - @computed get defaultButton() { - const color = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.Color); - const backgroundColor = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.BackgroundColor); - const tooltip: string = StrCast(this.rootDoc.toolTip); - - return ( - <IconButton tooltip={tooltip} icon={this.Icon(color)!} label={this.label}/> - ) - } - - @computed get editableText() { - // Script for running the toggle - const script = ScriptCast(this.rootDoc.script); - // Function to run the script - const checkResult = script?.script.run({ value: '', _readOnly_: true }).result; - - const setValue = (value: string, shiftDown?: boolean): boolean => script?.script.run({ value, _readOnly_: false }).result; - - return <EditableText - editing={false} onEdit={() => {}} setEditing={(editing: boolean) => {}} - /> - - return ( - <div className="menuButton editableText"> - <FontAwesomeIcon className={`fontIconBox-icon-${this.type}`} icon={'lock'} /> - <div style={{ width: 'calc(100% - .875em)', paddingLeft: '4px' }}> - <EditableView GetValue={() => script?.script.run({ value: '', _readOnly_: true }).result} SetValue={setValue} oneLine={true} contents={checkResult} /> - </div> - </div> - ); - } - - render() { - // determine dash button metadata - const color = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.Color); - const backgroundColor = this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.BackgroundColor); - const tooltip: string = StrCast(this.rootDoc.toolTip); - - // TODO:glr Add label of button type - let button: JSX.Element = this.defaultButton; - // prettier-ignore - switch (this.type) { - case ButtonType.EditableText: - button = this.editableText; - break; - case ButtonType.DropdownList: - button = this.dropdownListButton; - break; - case ButtonType.ColorButton: - button = this.colorButton; - break; - case ButtonType.NumberDropdownButton: - case ButtonType.NumberInlineButton: - case ButtonType.NumberSliderButton: - button = this.numberDropdown; - break; - case ButtonType.DropdownButton: - button = this.dropdownButton; - break; - case ButtonType.ToggleButton: button = this.toggleButton; break; - case ButtonType.TextButton: - // Script for checking the outcome of the toggle - const script = ScriptCast(this.rootDoc.script); - const checkResult = script?.script.run({ _readOnly_: true }).result; - button = ( - <Button tooltip={tooltip} color={checkResult ?? backgroundColor} icon={this.Icon(color)!} text={StrCast(this.rootDoc.buttonText)} label={this.label}/> - ); - break; - case ButtonType.ClickButton: - case ButtonType.ToolButton: - button = ( - <IconButton tooltip={tooltip} color={color} icon={this.Icon(color)!} label={this.label}/> - ); - break; - case ButtonType.MenuButton: button = ( - <IconButton tooltip={tooltip} tooltipPlacement='right' size={Size.LARGE} color={color} icon={this.Icon(color)!} label={this.label}/> - ); - break; - } - - return button; - } -} |
