@vertigis/workflow 5.47.0 → 5.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/IActivityHandler.d.ts +2 -1
- package/activities/arcgis/GetAttributeValue.js +1 -1
- package/activities/arcgis/GetAttributeValues.js +1 -1
- package/activities/arcgis/MapProvider.js +1 -1
- package/activities/core/AwaitAsyncActivity.d.ts +9 -0
- package/activities/core/AwaitAsyncActivity.js +1 -0
- package/activities/core/WebRequest.js +1 -1
- package/activities/forms/FormRenderer.js +1 -1
- package/activities/forms/SetFormElementEvent.js +1 -1
- package/activities/index.js +1 -1
- package/definition/Step.d.ts +1 -1
- package/execution/AmbientState.d.ts +2 -0
- package/execution/AmbientState.js +1 -1
- package/execution/AsyncContext.d.ts +4 -0
- package/execution/AsyncContext.js +1 -1
- package/forms/FormDefinition.d.ts +4 -4
- package/forms/FormHost.d.ts +55 -9
- package/forms/FormHost.js +1 -1
- package/forms/branding/WorkflowColor.d.ts +17 -0
- package/forms/branding/WorkflowColor.js +1 -0
- package/forms/branding/colors.d.ts +15 -0
- package/forms/branding/colors.js +1 -0
- package/forms/branding/createPalette.d.ts +21 -0
- package/forms/branding/createPalette.js +1 -0
- package/forms/components/AutoComplete.d.ts +1 -1
- package/forms/components/AutoComplete.js +1 -1
- package/forms/components/Button.d.ts +7 -0
- package/forms/components/Button.js +1 -1
- package/forms/components/ButtonBar.d.ts +1 -1
- package/forms/components/ButtonBar.js +1 -1
- package/forms/components/CheckBox.d.ts +1 -1
- package/forms/components/CheckBox.js +1 -1
- package/forms/components/CheckGroup.d.ts +1 -1
- package/forms/components/CheckGroup.js +1 -1
- package/forms/components/Custom.d.ts +1 -1
- package/forms/components/Custom.js +1 -1
- package/forms/components/DatePicker.d.ts +1 -1
- package/forms/components/DatePicker.js +1 -1
- package/forms/components/DateRangePicker.d.ts +1 -1
- package/forms/components/DateRangePicker.js +1 -1
- package/forms/components/DateTimePicker.d.ts +1 -1
- package/forms/components/DateTimePicker.js +1 -1
- package/forms/components/DropDownList.d.ts +1 -1
- package/forms/components/DropDownList.js +1 -1
- package/forms/components/FilePicker.d.ts +1 -1
- package/forms/components/FilePicker.js +1 -1
- package/forms/components/Form.js +1 -1
- package/forms/components/GeometryPicker.d.ts +1 -1
- package/forms/components/GeometryPicker.js +1 -1
- package/forms/components/HorizontalRule.d.ts +1 -1
- package/forms/components/HorizontalRule.js +1 -1
- package/forms/components/Image.d.ts +1 -1
- package/forms/components/Image.js +1 -1
- package/forms/components/ItemPicker.d.ts +2 -2
- package/forms/components/ItemPicker.js +1 -1
- package/forms/components/ListBox.d.ts +1 -1
- package/forms/components/ListBox.js +1 -1
- package/forms/components/Number.d.ts +1 -1
- package/forms/components/Number.js +1 -1
- package/forms/components/NumberRangeSlider.d.ts +1 -1
- package/forms/components/NumberRangeSlider.js +1 -1
- package/forms/components/NumberSlider.d.ts +1 -1
- package/forms/components/NumberSlider.js +1 -1
- package/forms/components/RadioGroup.d.ts +1 -1
- package/forms/components/RadioGroup.js +1 -1
- package/forms/components/Scanner.d.ts +2 -2
- package/forms/components/Scanner.js +1 -1
- package/forms/components/Section.d.ts +1 -1
- package/forms/components/Section.js +1 -1
- package/forms/components/Signature.d.ts +1 -1
- package/forms/components/Signature.js +1 -1
- package/forms/components/Sketch.d.ts +1 -1
- package/forms/components/Sketch.js +1 -1
- package/forms/components/Text.d.ts +1 -1
- package/forms/components/Text.js +1 -1
- package/forms/components/TextArea.d.ts +1 -1
- package/forms/components/TextArea.js +1 -1
- package/forms/components/TextBox.d.ts +1 -1
- package/forms/components/TextBox.js +1 -1
- package/forms/components/TimePicker.d.ts +1 -1
- package/forms/components/TimePicker.js +1 -1
- package/forms/dateUtilities.d.ts +3 -5
- package/forms/dateUtilities.js +1 -1
- package/forms/presenter.d.ts +1 -1
- package/forms/presenter.js +1 -1
- package/forms/utils.d.ts +9 -7
- package/forms/utils.js +1 -1
- package/libs/version.d.ts +1 -1
- package/libs/version.js +1 -1
- package/package.json +21 -11
- package/forms/Calendar.d.ts +0 -89
- package/forms/Calendar.js +0 -1
package/forms/FormHost.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import Bluebird from"bluebird";import{Task}from"../Task.js";import{DEFAULT_LOCALE}from"../constants.js";import*as defs from"./FormDefinition.js";import MutuallyExclusiveSectionGroup from"./MutuallyExclusiveSectionGroup.js";import NumberParser from"./NumberParser.js";import{FormElementTypes}from"./constants.js";import{format}from"./numberFormatter.js";import*as presenter from"./presenter.js";import{isCollapsibleSection,isMutuallyExclusiveSection,isSection,sortAndFilter,text}from"./utils.js";export{defs};const guid="C0166F74-982A-464E-9FB6-9605CB7649C1:",eventName=guid+"FormEvent";function createEvent(e,t){return new CustomEvent(e,{bubbles:!1,cancelable:!1,detail:t})}function overlay(e,t){switch(typeof e){case"boolean":case"number":case"string":return e;case"object":break;default:return t}if(null===e)return t;if(e instanceof Array){let s=t;null==s&&(s=[]);let i=0;for(const t of e){const n=overlay(t,s[i]);void 0!==n&&(i<e.length?s[i]=n:s.push(n),++i)}return s}let s=t;void 0===s&&(s={});for(const t in e)s[t]=overlay(e[t],s[t]);return s}function createSubscription(e){const t=function(){return void 0!==e&&(t.active=!1,e(),!0)};return t.active=!0,t}export class FormHost{constructor(){this.form={defaults:{},elements:{}},this.errors={},this.refs={},this.enabled=!1,this.visible=!1,this.dismiss=!1,this.custom=!1,this.container=document.createElement("div"),this.eventIndex=0,this.eventQueue=[],this.mutuallyExclusiveSections={},this.nextFocus=!1,this.nextRefresh=!1,this.enqueueExternalEvent=e=>{const t={type:`external$${e.name}`,name:"header",argument:e};this.enqueue(t.type,t)}}deriveLocale(){return DEFAULT_LOCALE}mount(){const e=this.container,t=e.parentNode;null==t&&document.body.appendChild(e),this.update()}unmount(){const e=this.container,t=e.parentNode;null!=t&&t.removeChild(e)}observeFocus(e){this.enabled&&e instanceof HTMLElement&&(this.lastFocus&&this.lastFocus.target===e||this.setLastFocus(e))}focus(e){null==e&&(e=!1),!0===e&&(this.lastFocus=void 0),!1===e&&!1===(e=this.nextFocus)&&(e=!0),this.nextFocus=e,this.invalidate(!0!==e?e:void 0)}show(){const e=this.container;if(void 0===e)return!1;this.custom||void 0!==this.focusObserver||e.addEventListener("focus",this.focusObserver=e=>this.observeFocus(e.target),!0),this.enabled||(this.nextRefresh=!0,this.focus()),this.enforceMutuallyExclusiveConstraints();const t=this.errors;for(const e in t){const s=this.form.elements[e];null!=s&&(s.error=t[e],this.invalidate(e))}return this.idle(),!1!==this.nextRefresh&&(this.enabled=!0,this.visible=!0,this.mount()),this.enabled}isInvalid(e){return!!e.error&&!1!==e.visible}getInvalidElements(){return Object.keys(this.form.elements).map(e=>this.form.elements[e]).filter(this.isInvalid)}hasInvalidChild(e){for(const t in this.form.elements){const s=this.form.elements[t];if(this.isInvalid(s)&&this.getParentSection(s)===e)return!0}return!1}spin(){return void 0!==this.container&&(this.idle(),this.visible&&!this.enabled||(this.nextRefresh=!0,this.enabled=!1,this.visible=!0,this.mount()),this.visible)}hide(){return void 0!==this.container&&(this.idle(),this.visible&&(this.enabled=!1,this.visible=!1,this.unmount()),!0)}dispose(){if(!this.dismiss){this.dismiss=!0;const e=this.container;e.dispatchEvent(createEvent(eventName));let t=this.focusObserver;return void 0!==t&&(e.removeEventListener("focus",t,!0),t=void 0),this.idle(),this.unmount(),this.refs={},presenter.releaseForm(this.container),this.container=void 0,this.lastFocus=void 0,this.eventTask=void 0,!0}return!1}renderFocus(e,t){const s=this.nextFocus;if(this.enabled&&e instanceof HTMLElement)if(!1!==s)if(void 0!==t){if(t===s||!0===s&&void 0===this.lastFocus)return this.nextFocus=!1,this.setLastFocus(e,t),e.focus(),!0}else{const t=this.lastFocus?.target;if(!0===s&&t instanceof HTMLElement&&e.contains(t))return this.nextFocus=!1,t.focus(),!0}else if(!1===s&&t&&t!==this.lastFocus?.name&&this.isElementPositionBeforeLastFocused(t))return this.setLastFocus(e,t),e.focus(),!0;return!1}renderText(e){return"string"==typeof e?e:text.isMarkdown(e)?text.markdownToText(e.markdown):""}translateText(e){return"string"==typeof e||text.isMarkdown(e)?e:text.isStatus(e)?e.status:void 0}renderVisual(e){return presenter.render(e)||presenter.renderNone(e)}qualifyDefault(e){const t=sortAndFilter(this.form.elements);for(const s in t){const i=t[s];if(null!=i&&!1!==i.visible&&i.enabled){if(i.default)return e.value=i.value,s;const t=sortAndFilter(i.items);if(null!=t)for(const i in t){const n=t[i];if(null!=n&&n.visible&&n.enabled&&n.default)return e.item=i,e.value=n.value,s}}}}qualify(e,t){if(null==t&&(t={}),"clicked"===e&&void 0===t.name&&(t.name=this.qualifyDefault(t)),t.type=e,void 0===t.routingKey){const s=t.name;t.routingKey=void 0!==s?e+"$"+s:e}return t}post(e,t){t=this.publish(e,t);const s=this.container;void 0!==s&&s.dispatchEvent(createEvent(eventName,t))}subscribe(e){let t=e;const s=this.container;if(void 0===s)return createSubscription();const i=function(){t=void 0,s.removeEventListener(eventName,n)},n=function(e){const s=e.detail;void 0!==s?Bluebird.resolve().then(function(){"function"==typeof t&&t(s)}):i()};return s.addEventListener(eventName,n),createSubscription(i)}refresh(e){if(!this.custom)if("string"==typeof e){const t=this.refs[e];presenter.refresh(t)}else this.refs={},presenter.refreshForm(this,this.container)}invalidate(e){const t=this.nextRefresh;"string"==typeof e&&!0!==t&&(!1===t?this.nextRefresh={[e]:!0}:t[e]=!0),void 0!==e&&!0!==e||(this.nextRefresh=!0),!1===e&&!1===t&&(this.nextRefresh={})}update(){const e=this.nextRefresh;if(!0===e&&(this.nextRefresh=!1,this.refresh()),"object"==typeof e){this.nextRefresh=!1;for(const t in e)!0===e[t]&&this.refresh(t)}}idle(){const e=this.timerHandle;void 0!==e&&(this.timerHandle=void 0,e())}busy(){if(void 0===this.timerHandle&&void 0!==this.container){let e=setTimeout(()=>this.spin());this.timerHandle=function(){void 0!==e&&(clearTimeout(e),e=void 0)}}}publish(e,t){return this.enabled?(t=this.enqueue(e,t),this.eventQueue.length>0&&this.spin(),t):this.qualify(e,t)}enqueue(e,t){return t=this.qualify(e,t),void 0!==this.eventTask?(this.resolveEvent(t),this.eventTask=void 0,t):(this.eventQueue.push(t),t)}dequeue(){const e=this.eventQueue;if(e.length>0){let t=this.eventIndex;const s=e[t++];return t>=e.length?e.length=this.eventIndex=0:this.eventIndex=t,s}}observe(){return Bluebird.attempt(()=>{if(void 0!==this.eventTask)return this.eventTask;const e=this.dequeue();return void 0!==e?e:this.show()?(this.eventTask=new Task(e=>{this.resolveEvent=e}),this.eventTask):void 0})}load(e,t){if(void 0===this.container)return!1;if(this.eventQueue.length=this.eventIndex=0,this.eventTask=void 0,this.errors={},this.lastFocus=void 0,this.nextFocus=!0,this.nextRefresh=!0,this.enqueue("load"),this.enqueue("prepare"),null!=e){let s={defaults:{},elements:{}};s=overlay(e,s),this.form=overlay(t,s);for(const e in this.form.elements){const t={showFilter:!1,checked:!1,enabled:!0,hoisted:!1,visible:!0,overlay:!1,default:!1,validates:!1,readOnly:!1,require:!1,autoActivate:!1};let s=this.form.elements[e];if(s=overlay(s,t),s.items)for(const e in s.items){const t={enabled:!0,checked:!1,visible:!0,default:!1,validates:!1};s.items[e]=overlay(s.items[e],t)}this.form.elements[e]=s}}return!0}route(e){switch(e.type){case"changed":return this.cascade(e.name);case"checked":return this.changed(e);case"clicked":return this.click(e);case"prepare":return this.hydrate(e);case"suggest":return this.suggest(e);case"validate":return this.verify(e);case"verify":return this.submit(e)}return!1}changed(e){return this.enqueue("changed",{name:e.name,item:e.item,value:e.value}),!0}isElementValid(e,t=!0,s={status:void 0}){return null!=e&&(s.status=void 0,text.isInvalidError(e.error)?(s.status="invalid",!1):!0!==e.require||(this.isElementEffectivelyVisible(e)?!!this.isElementValueDefined(e)||(s.status="missing",!1):t))}isElementEffectivelyVisible(e){if(null==e)return!1;const t=this.getParentSection(e);return!1!==t?.visible&&!1!==e.visible}isElementValueDefined(e){if(null==e)return!1;if(e.type===FormElementTypes.CHECKBOX)return!0;const t=e.current;if(null!=t)return!0;const s=e.value;if(null!=s&&""!==s)return!0;const i=e.items;if(null!=i)for(const e in i){const t=i[e];if(null!=t&&!0===t.checked)return!0}return!1}trap(e){switch(e.type){case"populate":case"load":case"suggest":break;default:return!1}const t=e.name,s=this.find(t);if(null==s)return!1;const i=s.dependsOn;if("string"!=typeof i)return!1;const n=this.find(i);return s.enabled=this.isElementEffectivelyVisible(n)&&this.isElementValueDefined(n),this.invalidate(t),!s.enabled}cascade(e){const t=this.find(e);if(null==t||!1===t.dependsOn)return!1;const s={[e]:!0},i=sortAndFilter(this.form.elements);for(const t in i){const n=i[t],r=n.dependsOn;if("string"==typeof r){const i=this.find(r);void 0!==i&&"string"!=typeof i.dependsOn&&(i.dependsOn=!0),!0===s[r]&&(s[t]=!0,n.checked=!1,n.current=void 0,n.label=void 0,n.items=void 0,n.value=void 0,this.invalidate(t),n.dependsOn===e&&this.enqueue("populate",{name:t}))}else n.dependsOn=!1}return!0}click(e){const t=this.form.elements[e.name];return null!=t&&t.type==FormElementTypes.BUTTONBAR&&this.validate(e)}hasInitialSelectionToDependOn(e){const t=this.form.elements[e];return t.type===FormElementTypes.DROPDOWNLIST&&(void 0!==t.current&&null!==t.current)}hydrate(e){const t=sortAndFilter(this.form.elements);for(const e in t){const t=this.form.elements[e].dependsOn;("string"!=typeof t||this.hasInitialSelectionToDependOn(t))&&this.enqueue("populate",{name:e}),this.enqueue("load",{name:e})}return!0}shouldTriggerValidation(e){const t=this.find(e.name);if(null!=t&&"string"==typeof e.value){const s=e.item;if("string"==typeof s){const e=t.items;if(null!=e){const t=e[s];if(null!=t)return!0===t.validates}return}return!0===t.validates}}validate(e){const t=this.shouldTriggerValidation(e);if(!0===t){const t=this.errors={},s=sortAndFilter(this.form.elements);for(const e in s){const i=s[e];null!=i&&(t[e]=void 0,this.enqueue("validate",{name:e}))}return this.enqueue("verify",{name:e.name,item:e.item,value:e.value,routingKey:"verify"}),!0}return!1===t&&(this.enqueue("end",{name:e.name,item:e.item,value:e.value,routingKey:"end"}),!0)}verify(e){const t=e.name,s=this.form.elements[t],i={status:void 0};return!this.isElementValid(s,!0,i)&&(i.status&&(this.errors[t]={status:i.status}),!1===this.nextFocus&&this.focus(t),!0)}suggest(e){const t=this.form.elements[e.name];return null!=t&&(t.items={message:{label:{status:"trivial"},enabled:!1}},this.invalidate(e.name),!0)}submit(e){if(!this.hasErrors()){for(const e in this.form.elements)this.form.elements[e].error=void 0;return this.enqueue("submit",{name:e.name,item:e.item,value:e.value}),!0}const t=this.errors;for(const e in t){const s=this.form.elements[e];null!=s&&(s.error=t[e],this.invalidate(e))}const s=this.getInvalidElements(),i=[];let n=!1;for(const e of s){const t=this.getParentSection(e);if(isMutuallyExclusiveSection(t)){const e=this.findName(t),s=this.getMutuallyExclusiveSectionGroup(e);if(s){const e=i.find(e=>e.group===s);e?e.element.rowNumber>t.rowNumber&&(e.element=t):(i.push({group:s,element:t}),n=!0)}}else this.isSectionCollapsed(t)&&(t.collapsed=!1,n=!0)}for(const e of i)e.group.expandedSection=e.element;return n&&this.invalidate(),this.errors={},!1}hasErrors(){const e=this.errors;for(const t in e){const s=e[t];if(null!=s)return!0}return!1}find(e){if(null!=e)return"object"==typeof e&&(e=e.name),"string"==typeof e?this.form.elements[e]:void 0}findName(e){for(const t in this.form.elements)if(this.form.elements[t]===e)return t}coerceNumber(e,t){return t=t||this.deriveLocale(),new NumberParser(t).parse(e)}formatNumber(e,t){return t||(t={locale:this.deriveLocale()}),format(t,e)}renderState(e,t,s){return!1}getParentSection(e){const t=e.section;if(!t)return;const s="string"==typeof t?t:t.name;return this.form.elements[s]}isSectionCollapsed(e){return!(!e||e.type!==FormElementTypes.SECTION||!isCollapsibleSection(e)&&!isMutuallyExclusiveSection(e))&&!0===e.collapsed}isElementPositionBeforeLastFocused(e){const t=this.lastFocus;if(!t)return!0;if("footer"===e)return!1;if("footer"===t.name)return!0;if(e&&void 0!==t?.rowNumber&&void 0!==t.rowIndex){const s=this.form.elements?.[e];if(s)return void 0!==s.rowNumber&&void 0!==s.rowIndex?s.rowNumber<t.rowNumber||s.rowNumber===t.rowNumber&&s.rowIndex<t.rowIndex:s.index<t.rowNumber||s.index===t.rowNumber&&t.rowIndex>0}return!1}setLastFocus(e,t){if(this.lastFocus={target:e},!t)return;this.lastFocus.name=t;const s=this.form.elements?.[t];s&&(void 0!==s.rowNumber&&void 0!==s.rowIndex?(this.lastFocus.rowNumber=s.rowNumber,this.lastFocus.rowIndex=s.rowIndex):(this.lastFocus.rowNumber=s.index,this.lastFocus.rowIndex=0))}getAllSectionElements(){const e={};for(const t in this.form.elements){const s=this.form.elements[t];isSection(s)&&(e[t]=s)}return e}getMutuallyExclusiveSectionGroup(e){let t=this.mutuallyExclusiveSections[e];if(!t){const s=this.find(e);if(!s||!isMutuallyExclusiveSection(s))return;t=new MutuallyExclusiveSectionGroup({elementName:e,element:s});const i=s.format,n=this.getAllSectionElements(),r=Object.keys(sortAndFilter(n,e=>e.rowNumber)),o=r.indexOf(e);for(let e=o-1;e>=0;e--){const s=r[e],n=this.find(s);if(n.format!==i)break;t.unshift({elementName:s,element:n})}for(let e=o+1;e<r.length;e++){const s=r[e],n=this.find(s);if(n.format!==i)break;t.push({elementName:s,element:n})}t.forEach(e=>{this.mutuallyExclusiveSections[e.elementName]=t})}return t}updateMutuallyExclusiveSections(e){this.getMutuallyExclusiveSectionGroup(e).forEach(t=>{t.element.collapsed=t.elementName!==e}),this.refresh()}enforceMutuallyExclusiveConstraints(){const e=Object.keys(this.form.elements).map(e=>({elementName:e,element:this.form.elements[e]})).filter(e=>isMutuallyExclusiveSection(e.element)&&!1!==e.element.visible&&!0!==e.element.collapsed).sort((e,t)=>e.element.rowNumber-t.element.rowNumber),t=[];for(const s of e){const e=this.getMutuallyExclusiveSectionGroup(s.elementName);-1===t.indexOf(e)?t.push(e):s.element.collapsed=!0}}async displayDialog(e,t){await Promise.resolve()}}
|
|
1
|
+
import Bluebird from"bluebird";import{Task}from"../Task.js";import{DEFAULT_LOCALE}from"../constants.js";import*as defs from"./FormDefinition.js";import MutuallyExclusiveSectionGroup from"./MutuallyExclusiveSectionGroup.js";import NumberParser from"./NumberParser.js";import{FormElementTypes}from"./constants.js";import{format}from"./numberFormatter.js";import*as presenter from"./presenter.js";import{isCollapsibleSection,isMutuallyExclusiveSection,isSection,sortAndFilter,text}from"./utils.js";export{defs};const guid="C0166F74-982A-464E-9FB6-9605CB7649C1:",eventName=guid+"FormEvent";function createEvent(e,t){return new CustomEvent(e,{bubbles:!1,cancelable:!1,detail:t})}function overlay(e,t){switch(typeof e){case"boolean":case"number":case"string":return e;case"object":break;default:return t}if(null===e)return t;if(e instanceof Array){let s=t;null==s&&(s=[]);let i=0;for(const t of e){const n=overlay(t,s[i]);void 0!==n&&(i<e.length?s[i]=n:s.push(n),++i)}return s}let s=t;void 0===s&&(s={});for(const t in e)s[t]=overlay(e[t],s[t]);return s}function createSubscription(e){const t=function(){return void 0!==e&&(t.active=!1,e(),!0)};return t.active=!0,t}export class FormHost{constructor(){this.form={defaults:{},elements:{}},this.errors={},this.refs={},this.enabled=!1,this.visible=!1,this.dismiss=!1,this.custom=!1,this.container=document.createElement("div"),this.eventIndex=0,this.eventQueue=[],this.domContainers={},this.mutuallyExclusiveSections={},this.nextFocus=!1,this.nextRefresh=!1,this.enqueueExternalEvent=e=>{const t={type:`external$${e.name}`,name:"header",argument:e};this.enqueue(t.type,t)}}deriveLocale(){return DEFAULT_LOCALE}mount(){const e=this.container,t=e.parentNode;null==t&&document.body.appendChild(e),this.update()}unmount(){const e=this.container,t=e.parentNode;null!=t&&t.removeChild(e)}observeFocus(e){if(this.enabled&&e instanceof HTMLElement&&(!this.lastFocus||this.lastFocus.target!==e)){let t=Object.entries(this.domContainers).filter(t=>t[1].contains(e));t.length>1&&(t=t.filter(e=>this.form.elements[e[0]].type!==FormElementTypes.SECTION));const s=t.length>0?t[0][0]:void 0;this.setLastFocus(e,s)}}focus(e){null==e&&(e=!1),!0===e&&(this.lastFocus=void 0),!1===e&&!1===(e=this.nextFocus)&&(e=!0),this.nextFocus=e,this.invalidate(!0!==e?e:void 0)}show(){const e=this.container;if(void 0===e)return!1;this.custom||void 0!==this.focusObserver||e.addEventListener("focus",this.focusObserver=e=>this.observeFocus(e.target),!0),this.enabled||(this.nextRefresh=!0,this.focus()),this.enforceMutuallyExclusiveConstraints();const t=this.errors;for(const e in t){const s=this.form.elements[e];null!=s&&(s.error=t[e],this.invalidate(e))}return this.idle(),!1!==this.nextRefresh&&(this.enabled=!0,this.visible=!0,this.mount()),this.enabled}isInvalid(e){return!!e.error&&!1!==e.visible}getInvalidElements(){return Object.keys(this.form.elements).map(e=>this.form.elements[e]).filter(this.isInvalid)}hasInvalidChild(e){for(const t in this.form.elements){const s=this.form.elements[t];if(this.isInvalid(s)&&this.getParentSection(s)===e)return!0}return!1}spin(){return void 0!==this.container&&(this.idle(),this.visible&&!this.enabled||(this.nextRefresh=!0,this.enabled=!1,this.visible=!0,this.mount()),this.visible)}hide(){return void 0!==this.container&&(this.idle(),this.visible&&(this.enabled=!1,this.visible=!1,this.unmount()),!0)}dispose(){if(!this.dismiss){this.dismiss=!0;const e=this.container;e.dispatchEvent(createEvent(eventName));let t=this.focusObserver;return void 0!==t&&(e.removeEventListener("focus",t,!0),t=void 0),this.idle(),this.unmount(),this.refs={},presenter.releaseForm(this.container),this.container=void 0,this.lastFocus=void 0,this.eventTask=void 0,!0}return!1}renderFocus(e,t){if(!(this.enabled&&e instanceof HTMLElement&&!1!==this.nextFocus))return!1;const s=this.nextFocus;if(void 0!==t){if(t===s||!0===s&&void 0===this.lastFocus)return this.nextFocus=!1,this.setLastFocus(e,t),e.focus(),!0}else{const t=this.lastFocus?.target;if(!0===s&&t instanceof HTMLElement&&e.contains(t))return this.nextFocus=!1,t.focus(),!0}return!1}renderText(e){return"string"==typeof e?e:text.isMarkdown(e)?text.markdownToText(e.markdown):""}translateText(e){return"string"==typeof e||text.isMarkdown(e)?e:text.isStatus(e)?e.status:void 0}renderVisual(e){return presenter.render(e,t=>{t&&e.props.name&&(this.domContainers[e.props.name]=t)})||presenter.renderNone(e)}qualifyDefault(e){const t=sortAndFilter(this.form.elements);for(const s in t){const i=t[s];if(null!=i&&!1!==i.visible&&i.enabled){if(i.default)return e.value=i.value,s;const t=sortAndFilter(i.items);if(null!=t)for(const i in t){const n=t[i];if(null!=n&&n.visible&&n.enabled&&n.default)return e.item=i,e.value=n.value,s}}}}qualify(e,t){if(null==t&&(t={}),"clicked"===e&&void 0===t.name&&(t.name=this.qualifyDefault(t)),t.type=e,void 0===t.routingKey){const s=t.name;t.routingKey=void 0!==s?e+"$"+s:e}return t}post(e,t){t=this.publish(e,t);const s=this.container;void 0!==s&&s.dispatchEvent(createEvent(eventName,t))}subscribe(e){let t=e;const s=this.container;if(void 0===s)return createSubscription();const i=function(){t=void 0,s.removeEventListener(eventName,n)},n=function(e){const s=e.detail;void 0!==s?Bluebird.resolve().then(function(){"function"==typeof t&&t(s)}):i()};return s.addEventListener(eventName,n),createSubscription(i)}refresh(e){if(!this.custom)if("string"==typeof e){const t=this.refs[e];presenter.refresh(t)}else this.refs={},presenter.refreshForm(this,this.container)}invalidate(e){const t=this.nextRefresh;"string"==typeof e&&!0!==t&&(!1===t?this.nextRefresh={[e]:!0}:t[e]=!0),void 0!==e&&!0!==e||(this.nextRefresh=!0),!1===e&&!1===t&&(this.nextRefresh={})}update(){const e=this.nextRefresh;if(!0===e&&(this.nextRefresh=!1,this.refresh()),"object"==typeof e){this.nextRefresh=!1;for(const t in e)!0===e[t]&&this.refresh(t)}}idle(){const e=this.timerHandle;void 0!==e&&(this.timerHandle=void 0,e())}busy(){if(void 0===this.timerHandle&&void 0!==this.container){let e=setTimeout(()=>this.spin());this.timerHandle=function(){void 0!==e&&(clearTimeout(e),e=void 0)}}}publish(e,t){return this.enabled?(t=this.enqueue(e,t),this.eventQueue.length>0&&this.spin(),t):this.qualify(e,t)}enqueue(e,t){return t=this.qualify(e,t),void 0!==this.eventTask?(this.resolveEvent(t),this.eventTask=void 0,t):(this.eventQueue.push(t),t)}dequeue(){const e=this.eventQueue;if(e.length>0){let t=this.eventIndex;const s=e[t++];return t>=e.length?e.length=this.eventIndex=0:this.eventIndex=t,s}}observe(){return Bluebird.attempt(()=>{if(void 0!==this.eventTask)return this.eventTask;const e=this.dequeue();return void 0!==e?e:this.show()?(this.eventTask=new Task(e=>{this.resolveEvent=e}),this.eventTask):void 0})}load(e,t){if(void 0===this.container)return!1;if(this.eventQueue.length=this.eventIndex=0,this.eventTask=void 0,this.errors={},this.lastFocus=void 0,this.nextFocus=!0,this.nextRefresh=!0,this.enqueue("load"),this.enqueue("prepare"),null!=e){let s={defaults:{},elements:{}};s=overlay(e,s),this.form=overlay(t,s);for(const e in this.form.elements){const t={showFilter:!1,checked:!1,enabled:!0,hoisted:!1,visible:!0,overlay:!1,default:!1,validates:!1,readOnly:!1,require:!1,autoActivate:!1};let s=this.form.elements[e];if(s=overlay(s,t),s.items)for(const e in s.items){const t={enabled:!0,checked:!1,visible:!0,default:!1,validates:!1};s.items[e]=overlay(s.items[e],t)}this.form.elements[e]=s}}return!0}route(e){switch(e.type){case"changed":return this.cascade(e.name);case"checked":return this.changed(e);case"clicked":return this.click(e);case"prepare":return this.hydrate(e);case"suggest":return this.suggest(e);case"validate":return this.verify(e);case"verify":return this.submit(e)}return!1}changed(e){return this.enqueue("changed",{name:e.name,item:e.item,value:e.value}),!0}isElementValid(e,t=!0,s={status:void 0}){return null!=e&&(s.status=void 0,text.isInvalidError(e.error)?(s.status="invalid",!1):!0!==e.require||(this.isElementEffectivelyVisible(e)?!!this.isElementValueDefined(e)||(s.status="missing",!1):t))}isElementEffectivelyVisible(e){if(null==e)return!1;const t=this.getParentSection(e);return!1!==t?.visible&&!1!==e.visible}isElementValueDefined(e){if(null==e)return!1;if(e.type===FormElementTypes.CHECKBOX)return!0;const t=e.current;if(null!=t)return!0;const s=e.value;if(null!=s&&""!==s)return!0;const i=e.items;if(null!=i)for(const e in i){const t=i[e];if(null!=t&&!0===t.checked)return!0}return!1}trap(e){switch(e.type){case"populate":case"load":case"suggest":break;default:return!1}const t=e.name,s=this.find(t);if(null==s)return!1;const i=s.dependsOn;if("string"!=typeof i)return!1;const n=this.find(i);return s.enabled=this.isElementEffectivelyVisible(n)&&this.isElementValueDefined(n),this.invalidate(t),!s.enabled}cascade(e){const t=this.find(e);if(null==t||!1===t.dependsOn)return!1;const s={[e]:!0},i=sortAndFilter(this.form.elements);for(const t in i){const n=i[t],r=n.dependsOn;if("string"==typeof r){const i=this.find(r);void 0!==i&&"string"!=typeof i.dependsOn&&(i.dependsOn=!0),!0===s[r]&&(s[t]=!0,n.checked=!1,n.current=void 0,n.label=void 0,n.items=void 0,n.value=void 0,this.invalidate(t),n.dependsOn===e&&this.enqueue("populate",{name:t}))}else n.dependsOn=!1}return!0}click(e){const t=this.form.elements[e.name];return null!=t&&t.type==FormElementTypes.BUTTONBAR&&this.validate(e)}hasInitialSelectionToDependOn(e){const t=this.form.elements[e];return t.type===FormElementTypes.DROPDOWNLIST&&(void 0!==t.current&&null!==t.current)}hydrate(e){const t=sortAndFilter(this.form.elements);for(const e in t){const t=this.form.elements[e].dependsOn;("string"!=typeof t||this.hasInitialSelectionToDependOn(t))&&this.enqueue("populate",{name:e}),this.enqueue("load",{name:e})}return!0}shouldTriggerValidation(e){const t=this.find(e.name);if(null!=t&&"string"==typeof e.value){const s=e.item;if("string"==typeof s){const e=t.items;if(null!=e){const t=e[s];if(null!=t)return!0===t.validates}return}return!0===t.validates}}validate(e){const t=this.shouldTriggerValidation(e);if(!0===t){const t=this.errors={},s=sortAndFilter(this.form.elements);for(const e in s){const i=s[e];null!=i&&(t[e]=void 0,this.enqueue("validate",{name:e}))}return this.enqueue("verify",{name:e.name,item:e.item,value:e.value,routingKey:"verify"}),!0}return!1===t&&(this.enqueue("end",{name:e.name,item:e.item,value:e.value,routingKey:"end"}),!0)}verify(e){const t=e.name,s=this.form.elements[t],i={status:void 0},n=this.isElementValid(s,!0,i);return t===this.lastFocus?.name&&(this.lastFocus.isInvalid=!n),!n&&(i.status&&(this.errors[t]={status:i.status}),!1===this.nextFocus&&t!==this.lastFocus?.name&&this.isElementPositionBeforeLastFocused(t,!0)&&this.focus(t),!0)}suggest(e){const t=this.form.elements[e.name];return null!=t&&(t.items={message:{label:{status:"trivial"},enabled:!1}},this.invalidate(e.name),!0)}submit(e){if(!this.hasErrors()){for(const e in this.form.elements)this.form.elements[e].error=void 0;return this.enqueue("submit",{name:e.name,item:e.item,value:e.value}),!0}const t=this.errors;for(const e in t){const s=this.form.elements[e];null!=s&&(s.error=t[e],this.invalidate(e))}const s=this.getInvalidElements(),i=[];let n=!1;for(const e of s){const t=this.getParentSection(e);if(isMutuallyExclusiveSection(t)){const e=this.findName(t),s=this.getMutuallyExclusiveSectionGroup(e);if(s){const e=i.find(e=>e.group===s);e?e.element.rowNumber>t.rowNumber&&(e.element=t):(i.push({group:s,element:t}),n=!0)}}else this.isSectionCollapsed(t)&&(t.collapsed=!1,n=!0)}for(const e of i)e.group.expandedSection=e.element;return n&&this.invalidate(),this.errors={},!1}hasErrors(){const e=this.errors;for(const t in e){const s=e[t];if(null!=s)return!0}return!1}find(e){if(null!=e)return"object"==typeof e&&(e=e.name),"string"==typeof e?this.form.elements[e]:void 0}findName(e){for(const t in this.form.elements)if(this.form.elements[t]===e)return t}coerceNumber(e,t){return t=t||this.deriveLocale(),new NumberParser(t).parse(e)}formatNumber(e,t){return t||(t={locale:this.deriveLocale()}),format(t,e)}renderState(e,t,s){return!1}getParentSection(e){const t=e.section;if(!t)return;const s="string"==typeof t?t:t.name;return this.form.elements[s]}isSectionCollapsed(e){return!(!e||e.type!==FormElementTypes.SECTION||!isCollapsibleSection(e)&&!isMutuallyExclusiveSection(e))&&!0===e.collapsed}isElementPositionBeforeLastFocused(e,t=!1){const s=this.lastFocus;if(!s)return!0;if(t&&!s.isInvalid)return!0;if("footer"===e)return!1;if("footer"===s.name)return!0;if(e&&void 0!==s.rowNumber&&void 0!==s.rowIndex){const t=this.form.elements?.[e];if(t)return void 0!==t.rowNumber&&void 0!==t.rowIndex?t.rowNumber<s.rowNumber||t.rowNumber===s.rowNumber&&t.rowIndex<s.rowIndex:t.index<s.rowNumber||t.index===s.rowNumber&&s.rowIndex>0}return!1}setLastFocus(e,t,s){if(this.lastFocus={target:e},!t)return;this.lastFocus.name=t;const i=this.form.elements?.[t];i&&(void 0!==i.rowNumber&&void 0!==i.rowIndex?(this.lastFocus.rowNumber=i.rowNumber,this.lastFocus.rowIndex=i.rowIndex):(this.lastFocus.rowNumber=i.index,this.lastFocus.rowIndex=0),this.lastFocus.isInvalid=s??!!i.error)}getAllSectionElements(){const e={};for(const t in this.form.elements){const s=this.form.elements[t];isSection(s)&&(e[t]=s)}return e}getMutuallyExclusiveSectionGroup(e){let t=this.mutuallyExclusiveSections[e];if(!t){const s=this.find(e);if(!s||!isMutuallyExclusiveSection(s))return;t=new MutuallyExclusiveSectionGroup({elementName:e,element:s});const i=s.format,n=this.getAllSectionElements(),r=Object.keys(sortAndFilter(n,e=>e.rowNumber)),o=r.indexOf(e);for(let e=o-1;e>=0;e--){const s=r[e],n=this.find(s);if(n.format!==i)break;t.unshift({elementName:s,element:n})}for(let e=o+1;e<r.length;e++){const s=r[e],n=this.find(s);if(n.format!==i)break;t.push({elementName:s,element:n})}t.forEach(e=>{this.mutuallyExclusiveSections[e.elementName]=t})}return t}updateMutuallyExclusiveSections(e){this.getMutuallyExclusiveSectionGroup(e).forEach(t=>{t.element.collapsed=t.elementName!==e}),this.refresh()}enforceMutuallyExclusiveConstraints(){const e=Object.keys(this.form.elements).map(e=>({elementName:e,element:this.form.elements[e]})).filter(e=>isMutuallyExclusiveSection(e.element)&&!1!==e.element.visible&&!0!==e.element.collapsed).sort((e,t)=>e.element.rowNumber-t.element.rowNumber),t=[];for(const s of e){const e=this.getMutuallyExclusiveSectionGroup(s.elementName);-1===t.indexOf(e)?t.push(e):s.element.collapsed=!0}}async displayDialog(e,t){await Promise.resolve()}}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This implementation is intended to replace @arcgis/core/Color which we don't use elsewhere in Designer.
|
|
3
|
+
*/
|
|
4
|
+
export default class WorkflowColor {
|
|
5
|
+
private values;
|
|
6
|
+
get r(): number;
|
|
7
|
+
get g(): number;
|
|
8
|
+
get b(): number;
|
|
9
|
+
get a(): number;
|
|
10
|
+
constructor(value: number[] | string);
|
|
11
|
+
clone(): WorkflowColor;
|
|
12
|
+
equals(other: WorkflowColor): boolean;
|
|
13
|
+
toCss(): string;
|
|
14
|
+
toJSON(): number[];
|
|
15
|
+
toString(): string;
|
|
16
|
+
static fromJSON(value: number[]): WorkflowColor;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import rgba from"color-rgba";export default class WorkflowColor{get r(){return this.values[0]}get g(){return this.values[1]}get b(){return this.values[2]}get a(){return this.values[3]}constructor(t){if(this.values=[0,0,0,1],"string"==typeof t){if(this.values=rgba(t),0===this.values.length)throw new Error("Invalid rgb value: "+t)}else this.values=[...t]}clone(){return new WorkflowColor(this.values)}equals(t){const{r:r,g:s,b:e,a:i}=t;return this.r===r&&this.g===s&&this.b===e&&this.a===i}toCss(){return 1===this.a?`rgb(${this.r},${this.g},${this.b})`:`rgba(${this.r},${this.g},${this.b},${this.a})`}toJSON(){return[...this.values]}toString(){return`rgba(${this.r},${this.g},${this.b},${this.a})`}static fromJSON(t){if(4!==t.length)throw new Error("Invalid JSON. The array must contain four values.");return new WorkflowColor(t)}}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import WorkflowColor from "./WorkflowColor";
|
|
2
|
+
/**
|
|
3
|
+
* Darkens the color by an amount and returns the new color.
|
|
4
|
+
*
|
|
5
|
+
* @param amount Ranges from 0..1.
|
|
6
|
+
* @param color The color to darken.
|
|
7
|
+
*/
|
|
8
|
+
export declare function darken(amount: number, color: WorkflowColor): WorkflowColor;
|
|
9
|
+
/**
|
|
10
|
+
* Lightens the color by an amount and returns the new color.
|
|
11
|
+
*
|
|
12
|
+
* @param amount Ranges from 0..1.
|
|
13
|
+
* @param color The color to lighten.
|
|
14
|
+
*/
|
|
15
|
+
export declare function lighten(amount: number, color: WorkflowColor): WorkflowColor;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import WorkflowColor from"./WorkflowColor.js";export function darken(o,r){const a=colorToHsv(r);return a.v=a.v*(1-clamp(o,0,1)),hsvToColor(a)}export function lighten(o,r){const a=clamp(o,0,1),t=colorToHsv(r);return t.v=t.v+(1-t.v)*a,t.s=t.s*(1-a),hsvToColor(t)}function clamp(o,r,a){return Math.min(Math.max(o,r),a)}function hsvToRgb(o){let r=0,a=0,t=0;const n=o.s*o.v,c=6*o.h,e=n*(1-Math.abs(c%2-1)),s=o.v-n;switch(Math.floor(c)%6){case 0:r=n+s,a=e+s,t=s;break;case 1:r=e+s,a=n+s,t=s;break;case 2:r=s,a=n+s,t=e+s;break;case 3:r=s,a=e+s,t=n+s;break;case 4:r=e+s,a=s,t=n+s;break;case 5:r=n+s,a=s,t=e+s}return{r:r,g:a,b:t,a:o.a}}function hsvToColor(o){const r=hsvToRgb(o);return r.r=Math.round(255*r.r),r.g=Math.round(255*r.g),r.b=Math.round(255*r.b),r.a=r.a||1,new WorkflowColor(`rgba(${r.r},${r.g},${r.b},${r.a})`)}function colorToHsv(o){return decimalRgbToHsv(colorToDecimalRgb(o))}function colorToDecimalRgb(o){return[o.r/255,o.g/255,o.b/255,o.a]}function decimalRgbToHsv(o){let r;const a=Math.max(o[0],o[1],o[2]),t=a-Math.min(o[0],o[1],o[2]);let n;n=0===t?0:a===o[0]?(o[1]-o[2])/t:a===o[1]?2+(o[2]-o[0])/t:4+(o[0]-o[1])/t,r=n/6,r<0&&(r+=1);return{h:r,s:0===t?0:t/a,v:a,a:o.length>3?o[3]:1}}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import WorkflowColor from "./WorkflowColor";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a colour palette from a provided accent color.
|
|
4
|
+
*
|
|
5
|
+
* @param accentColor The accent colour to be used in the palette.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createPalette(accentColor: WorkflowColor): {
|
|
8
|
+
accentIconForeground: WorkflowColor;
|
|
9
|
+
buttonBackgroundDisabled: WorkflowColor;
|
|
10
|
+
buttonBorderDisabled: WorkflowColor;
|
|
11
|
+
buttonBorderHover: WorkflowColor;
|
|
12
|
+
buttonForegroundDisabled: WorkflowColor;
|
|
13
|
+
buttonIcon: WorkflowColor;
|
|
14
|
+
buttonIconDisabled: WorkflowColor;
|
|
15
|
+
buttonIconHover: WorkflowColor;
|
|
16
|
+
emphasizedButtonBackgroundDisabled: WorkflowColor;
|
|
17
|
+
emphasizedButtonBorderDisabled: WorkflowColor;
|
|
18
|
+
emphasizedButtonBorderHover: WorkflowColor;
|
|
19
|
+
emphasizedButtonForegroundDisabled: WorkflowColor;
|
|
20
|
+
primaryBackground: WorkflowColor;
|
|
21
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import WorkflowColor from"./WorkflowColor.js";import{darken,lighten}from"./colors.js";const graySteps=generateSteps(new WorkflowColor("#323232")),white=new WorkflowColor("#ffffff");export function createPalette(e){const o=generateSteps(e);return{accentIconForeground:o[500],buttonBackgroundDisabled:graySteps[100],buttonBorderDisabled:graySteps[300],buttonBorderHover:white,buttonForegroundDisabled:graySteps[400],buttonIcon:o[500],buttonIconDisabled:graySteps[400],buttonIconHover:white,emphasizedButtonBackgroundDisabled:o[100],emphasizedButtonBorderDisabled:o[100],emphasizedButtonBorderHover:o[500],emphasizedButtonForegroundDisabled:o[700],primaryBackground:white}}function generateSteps(e){const o=.18;return{50:lighten(5*o,e),100:lighten(.72,e),200:lighten(.54,e),300:lighten(.36,e),400:lighten(o,e),500:e,600:darken(.126,e),700:darken(.252,e),800:darken(.378,e),900:darken(.504,e)}}
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../FormHost";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Auto Complete" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const AutoComplete:
|
|
7
|
+
declare const AutoComplete: React.ForwardRefExoticComponent<FormElementProps<defs.Value | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default AutoComplete;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import BaseAutoComplete,{autocompleteClasses,HighlightOption}from"@vertigis/react-ui/Autocomplete";import FormLabelTextField from"@vertigis/react-ui/FormLabelTextField";import Popper from"@vertigis/react-ui/Popper";import Skeleton from"@vertigis/react-ui/Skeleton";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import{useContext,useEffect,useMemo,useRef,useState}from"react";import*as React from"react";import{ExclusiveTimer}from"../ExclusiveTimer.js";import{autoCompletePropertyConstraints}from"../elements/AutoComplete.js";import HostContext from"../hostContext.js";import{getKeyString}from"../keyboard.js";import{getItemId,inspectItems,makeSafeClassName}from"../utils.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const StyledAutoComplete=styled(BaseAutoComplete)(()=>({[`.${autocompleteClasses.endAdornment}`]:{right:1}})),popperClasses={skeletonOption:"skeleton-option"},StyledPopper=styled(Popper)(()=>({[`.${autocompleteClasses.listbox}`]:{[`.${autocompleteClasses.option}`]:{display:"block",[`&.${popperClasses.skeletonOption}`]:{'&[data-option-index="0"]':{span:{width:"70%"}},'&[data-option-index="1"]':{span:{width:"85%"}},'&[data-option-index="2"]':{span:{width:"55%"}}}}}})),StyledSkeleton=styled(Skeleton)(()=>({fontSize:"1.25rem",lineHeight:"inherit"})),pendingOption={enabled:!1,label:""},pendingOptions=[pendingOption,pendingOption,pendingOption],AutoComplete=({className:e,component:t,current:o,delay:
|
|
1
|
+
import BaseAutoComplete,{autocompleteClasses,HighlightOption}from"@vertigis/react-ui/Autocomplete";import FormLabelTextField from"@vertigis/react-ui/FormLabelTextField";import Popper from"@vertigis/react-ui/Popper";import Skeleton from"@vertigis/react-ui/Skeleton";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import{forwardRef,useContext,useEffect,useMemo,useRef,useState}from"react";import*as React from"react";import{ExclusiveTimer}from"../ExclusiveTimer.js";import{autoCompletePropertyConstraints}from"../elements/AutoComplete.js";import HostContext from"../hostContext.js";import{getKeyString}from"../keyboard.js";import{getItemId,inspectItems,makeSafeClassName}from"../utils.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const StyledAutoComplete=styled(BaseAutoComplete)(()=>({[`.${autocompleteClasses.endAdornment}`]:{right:1}})),popperClasses={skeletonOption:"skeleton-option"},StyledPopper=styled(Popper)(()=>({[`.${autocompleteClasses.listbox}`]:{[`.${autocompleteClasses.option}`]:{display:"block",[`&.${popperClasses.skeletonOption}`]:{'&[data-option-index="0"]':{span:{width:"70%"}},'&[data-option-index="1"]':{span:{width:"85%"}},'&[data-option-index="2"]':{span:{width:"55%"}}}}}})),StyledSkeleton=styled(Skeleton)(()=>({fontSize:"1.25rem",lineHeight:"inherit"})),pendingOption={enabled:!1,label:""},pendingOptions=[pendingOption,pendingOption,pendingOption],AutoComplete=forwardRef(({className:e,component:t,current:o,delay:r,element:n,enabled:l,error:s,items:a,label:i,minLength:p,name:u,prompt:m,tooltip:c,raiseEvent:d,setProperty:f,setValue:x,value:g},C)=>{const y=useContext(HostContext),[v,T]=useState(),[b,h]=useState(""),[O,S]=useState([]),[E,k]=useState(null),P=useRef(!1),R=useRef(),I=useRef(!1),N=useFocusCallback(l,u,y),F=useRef({}),w=useRef({}),A=useMemo(()=>{let e=r;return("number"!=typeof e||isNaN(e))&&(e=autoCompletePropertyConstraints.delay.default),Math.max(e,autoCompletePropertyConstraints.delay.minimum)},[r]),L=useMemo(()=>{let e=p;return("number"!=typeof e||isNaN(e))&&(e=autoCompletePropertyConstraints.minLength.default),Math.max(e,autoCompletePropertyConstraints.minLength.minimum)},[p]),{clearText:j,closeText:M,noOptionsText:H,openText:B,placeholder:K,title:$}=useMemo(()=>({clearText:y.renderText("@common-clear"),closeText:y.renderText("@common-close"),noOptionsText:y.renderText({status:"trivial"}),openText:y.renderText("@common-open"),placeholder:y.renderText(m),title:y.renderText(c)}),[y,m,c]),V=t.timer||(t.timer=new ExclusiveTimer),D=()=>{d("suggest",g,b,void 0,V.cancellationToken),S(pendingOptions)},z=()=>{f("items",{}),f("label",void 0)};useEffect(()=>{"clear"===v?z():"input"===v&&(i&&f("label",void 0),P.current=!0,b.length>=L?(f("current",void 0),V.reset(),V.start(A,D)):Object.keys(a||{}).length>0&&z())},[v,b]),useEffect(()=>{const e=E?.value;if(g!==e){const t=getItemId(E,F.current),o=t?w.current[t]:void 0;f("current",t),f("label",o),x(e,{argument:o})}},[E]),useEffect(()=>{const{current:e,items:t,label:r,value:n}=inspectItems(o,a,g);f("current",e),f("label",r||i),f("value",n,!1);const l={};let s=null;const p=[];for(const o in t){const r=t[o];p.push(r);const n=y.renderText(r.label).trim();l[o]=n,e&&o===e&&(s=r)}w.current=l,F.current=t,S(p),k(s)},[a]),useEffect(()=>{const e="string"==typeof o?o:void 0,t=e?F.current[e]:void 0,r=e?w.current[e]:void 0;t?(f("label",r),f("value",t.value),h(r||"")):(f("value",void 0),P.current||h("")),k(t||null)},[o]),useEffect(()=>{P.current||I.current||h(""),P.current=!1,I.current=!1},[i]);const W=y.renderText(i);return React.createElement(FormElement,{className:e,element:n,inputId:R.current,name:u,ref:C},e=>React.createElement(StyledAutoComplete,{autoSelect:!0,clearOnBlur:!1,clearOnEscape:!0,clearText:j,closeText:M,disabled:!l,filterOptions:e=>e,getOptionDisabled:e=>!1===e.enabled,getOptionKey:e=>getItemId(e,F.current)||"",getOptionLabel:e=>{const t=getItemId(e,F.current);return t?w.current[t]:""},inputValue:b,noOptionsText:H,onBlur:()=>{1===O.length&&b.toLowerCase()===w.current[0]?.toLowerCase()?(h(w.current[0]),k(O[0])):f("label",b)},onChange:(e,t)=>{I.current=!0,k(t)},onInputChange:(e,t,o)=>{h(t),T(o)},onKeyDown:e=>{"enter"===getKeyString(e)&&e.stopPropagation()},openText:B,options:O,renderOption:(e,t,{inputValue:o})=>{if(t===pendingOption){const t=clsx(e.className,popperClasses.skeletonOption);return React.createElement("li",{...e,className:t,key:e.id},React.createElement(StyledSkeleton,null))}const r=getItemId(t,F.current),n={...e,className:clsx(e.className,t.styleName?makeSafeClassName(t.styleName):void 0),title:t.tooltip?y.renderText(t.tooltip):void 0,inputText:o,optionText:r?w.current[r]:""};return React.createElement(HighlightOption,{...n})},renderInput:t=>(t.inputProps={...t.inputProps,...e,value:t.inputProps.value||W,placeholder:K,title:$},R.current=t.id,React.createElement(FormLabelTextField,{error:!!s,...t,fullWidth:!0,inputRef:N})),slotProps:{popper:{component:StyledPopper}},value:E}))});export default AutoComplete;
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import type { Item } from "../FormDefinition";
|
|
3
3
|
import type { ButtonProps as MuiButtonProps } from "@vertigis/react-ui/Button";
|
|
4
|
+
export declare const buttonClasses: {
|
|
5
|
+
iconOnly: string;
|
|
6
|
+
iconStacked: string;
|
|
7
|
+
styleRounded: string;
|
|
8
|
+
border: string;
|
|
9
|
+
noBorder: string;
|
|
10
|
+
};
|
|
4
11
|
interface ButtonProps extends MuiButtonProps {
|
|
5
12
|
item: Item;
|
|
6
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Button from"@vertigis/react-ui/Button";import
|
|
1
|
+
import Button from"@vertigis/react-ui/Button";import{NoIcon}from"@vertigis/react-ui/icons";import{styled,useTheme}from"@vertigis/react-ui/styles";import clsx from"clsx";import*as React from"react";import{forwardRef,Children,useMemo,Suspense,lazy}from"react";import WorkflowColor from"../branding/WorkflowColor.js";import{createPalette}from"../branding/createPalette.js";import{getBorderStyle,getEmphasis,getIconPosition,getItemColors,getItemSize,getShowBorder}from"../utils.js";function emphasisToButtonProps(e,o){switch(o&&(e="high"),e){case"low":return{variant:"text",color:"inherit"};case"custom":case"medium":return{variant:"outlined",color:"inherit"};case"high":return{variant:"contained",color:"primary"};default:throw new Error(`Invalid value "${e}" for Emphasis.`)}}function generateButtonOverrides(e,o){const t=e=>Object.fromEntries(Object.entries(e).map(([e,o])=>[e,o.toCss()])),r=e&&t(createPalette(e)),n=o&&t(createPalette(o)),{accentIconForeground:s,buttonForegroundDisabled:a,buttonIcon:i,buttonIconDisabled:d,buttonIconHover:u,buttonBorderDisabled:l,buttonBorderHover:c,emphasizedButtonBackgroundDisabled:m}=r??{},{buttonBackgroundDisabled:b,emphasizedButtonBorderDisabled:g,emphasizedButtonBorderHover:B,emphasizedButtonForegroundDisabled:p,primaryBackground:h}=n??{};return{accentIconForeground:s,buttonBackground:o?.toCss(),buttonBackgroundDisabled:b,buttonBackgroundHover:e?.toCss(),buttonBorder:e?.toCss(),buttonBorderDisabled:l,buttonBorderHover:c,buttonForeground:e?.toCss(),buttonForegroundDisabled:a,buttonForegroundHover:o?.toCss(),buttonIcon:i,buttonIconDisabled:d,buttonIconHover:u,emphasizedButtonBackground:e?.toCss(),emphasizedButtonBackgroundDisabled:m,emphasizedButtonBackgroundHover:o?.toCss(),emphasizedButtonBorder:o?.toCss(),emphasizedButtonBorderDisabled:g,emphasizedButtonBorderHover:B,emphasizedButtonForeground:o?.toCss(),emphasizedButtonForegroundDisabled:p,emphasizedButtonForegroundHover:e?.toCss(),primaryBackground:h}}const PREFIX="WorkflowButton";export const buttonClasses={iconOnly:`${PREFIX}-icon-only`,iconStacked:`${PREFIX}-icon-stacked`,styleRounded:`${PREFIX}-rounded`,border:`${PREFIX}-border`,noBorder:`${PREFIX}-noBorder`};export default forwardRef(({children:e,className:o,disabled:t,item:r,onClick:n,title:s},a)=>{const i=useTheme(),d=r.appearance??{},{backgroundColor:u,foregroundColor:l}=getItemColors(d,i),c=useMemo(()=>{const e=u||l?generateButtonOverrides(l?new WorkflowColor(l):void 0,u?new WorkflowColor(u):void 0):void 0,o=e?Object.fromEntries(Object.keys(e).map(o=>e[o]&&[[`--${o}`],e[o]]).filter(e=>!!e)):{};return styled(Button)({[`&.${buttonClasses.iconOnly}`]:{minWidth:"auto",padding:8,lineHeight:0,"&.MuiButton-sizeSmall":{padding:6},"&.MuiButton-sizeLarge":{padding:10},"& .MuiButton-startIcon":{margin:0},"& .MuiButton-endIcon":{margin:0}},[`&.${buttonClasses.iconStacked}`]:{flexDirection:"column","& .MuiButton-startIcon":{marginTop:6,marginRight:0,marginLeft:0},"& .MuiButton-endIcon":{marginBottom:6,marginRight:0,marginLeft:0}},[`&.${buttonClasses.styleRounded}`]:{borderRadius:"1000px"},[`&.${buttonClasses.noBorder}`]:{border:0,outline:0},[`&.${buttonClasses.border}`]:{border:1,borderStyle:"solid"},[`&.${buttonClasses.border}:hover`]:{border:1,borderStyle:"solid",borderColor:"transparent"},...o})},[u,l]),{icon:m}=d,b=getIconPosition(d.iconPosition),g=useMemo(()=>{let e;return m&&(e=lazy(()=>import("@vertigis/react-ui/icons").then(e=>Promise.resolve({default:e[m]??NoIcon})))),e},[m]);let B,p;if(g){const e=React.createElement(Suspense,{fallback:m},React.createElement(g,null));switch(b){case"above":case"before":B=e;break;case"below":case"after":p=e}}const h=getEmphasis(d.emphasis),f=getShowBorder(h,d.showBorder),C=getItemSize(d.size),I=getBorderStyle(d.borderStyle),v=(B??p)&&0===Children.toArray(e).length,k=clsx({classNameProp:o,[buttonClasses.iconOnly]:v,[buttonClasses.iconStacked]:!v&&("above"===b||"below"===b),[buttonClasses.styleRounded]:"rounded"===I,[buttonClasses.border]:f,[buttonClasses.noBorder]:!f});return React.createElement(c,{className:k,disabled:t,endIcon:p,onClick:n,ref:a,size:C,startIcon:B,title:s,...emphasisToButtonProps(h,r.default)},e)});
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../FormHost";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Button Bar" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const ButtonBar:
|
|
7
|
+
declare const ButtonBar: React.ForwardRefExoticComponent<FormElementProps<defs.Value | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default ButtonBar;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Stack,{stackClasses}from"@vertigis/react-ui/Stack";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useContext}from"react";import{Orientation}from"../constants.js";import HostContext from"../hostContext.js";import{makeSafeClassName,sortAndFilter}from"../utils.js";import Button from"./Button.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${stackClasses.root}`]:{alignItems:"flex-start",flexWrap:"wrap",marginTop:e(1),marginBottom:e(1)}})),ButtonBar=({className:e,element:t,enabled:o,items:
|
|
1
|
+
import Stack,{stackClasses}from"@vertigis/react-ui/Stack";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{forwardRef,useContext}from"react";import{Orientation}from"../constants.js";import HostContext from"../hostContext.js";import{makeSafeClassName,sortAndFilter}from"../utils.js";import Button from"./Button.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${stackClasses.root}`]:{alignItems:"flex-start",flexWrap:"wrap",marginTop:e(1),marginBottom:e(1)}})),ButtonBar=forwardRef(({className:e,element:t,enabled:o,items:r,name:a,orientation:n,raiseEvent:s},m)=>{const l=useContext(HostContext),i=sortAndFilter(r),c=useFocusCallback(o,a,l),d=o?Object.entries(i).filter(e=>!1!==e[1].enabled&&!1!==e[1].visible)[0]:void 0,f=d?d[0]:void 0,u=(e,t)=>function(){s("clicked",t,void 0,e)};return React.createElement(StyledFormElement,{className:e,component:"fieldset",element:t,name:a,ref:m},React.createElement(Stack,{direction:n===Orientation.VERTICAL?"column":"row",spacing:1},Object.keys(i).map(e=>{const t=i[e],r=!1!==t.visible;if(!r)return null;const a=t.styleName?makeSafeClassName(t.styleName):void 0,n=o&&!1!==t.enabled&&r,s=l.renderText(t.tooltip),{value:m}=i[e],d=t.label?React.createElement(Markdown,{inline:!0,text:t.label||""}):null;return React.createElement(Button,{className:a,disabled:!n,item:t,key:e,onClick:u(e,m),ref:f&&e===f?c:void 0,title:s},d)})))});export default ButtonBar;
|
|
@@ -3,5 +3,5 @@ import type { FormElementProps } from "../..";
|
|
|
3
3
|
/**
|
|
4
4
|
* The component for the "Check Box" Form Element.
|
|
5
5
|
*/
|
|
6
|
-
declare const CheckBox:
|
|
6
|
+
declare const CheckBox: React.ForwardRefExoticComponent<FormElementProps<undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
7
7
|
export default CheckBox;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Checkbox from"@vertigis/react-ui/Checkbox";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import*as React from"react";import{useContext}from"react";import HostContext from"../hostContext.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const CheckBox=({checked:e,className:t,element:o,enabled:r,label:a,name:c,raiseEvent:m,setProperty:n,tooltip:l,value:s})=>{const
|
|
1
|
+
import Checkbox from"@vertigis/react-ui/Checkbox";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import*as React from"react";import{forwardRef,useContext}from"react";import HostContext from"../hostContext.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const CheckBox=forwardRef(({checked:e,className:t,element:o,enabled:r,label:a,name:c,raiseEvent:m,setProperty:n,tooltip:l,value:s},i)=>{const d=useContext(HostContext),C=d.renderText(l),f=useFocusCallback(r,c,d),k=e=>{const t=e.target.checked;n("checked",t),m("changed",t?s:void 0,t)};return React.createElement(FormElement,{className:t,element:o,name:c,ref:i},t=>React.createElement(FormControlLabel,{control:React.createElement(Checkbox,{checked:e,onChange:k,slotProps:{input:{...t,ref:f}}}),disabled:!r,label:React.createElement(Markdown,{text:a}),title:C}))});export default CheckBox;
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../FormHost";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Check Group" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const CheckGroup:
|
|
7
|
+
declare const CheckGroup: React.ForwardRefExoticComponent<FormElementProps<defs.ItemsRef | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default CheckGroup;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Checkbox from"@vertigis/react-ui/Checkbox";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import FormGroup,{formGroupClasses}from"@vertigis/react-ui/FormGroup";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useContext,useEffect,useState}from"react";import{Orientation}from"../constants.js";import HostContext from"../hostContext.js";import{arrayEqual}from"../listUtilities.js";import{makeSafeClassName,inspectItems}from"../utils.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${formGroupClasses.root}`]:{paddingBottom:e(2)}})),CheckGroup=({className:e,current:t,element:o,enabled:r,items:s,name:
|
|
1
|
+
import Checkbox from"@vertigis/react-ui/Checkbox";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import FormGroup,{formGroupClasses}from"@vertigis/react-ui/FormGroup";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{forwardRef,useContext,useEffect,useState}from"react";import{Orientation}from"../constants.js";import HostContext from"../hostContext.js";import{arrayEqual}from"../listUtilities.js";import{makeSafeClassName,inspectItems}from"../utils.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${formGroupClasses.root}`]:{paddingBottom:e(2)}})),CheckGroup=forwardRef(({className:e,current:t,element:o,enabled:r,items:s,name:a,orientation:n,raiseEvent:m,setProperty:c,setValue:i,value:l},u)=>{const f=useContext(HostContext),[p,d]=useState([]),[h,C]=useState();useEffect(()=>{const{items:e}=inspectItems(t,s,l);C(e);const o=[],r=[];for(const t in e){const s=e[t];s.checked&&(o.push(t),r.push(s))}arrayEqual(p,o)||d(o);const a=0===r.length?void 0:{refValueType:"items",items:r};i(a,!1)},[s]),useEffect(()=>{const e=[];if(l)for(const t in s)l.items.includes(s[t])&&e.push(t);arrayEqual(p,e)||d(e)},[l]);const k=useFocusCallback(r,a,f);const E=(e,t)=>function(o){const r=h?h[e]:void 0;if(!r)return;const s=r.checked=o.currentTarget.checked;!function(){const e=[],t=[];for(const o in h){const r=h[o];r.checked&&(e.push(r),t.push(o))}const o=0===e.length?void 0:{refValueType:"items",items:e};i(o,!1),c("current",void 0),arrayEqual(t,p)||d(t)}(),m("changed",s?t:void 0,s,e)},y=[];for(const e in h){const t=h[e],o=-1!==p.indexOf(e),s=r&&!1!==t.enabled,a=f.renderText(t.tooltip),n=t.styleName?makeSafeClassName(t.styleName):void 0;y.push(React.createElement(FormControlLabel,{className:n,control:React.createElement(Checkbox,{checked:o,onChange:E(e,t.value),slotProps:{input:{ref:k}}}),disabled:!s,key:e,label:React.createElement(Markdown,{text:t.label}),title:a}))}return React.createElement(StyledFormElement,{className:e,component:"fieldset",element:o,name:a,ref:u},React.createElement(FormGroup,{row:n===Orientation.HORIZONTAL},y))});export default CheckGroup;
|
|
@@ -3,5 +3,5 @@ import type { FormElementProps } from "../..";
|
|
|
3
3
|
/**
|
|
4
4
|
* The component for the "Custom" Form Element.
|
|
5
5
|
*/
|
|
6
|
-
declare const Custom:
|
|
6
|
+
declare const Custom: React.ForwardRefExoticComponent<FormElementProps<undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
7
7
|
export default Custom;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as React from"react";import{createElement}from"react";import{getElementProps}from"../utils.js";import FormElement from"./FormElement.js";const Custom=({className:e,component:t,customType:m,element:o,name:n
|
|
1
|
+
import*as React from"react";import{createElement,forwardRef}from"react";import{getElementProps}from"../utils.js";import FormElement from"./FormElement.js";const Custom=forwardRef(({className:e,component:t,customType:m,element:o,name:r},n)=>{let a;return m&&t.elementRegistration&&(a=createElement(t.elementRegistration.component,getElementProps(t,o))),a||(console.warn(`Unable to render custom form element '${r}' of type '${m}'.`),a=`--- ${m} ---`),React.createElement(FormElement,{className:e,name:r,element:o,ref:n},a)});export default Custom;
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../FormHost";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Date Picker" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const DatePicker:
|
|
7
|
+
declare const DatePicker: React.ForwardRefExoticComponent<FormElementProps<defs.DateTimeRef | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default DatePicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import BaseDatePicker from"@vertigis/react-ui/DatePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import*as React from"react";import{useContext,useEffect,useMemo,useRef,useState}from"react";import{
|
|
1
|
+
import BaseDatePicker from"@vertigis/react-ui/DatePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import*as React from"react";import{forwardRef,useContext,useEffect,useMemo,useRef,useState}from"react";import{areValuesEqual,getDateBounds,getNewElementValue,makeProperValue}from"../dateUtilities.js";import HostContext from"../hostContext.js";import{getKeyString}from"../keyboard.js";import{isInvalidError}from"../textUtilities.js";import{isDateTimeRef,makeUniqueId}from"../utils.js";import DateTimeTextField from"./DateTimeTextField.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const DatePicker=forwardRef(({className:e,element:t,enabled:r,error:o,format:a,name:s,prompt:i,setProperty:n,setValue:l,tooltip:m,value:u},c)=>{const d=useContext(HostContext),[f,p]=useState(!1),[x,E]=useState(!1),[g,D]=useState(!1),[F,k]=useState(null),v=useRef(),R=useRef(!0),T=useFocusCallback(r,s,d),P=d.renderText(m),S={locale:d.deriveLocale(),timezone:(new Intl.DateTimeFormat).resolvedOptions().timeZone},w="date",C=isInvalidError(o),V=()=>{let e=F||void 0;if(e&&isDateTimeRef(u)){const t=new Date(u.value);e=new Date(e),e.setHours(t.getHours()),e.setMinutes(t.getMinutes()),e.setSeconds(t.getSeconds()),e.setMilliseconds(t.getMilliseconds())}const t=getNewElementValue(e,w,S);areValuesEqual(u,t)||l(t)};useEffect(()=>{const e=makeProperValue(u),t=getNewElementValue(e,w,S);areValuesEqual(u,t)||l(t,!1),k(e||null)},[u]),useEffect(()=>{if(!g&&!x)if(f)C||n("error",{status:"invalid"});else{if(C&&n("error",void 0),R.current)return void(R.current=!1);V()}R.current=!1},[f,x,g]);const{min:j,max:H}=getDateBounds(a),y=useMemo(()=>`${makeUniqueId(s)}-input`,[s]),I=d.renderText(i),M=e=>{"enter"!==getKeyString(e)||V()};return React.createElement(FormElement,{className:e,element:t,inputId:y,name:s,ref:c},e=>React.createElement(React.Fragment,null,C&&React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},v.current),React.createElement(BaseDatePicker,{disabled:!r,inputRef:e=>{T(e),e&&(v.current=e.dataset.formatString)},key:"date-picker",maxDate:H,minDate:j,onChange:e=>k(e),onClose:()=>D(!1),onError:e=>p(!!e),onOpen:()=>D(!0),slots:{textField:DateTimeTextField},slotProps:{textField:{error:!!o,id:y,inputProps:{...e,placeholder:I},onBlur:()=>E(!1),onFocus:()=>E(!0),onKeyDown:M,title:P}},value:F})))});export default DatePicker;
|
|
@@ -8,5 +8,5 @@ export declare const dateRangePickerClasses: {
|
|
|
8
8
|
/**
|
|
9
9
|
* The component for the "Date Range Picker" Form Element.
|
|
10
10
|
*/
|
|
11
|
-
declare const DateRangePicker:
|
|
11
|
+
declare const DateRangePicker: React.ForwardRefExoticComponent<FormElementProps<DateRangeRef | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
12
12
|
export default DateRangePicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import BaseDateRangePicker from"@vertigis/react-ui/DateRangePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import{useContext,useEffect,useMemo,useRef,useState}from"react";import*as React from"react";import{areValuesEqual,convertToDateRangeRef,getDateBounds}from"../dateUtilities.js";import HostContext from"../hostContext.js";import{isInvalidError}from"../textUtilities.js";import{makeUniqueId}from"../utils.js";import DateTimeTextField from"./DateTimeTextField.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const DateRangePickerField=e=>{const{FormHelperTextProps:t,InputProps:r,InputLabelProps:a,inputProps:o,SelectProps:s,...n}=e,l=n.slotProps??{};return delete n.slotProps,l.formHelperText={...t,...l.formHelperText},l.input={...r,...l.input},l.inputLabel={...a,...l.inputLabel},l.htmlInput={...o,...l.htmlInput},l.select={...s,...l.select},n.error=n.error||l.htmlInput["data-elementError"],delete l.htmlInput["data-elementError"],React.createElement(DateTimeTextField,{...n,slotProps:l})},PREFIX="DateRangePicker";export const dateRangePickerClasses={root:`${PREFIX}-root`,toLabel:`${PREFIX}-toLabel`};const StyledDateRangePicker=styled(BaseDateRangePicker)({alignItems:"center"}),StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${dateRangePickerClasses.toLabel}`]:{paddingTop:e(3)}})),DateRangePicker=({className:e,element:t,enabled:r,error:a,format:o,name:s,setProperty:n,setValue:l,tooltip:i,value:m})=>{const
|
|
1
|
+
import BaseDateRangePicker from"@vertigis/react-ui/DateRangePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import{forwardRef,useContext,useEffect,useMemo,useRef,useState}from"react";import*as React from"react";import{areValuesEqual,convertToDateRangeRef,getDateBounds}from"../dateUtilities.js";import HostContext from"../hostContext.js";import{isInvalidError}from"../textUtilities.js";import{makeUniqueId}from"../utils.js";import DateTimeTextField from"./DateTimeTextField.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const DateRangePickerField=e=>{const{FormHelperTextProps:t,InputProps:r,InputLabelProps:a,inputProps:o,SelectProps:s,...n}=e,l=n.slotProps??{};return delete n.slotProps,l.formHelperText={...t,...l.formHelperText},l.input={...r,...l.input},l.inputLabel={...a,...l.inputLabel},l.htmlInput={...o,...l.htmlInput},l.select={...s,...l.select},n.error=n.error||l.htmlInput["data-elementError"],delete l.htmlInput["data-elementError"],React.createElement(DateTimeTextField,{...n,slotProps:l})},PREFIX="DateRangePicker";export const dateRangePickerClasses={root:`${PREFIX}-root`,toLabel:`${PREFIX}-toLabel`};const StyledDateRangePicker=styled(BaseDateRangePicker)({alignItems:"center"}),StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${dateRangePickerClasses.toLabel}`]:{paddingTop:e(3)}})),DateRangePicker=forwardRef(({className:e,element:t,enabled:r,error:a,format:o,name:s,setProperty:n,setValue:l,tooltip:i,value:m},u)=>{const c=useContext(HostContext),[d,p]=useState([null,null]),[f,R]=useState(-1),[x,g]=useState([!1,!1]),[P,E]=useState(!1),[D,F]=useState([null,null]),k=useRef(),I=useRef(!0),T=isInvalidError(a);useEffect(()=>{const e=convertToDateRangeRef(m),t=[e?.startDate||null,e?.endDate||null],r=C(t);areValuesEqual(m,r)||l(r,!1),F(t)},[m]),useEffect(()=>{const e=0===f?x[0]:!!d[0],t=1===f?x[1]:!!d[1];g([e,t]);const r=e||t;if(r?T||n("error",{status:"invalid"}):T&&n("error",void 0),!P&&-1===f&&!r){if(I.current)return void(I.current=!1);const e=C(D);areValuesEqual(m,e)||l(e)}I.current=!1},[d,f,P]);const v=c.renderText(i),b=useFocusCallback(r,s,c),C=e=>{if(e[0]&&e[1])return{refValueType:"daterange",startDate:e[0],endDate:e[1]}},S=useMemo(()=>`${makeUniqueId(s)}-input`,[s]),y=x[0]||x[1],{min:h,max:H}=getDateBounds(o);return React.createElement(StyledFormElement,{className:clsx(e,dateRangePickerClasses.root),element:t,inputId:S,name:s,ref:u},y&&React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},k.current),React.createElement(StyledDateRangePicker,{disabled:!r,maxDate:H,minDate:h,onChange:e=>F(e),onClose:()=>E(!1),onError:e=>p(e),onOpen:()=>E(!0),slots:{textField:DateRangePickerField},slotProps:{fieldSeparator:{children:c.renderText("@common-to"),className:dateRangePickerClasses.toLabel},textField:({position:e})=>({inputRef:e=>{b(e),"0"===e?.dataset.index&&(k.current=e.dataset.formatString)},onBlur:e=>{Number.parseInt(e.target.dataset.index)===f&&R(-1)},onFocus:e=>{const t=Number.parseInt(e.target.dataset.index);R(t)},slotProps:{htmlInput:{id:"start"===e?S:void 0,"data-elementError":!!a,"data-index":"start"===e?0:1}},title:v})},value:D}))});export default DateRangePicker;
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../FormHost";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Date Time Picker" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const DateTimePicker:
|
|
7
|
+
declare const DateTimePicker: React.ForwardRefExoticComponent<FormElementProps<defs.DateTimeRef | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default DateTimePicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{buttonBaseClasses}from"@vertigis/react-ui/ButtonBase";import BaseDateTimePicker from"@vertigis/react-ui/DateTimePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import{clockClasses}from"@vertigis/react-ui/TimeClock";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useContext,useEffect,useMemo,useRef,useState}from"react";import{
|
|
1
|
+
import{buttonBaseClasses}from"@vertigis/react-ui/ButtonBase";import BaseDateTimePicker from"@vertigis/react-ui/DateTimePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import{clockClasses}from"@vertigis/react-ui/TimeClock";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{forwardRef,useContext,useEffect,useMemo,useRef,useState}from"react";import{areValuesEqual,getAmPm,getDateBounds,getNewElementValue,makeProperValue}from"../dateUtilities.js";import HostContext from"../hostContext.js";import{getKeyString}from"../keyboard.js";import{isInvalidError}from"../textUtilities.js";import{makeUniqueId}from"../utils.js";import DateTimeTextField from"./DateTimeTextField.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const StylableDateTimePicker=e=>{const{className:t,slotProps:r,...o}=e;return React.createElement(BaseDateTimePicker,{slotProps:{...r,actionBar:{sx:{display:"none"}},popper:{...r?.popper,className:t}},...o})},StyledDateTimePicker=styled(StylableDateTimePicker)(({theme:{palette:e}})=>({[`& .${clockClasses.amButton}, .${clockClasses.pmButton}`]:{[`&.${buttonBaseClasses.focusVisible}`]:{color:e.action.active}}})),DateTimePicker=forwardRef(({className:e,element:t,enabled:r,error:o,format:a,name:s,prompt:i,setProperty:l,setValue:m,tooltip:n,value:c},u)=>{const p=useContext(HostContext),[d,f]=useState(!1),[T,k]=useState(!1),[g,x]=useState(!1),[E,D]=useState(null),P=useRef(),v=p.deriveLocale();console.log(`DateTimePicker: locale ${v}`);const F={locale:v,timezone:(new Intl.DateTimeFormat).resolvedOptions().timeZone},C=useRef(!0),y=useFocusCallback(r,s,p),R=p.renderText(n),B="datetime",S=isInvalidError(o);useEffect(()=>{const e=makeProperValue(c),t=getNewElementValue(e,B,F);areValuesEqual(c,t)||m(t,!1),D(e||null)},[c]),useEffect(()=>{if(!g&&!T)if(d)S||l("error",{status:"invalid"});else{if(S&&l("error",void 0),C.current)return void(C.current=!1);b()}C.current=!1},[d,T,g]);const b=()=>{const e=getNewElementValue(E,B,F);areValuesEqual(c,e)||m(e)},V=e=>{"enter"!==getKeyString(e)||b()},{min:j,max:w}=getDateBounds(a),N=getAmPm(a),I=useMemo(()=>`${makeUniqueId(s)}-input`,[s]),q=p.renderText(i);return React.createElement(FormElement,{className:e,element:t,inputId:I,name:s,ref:u},e=>React.createElement(React.Fragment,null,S&&React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},P.current),React.createElement(StyledDateTimePicker,{ampm:N,disabled:!r,key:"date-picker",inputRef:e=>{y(e),e&&(P.current=e.dataset.formatString)},maxDateTime:w,minDateTime:j,onChange:e=>D(e),onClose:()=>x(!1),onError:e=>f(!!e),onOpen:()=>x(!0),open:g,slots:{textField:DateTimeTextField},slotProps:{textField:{error:!!o,id:I,inputProps:{...e,placeholder:q},onBlur:()=>k(!1),onFocus:()=>k(!0),onKeyDown:V,title:R}},value:E})))});export default DateTimePicker;
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../../activities/forms/FormRenderer";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Drop Down List" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const DropDownList:
|
|
7
|
+
declare const DropDownList: React.ForwardRefExoticComponent<FormElementProps<defs.Value | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default DropDownList;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import NativeSelect from"@vertigis/react-ui/NativeSelect";import*as React from"react";import{useContext,useEffect,useState}from"react";import HostContext from"../hostContext.js";import{getInputId,inspectItems,makeSafeClassName,makeUniqueId}from"../utils.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const DEFAULT_VALUE="__default",DropDownList=({className:e,current:t,element:a,enabled:
|
|
1
|
+
import NativeSelect from"@vertigis/react-ui/NativeSelect";import*as React from"react";import{forwardRef,useContext,useEffect,useState}from"react";import HostContext from"../hostContext.js";import{getInputId,inspectItems,makeSafeClassName,makeUniqueId}from"../utils.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const DEFAULT_VALUE="__default",DropDownList=forwardRef(({className:e,current:t,element:a,enabled:r,items:o,name:l,prompt:n,raiseEvent:s,setProperty:m,setValue:c,tooltip:i,value:u},d)=>{const p=useContext(HostContext),f=makeUniqueId(l),v=getInputId(f),[b,E]=useState({});useEffect(()=>{const{current:e,items:a,label:r,value:l}=inspectItems(t,o,u);m("current",e),m("label",r),m("value",l,!1),E(a)},[o]);const x=p.renderText(i),C=e=>{const t=e.currentTarget.value,a=b[t].value;m("current",t),m("label",b[t].label),a!==u?c(a,{item:t}):s("changed",a,void 0,t)},N=useFocusCallback(r,l,p);return React.createElement(FormElement,{className:e,element:a,inputId:v,name:l,ref:d},e=>React.createElement(NativeSelect,{disabled:!r,inputProps:{...e,id:v},inputRef:N,onChange:C,title:x,value:t||"__default"},void 0===t&&React.createElement("option",{key:"none",value:"__default",disabled:!0},p.renderText(n)),Object.keys(b).map(e=>{const t=b[e],a=p.renderText(t.label),r=t.styleName?makeSafeClassName(t.styleName):void 0;return React.createElement("option",{className:r,key:e,value:e,title:p.renderText(t.tooltip),disabled:!1===t.enabled},a)})))});export default DropDownList;
|
|
@@ -9,5 +9,5 @@ export declare const filePickerClasses: {
|
|
|
9
9
|
/**
|
|
10
10
|
* The component for the "File Picker" Form Element.
|
|
11
11
|
*/
|
|
12
|
-
declare const FilePicker:
|
|
12
|
+
declare const FilePicker: React.ForwardRefExoticComponent<FormElementProps<defs.FilesRef | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
13
13
|
export default FilePicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import IconButton from"@vertigis/react-ui/IconButton";import Stack from"@vertigis/react-ui/Stack";import Plus from"@vertigis/react-ui/icons/Plus";import Trash from"@vertigis/react-ui/icons/Trash";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useContext,useEffect}from"react";import HostContext from"../hostContext.js";import{isFilesRef}from"../utils.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const PREFIX="FilePicker";export const filePickerClasses={file:`${PREFIX}-file`,label:`${PREFIX}-label`,list:`${PREFIX}-list`};const StyledFormElement=styled(FormElement)(({theme:{palette:e,spacing:t}})=>({[`.${filePickerClasses.list}`]:{marginBottom:t(1),marginTop:t(1),[`.${filePickerClasses.file}`]:{alignItems:"center",display:"flex",gap:t(1),[`.${filePickerClasses.label}`]:{border:`1px solid ${e.grey[200]}`,flexGrow:1,fontStyle:"italic",lineHeight:1,overflow:"hidden",padding:t(1),textOverflow:"ellipsis",whiteSpace:"nowrap"}}}})),FilePicker=({className:e,element:t,enabled:l,fileTypes:i,name:s,setValue:r,size:o,value:a})=>{const
|
|
1
|
+
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import IconButton from"@vertigis/react-ui/IconButton";import Stack from"@vertigis/react-ui/Stack";import Plus from"@vertigis/react-ui/icons/Plus";import Trash from"@vertigis/react-ui/icons/Trash";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{forwardRef,useContext,useEffect}from"react";import HostContext from"../hostContext.js";import{isFilesRef}from"../utils.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const PREFIX="FilePicker";export const filePickerClasses={file:`${PREFIX}-file`,label:`${PREFIX}-label`,list:`${PREFIX}-list`};const StyledFormElement=styled(FormElement)(({theme:{palette:e,spacing:t}})=>({[`.${filePickerClasses.list}`]:{marginBottom:t(1),marginTop:t(1),[`.${filePickerClasses.file}`]:{alignItems:"center",display:"flex",gap:t(1),[`.${filePickerClasses.label}`]:{border:`1px solid ${e.grey[200]}`,flexGrow:1,fontStyle:"italic",lineHeight:1,overflow:"hidden",padding:t(1),textOverflow:"ellipsis",whiteSpace:"nowrap"}}}})),FilePicker=forwardRef(({className:e,element:t,enabled:l,fileTypes:i,name:s,setValue:r,size:o,value:a},n)=>{const c=useContext(HostContext);let m,f=5;"number"==typeof o&&(f=o>1?Math.ceil(o):1),useEffect(()=>{a&&(isFilesRef(a)&&Array.isArray(a.files)||r(void 0,!1))},[a]);const p=c.renderText(t.tooltip);let u=l;const d=[],k=useFocusCallback(l,s,c);if(void 0!==a){const e=e=>()=>{let t;if(a?.files&&a.files.length>1){const l=[...a.files];l.splice(e,1),t={...a,files:l}}r(t)};u=l&&a.files.length<f;const t=c.renderText("@file-picker-remove-item-label");for(const i of a.files){const s=d.length;d.push(React.createElement(Box,{key:"$"+s,className:filePickerClasses.file},React.createElement("label",{className:filePickerClasses.label,title:i.name},i.name),React.createElement(IconButton,{"aria-label":t,disabled:!l,onClick:e(s),ref:k,title:t},React.createElement(Trash,null))))}}d.push(React.createElement(Box,{key:"footer"},React.createElement(Button,{disabled:!u,onClick:()=>{m&&(m.value="",m.click())},ref:k,startIcon:React.createElement(Plus,null),title:p,variant:"outlined"},React.createElement(Markdown,{inline:!0,text:t.prompt||""}))));const g=1!==f;return React.createElement(StyledFormElement,{className:e,component:"fieldset",element:t,name:s,ref:n},React.createElement(Stack,{className:filePickerClasses.list},d),React.createElement("input",{type:"file",style:{display:"none"},title:p,onChange:e=>(e=>{const t=e.files;if(t?.length){const e=a?.files||[];for(let l=0;l<t.length&&e.length!==f;l++)e.push(t[l]);r({refValueType:"files",files:e})}})(e.target),multiple:g,accept:i,ref:e=>{m=e}}))});export default FilePicker;
|
package/forms/components/Form.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import AdapterDateFns from"@vertigis/react-ui/AdapterDateFns";import Box from"@vertigis/react-ui/Box";import{LicenseInfo}from"@vertigis/react-ui/LicenseInfo";import LocalizationProvider from"@vertigis/react-ui/LocalizationProvider";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import*as React from"react";import{useEffect,useState}from"react";import{FormComponent,FormElementComponent}from"../FormComponent.js";import{FormElementTypes}from"../constants.js";import{
|
|
1
|
+
import AdapterDateFns from"@vertigis/react-ui/AdapterDateFns";import Box from"@vertigis/react-ui/Box";import{LicenseInfo}from"@vertigis/react-ui/LicenseInfo";import LocalizationProvider from"@vertigis/react-ui/LocalizationProvider";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import*as React from"react";import{useEffect,useState}from"react";import{FormComponent,FormElementComponent}from"../FormComponent.js";import{FormElementTypes}from"../constants.js";import{getDateFnsLocale,getMuiLocaleText}from"../dateUtilities.js";import{getKeyString}from"../keyboard.js";import{isMutuallyExclusiveSection}from"../utils.js";const PREFIX="Form";export const formClasses={body:"Form-body",footer:"Form-footer",formElementContent:"Form-element-content",formElementTitle:"Form-element-title",formElementWithTitleBeside:"Form-element-with-title-beside",header:"Form-header",main:"Form-main",root:"Form-root",row:"Form-row"};const StyledBox=styled(Box)(()=>({"h1, h2, h3":{margin:0},[`.${formClasses.formElementWithTitleBeside}`]:{alignItems:"start",display:"grid",gridTemplateColumns:"1fr 2fr",[`> .${formClasses.formElementTitle}`]:{gridColumnStart:1,margin:0,overflowWrap:"anywhere"},[`> .${formClasses.formElementContent}`]:{display:"inline-flex",flexDirection:"column",gridColumnStart:2,overflow:"auto"}},[`.${formClasses.row}`]:{display:"flex",gap:"0.5em","> *":{flexGrow:1},"> .CheckBox, > .CheckGroup, > .Image, > .Number, > .RadioGroup":{flexGrow:0},[`.${formClasses.formElementWithTitleBeside}`]:{gridTemplateColumns:"1fr 1fr"}}}));LicenseInfo.setLicenseKey("c14d2671e294e1c22b64a93ed8f2f0f9Tz04ODQ4NixFPTE3NDQ4MzUzNDMwMDAsUz1wcm8sTE09cGVycGV0dWFsLEtWPTI=");const Form=({className:e,component:t})=>{const[o,r]=useState(),[n,i]=useState(),{host:c}=t.props,{form:s}=c;if(useEffect(()=>{let e=!0;const t=c.deriveLocale();return getDateFnsLocale(t).then(t=>{e?r(t):console.warn("Component was unmounted while loading the locale.")}),getMuiLocaleText(t).then(t=>{e?i(t):console.warn("Component was unmounted while loading the locale.")}),()=>{e=!1}},[]),!o)return null;const m={host:c,type:"header",children:[]},l={host:c,type:"body",children:[]},a={host:c,type:"main",children:[]},d={host:c,type:"footer",children:[]},f={host:c,type:"body",children:[]},u={},p=[];function h(e,t){let o=u[t];o||(o=u[t]=[]);let r=o[e];return void 0===r&&(r=o[e]={host:c,type:"row",children:[]}),r}function y(e){if(void 0===e)return l;if("header"===e)return m;if("footer"===e)return d;let t;t="object"==typeof e?e.name:e;let o=(e=>{for(const t of p)if(t.name===e)return t})(t);return void 0===o&&(o={host:c,name:t,type:"section",children:[]},p.push(o)),o}function E(e){return e!==FormElementTypes.SECTION}function F(e){return!0!==e.hoisted&&(!1!==e.visible&&E(e.type))}function g(e){const t=C[e];return null==t||!E(t.type)&&(!0!==t.hoisted&&!1!==t.visible)}function x(e){return e===m||e===l||e===d?`${e.type}-section`:e.name}const C=s.elements,b=Object.keys(C).map(e=>[e,C[e]]).sort((e,t)=>{const o=e[1].section,r=t[1].section;return"header"===o||"footer"===r?Number.MIN_SAFE_INTEGER:"footer"===o||"header"===r?Number.MAX_SAFE_INTEGER:e[1].rowNumber===t[1].rowNumber?e[1].rowIndex-t[1].rowIndex:e[1].rowNumber-t[1].rowNumber});for(const e of b){const[t,o]=e;if(F(o))if(!0!==o.overlay){let e=y(o.section);if(void 0!==o.rowNumber){const t=x(e);e=h(o.rowNumber,t)}e.children.push(React.createElement(FormElementComponent,{key:t,host:c,type:"element",name:t,children:[]}))}else f.children.push(React.createElement(FormElementComponent,{key:t,host:c,type:"element",name:t,children:[]}))}const w=[];if(m.children.length>0&&w.push(React.createElement(FormComponent,{key:"header",...m})),f.children.length>0)w.push(React.createElement(FormComponent,{key:"main",...f}));else{let e,t;v(l);let o=0;const r=()=>{if(e){switch(t){case"accordion-section":k(e,++o,"accordionGroup");break;case"tab-section":k(e,++o,"tabGroup")}e=void 0,t=void 0}};for(const o of p){const n=o.name,i=C[n],c=i.format;t&&c!==t&&r(),g(n)&&(isMutuallyExclusiveSection(i)?e?e.push(o):(e=[o],t=c):v(o))}r(),a.children.length>0&&w.push(React.createElement(FormComponent,{key:"main",...a}))}function T(e){if(function(e){const t=x(e),o=u[t];if(o){const t=Object.keys(o).map(e=>parseInt(e)).sort((e,t)=>e-t);for(const r of t){const t=o[r];if(t.children.length>1){const o=`row-${r}`;e.children.push(React.createElement(FormComponent,{key:o,...t}))}else 1===t.children.length&&e.children.push(...t.children)}}}(e),e.children.length>0){const t=e===l?"body":`$${e.name}`;return React.createElement(FormComponent,{key:t,...e})}}function v(e){const t=T(e);t&&a.children.push(t)}function k(e,t,o){const r=[];for(const t of e){const e=T(t);e&&r.push(e)}const n=`${o}${t}`,i={children:r,host:c,name:n,type:o};a.children.push(React.createElement(FormComponent,{key:n,...i}))}return d.children.length>0&&w.push(React.createElement(FormComponent,{key:"footer",...d})),React.createElement(StyledBox,{className:clsx(e,formClasses.root),onKeyDown:function(e){"enter"===getKeyString(e)&&(e.target instanceof HTMLButtonElement||c.post("clicked"))},ref:function(e){c.renderFocus(e)}},React.createElement(LocalizationProvider,{dateAdapter:AdapterDateFns,adapterLocale:o,localeText:{...n,start:c.renderText("@date-range-picker-start-text"),end:c.renderText("@date-range-picker-end-text"),cancelButtonLabel:c.renderText("@common-cancel"),clearButtonLabel:c.renderText("@common-clear"),okButtonLabel:c.renderText("@common-ok"),todayButtonLabel:c.renderText("@common-today")}},w))};export default Form;
|
|
@@ -4,5 +4,5 @@ import type * as defs from "../FormDefinition";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Geometry Picker" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const GeometryPicker:
|
|
7
|
+
declare const GeometryPicker: React.ForwardRefExoticComponent<FormElementProps<defs.GeometryRef | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default GeometryPicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import IconButton from"@vertigis/react-ui/IconButton";import List from"@vertigis/react-ui/List";import ListItemButton from"@vertigis/react-ui/ListItemButton";import Plus from"@vertigis/react-ui/icons/Plus";import Trash from"@vertigis/react-ui/icons/Trash";import*as React from"react";import{useContext,useEffect,useRef,useState}from"react";import HostContext from"../hostContext.js";import{sanitizeGeometryRef,text}from"../utils.js";import FormElement from"./FormElement.js";import GeometryPickerListItem from"./GeometryPickerListItem.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const GeometryPicker=({autoActivate:e,className:t,element:
|
|
1
|
+
import Box from"@vertigis/react-ui/Box";import Button from"@vertigis/react-ui/Button";import IconButton from"@vertigis/react-ui/IconButton";import List from"@vertigis/react-ui/List";import ListItemButton from"@vertigis/react-ui/ListItemButton";import Plus from"@vertigis/react-ui/icons/Plus";import Trash from"@vertigis/react-ui/icons/Trash";import*as React from"react";import{forwardRef,useContext,useEffect,useRef,useState}from"react";import HostContext from"../hostContext.js";import{sanitizeGeometryRef,text}from"../utils.js";import FormElement from"./FormElement.js";import GeometryPickerListItem from"./GeometryPickerListItem.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const GeometryPicker=forwardRef(({autoActivate:e,className:t,element:r,enabled:o,itemLabel:n,name:i,prompt:s,raiseEvent:c,setProperty:a,setValue:l,size:m,state:u,tooltip:d,value:f},p)=>{const g=useContext(HostContext),[h,k]=useState([]),[y,v]=useState(""),x=u,E=useRef(!1);let R=5;"number"==typeof m&&(R=m>1?Math.ceil(m):1),useEffect(()=>{F(p.current)},[p]),useEffect(()=>{const e=sanitizeGeometryRef(f);f!==e&&l(e,!1),void 0!==f&&(Array.isArray(n)?k(n):(k([]),text.isMarkdown(n)?n.markdown&&v(n):text.isStatus(n)?n.status&&v(n.status):n&&v(n))),null==x&&a("state",[])},[f]);const[b,B]=useState([]),I=useFocusCallback(o,i,g),C=e=>()=>{const t=b.indexOf(e),r=[...b],o=L(e);-1===t?(o.checked=!0,r.push(e)):(o.checked=!1,r.splice(t,1)),B(r)},L=e=>{let t=x[e];return null==t&&(x.length<=e&&(x.length=e,x.push({})),t=x[e]),t},P=e=>()=>{let t;if(f.geometry.length>1){const r=[...f.geometry];if(r.splice(e,1),t={...f,geometry:r},x.splice(e,1),e<h.length){const t=[...h];t.splice(e,1),k(t)}}else x.length=0;const r=[];for(const t of b)t<e?r.push(t):t>e&&r.push(t-1);B(r),l(t,{argument:"remove"})},w=e=>t=>{I(t),null!==t&&(t.checked=!!L(e).checked)},G=e=>{o&&P(e)()},S=(e,t,r)=>{const o=L(e);o.focused=t,o.pending=r,g.renderState(i,"geometry",x)};let j=o;const M=[];if(void 0!==f&&void 0!==x){j=o&&f.geometry.length<R;const e=g.renderText("@geometry-picker-remove-item-label");for(const t of f.geometry){const r=M.length;L(r).content=t;const n=`checkbox-list-label-${r}`;M.push(React.createElement(GeometryPickerListItem,{deleteItem:G,disablePadding:!0,itemIndex:r,key:"$"+r,secondaryAction:React.createElement(IconButton,{"aria-label":e,className:"delete",disabled:!o,edge:"end",onClick:P(r),ref:I,title:e},React.createElement(Trash,null)),updateHighlight:S},React.createElement(ListItemButton,{onClick:C(r),ref:w(r),selected:-1!==b.indexOf(r)},React.createElement(Markdown,{id:n,inline:!0,text:h[r]||y}))))}}const T=()=>{c("clicked",f)},A=g.renderText(d),F=e=>{let t=x;null===e&&(r.visible||null==x&&a("state",[]),t=void 0),g.renderState(i,"geometry",t)};return o&&e&&!E.current&&(setTimeout(()=>{a("autoActivate",void 0),E.current=!1,j&&T()}),E.current=!0),React.createElement(FormElement,{className:t,component:"fieldset",element:r,name:i,ref:p},React.createElement(List,null,M),React.createElement(Box,null,React.createElement(Button,{disabled:!j,onClick:T,ref:I,startIcon:React.createElement(Plus,null),title:A,variant:"outlined"},React.createElement(Markdown,{inline:!0,text:s||""}))))});export default GeometryPicker;
|
|
@@ -3,5 +3,5 @@ import type { FormElementProps } from "../..";
|
|
|
3
3
|
/**
|
|
4
4
|
* The component for the "Horizontal Rule" Form Element.
|
|
5
5
|
*/
|
|
6
|
-
declare const HorizontalRule:
|
|
6
|
+
declare const HorizontalRule: React.ForwardRefExoticComponent<FormElementProps<undefined> & React.RefAttributes<HTMLHRElement>>;
|
|
7
7
|
export default HorizontalRule;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Divider from"@vertigis/react-ui/Divider";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import*as React from"react";import{FormElementTypes}from"../constants.js";import{makeSafeClassName}from"../utils.js";const StyledDivider=styled(Divider)(({theme:{spacing:e}})=>({marginBottom:e(3),marginTop:e(3)})),HorizontalRule=({className:e,element:t,name:a
|
|
1
|
+
import Divider from"@vertigis/react-ui/Divider";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import*as React from"react";import{forwardRef}from"react";import{FormElementTypes}from"../constants.js";import{makeSafeClassName}from"../utils.js";const StyledDivider=styled(Divider)(({theme:{spacing:e}})=>({marginBottom:e(3),marginTop:e(3)})),HorizontalRule=forwardRef(({className:e,element:t,name:r},a)=>React.createElement(StyledDivider,{className:clsx(e,FormElementTypes.HORIZONTALRULE,{[makeSafeClassName(r)]:!!r,[makeSafeClassName(t.styleName)]:!!t.styleName})}));export default HorizontalRule;
|
|
@@ -3,5 +3,5 @@ import type { FormElementProps } from "../..";
|
|
|
3
3
|
/**
|
|
4
4
|
* The component for the "Image" Form Element.
|
|
5
5
|
*/
|
|
6
|
-
declare const Image:
|
|
6
|
+
declare const Image: React.ForwardRefExoticComponent<FormElementProps<string> & React.RefAttributes<HTMLHRElement>>;
|
|
7
7
|
export default Image;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useContext}from"react";import HostContext from"../hostContext.js";import FormElement from"./FormElement.js";const StyledFormElement=styled(FormElement)(()=>({overflow:"hidden",img:{alignSelf:"start"}})),Image=({className:e,element:t,name:o,size:
|
|
1
|
+
import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{forwardRef,useContext}from"react";import HostContext from"../hostContext.js";import FormElement from"./FormElement.js";const StyledFormElement=styled(FormElement)(()=>({overflow:"hidden",img:{alignSelf:"start"}})),Image=forwardRef(({className:e,element:t,name:o,size:r,tooltip:m,value:n},l)=>{const a=useContext(HostContext);let s,i,f;"number"==typeof r&&(i=r,s=r),"object"==typeof r&&("number"==typeof r.width&&(s=r.width),"number"==typeof r.height&&(i=r.height)),"string"==typeof n&&(f=n);const c=a.renderText(m);return React.createElement(StyledFormElement,{className:e,element:t,name:o},React.createElement("img",{src:f,alt:c,title:c,width:s,height:i}))});export default Image;
|
|
@@ -9,7 +9,7 @@ export declare const itemPickerClasses: {
|
|
|
9
9
|
item: string;
|
|
10
10
|
items: string;
|
|
11
11
|
};
|
|
12
|
-
declare const ItemPicker:
|
|
12
|
+
declare const ItemPicker: React.ForwardRefExoticComponent<FormElementProps<defs.ItemsRef | undefined> & {
|
|
13
13
|
spacing?: number;
|
|
14
|
-
}
|
|
14
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
15
15
|
export default ItemPicker;
|