diff --git a/examples/demo/src/config.router.js b/examples/demo/src/config.router.js index a54285b32..00620bfc4 100644 --- a/examples/demo/src/config.router.js +++ b/examples/demo/src/config.router.js @@ -20,6 +20,7 @@ angular.module('app') stateHelperProvider.state(freshRouterStates) stateHelperInit(freshMenu) + console.log("freshMenu", freshMenu) appState.sideMenuConfig = freshMenu // $stateProvider.state({ diff --git a/examples/demo/src/pages/batchList/edit/editCtrl.js b/examples/demo/src/pages/batchList/edit/editCtrl.js index 08e10bd60..f3a131b5d 100644 --- a/examples/demo/src/pages/batchList/edit/editCtrl.js +++ b/examples/demo/src/pages/batchList/edit/editCtrl.js @@ -1,7 +1,7 @@ import BaseEditCtrl from 'angle-grinder/src/ng/gridz/list/BaseEditCtrl' // import appState from 'angle-grinder/src/tools/AppState' import _ from 'lodash' -import appConfigApi from 'angle-grinder/src/dataApi/AppConfigApi' +import appConfigApi from '@yakit/core/stores/AppConfigApi' export default class EditCtrl extends BaseEditCtrl { vm = {} diff --git a/examples/demo/src/svelteDataList/customer/RestGrid.svelte b/examples/demo/src/svelteDataList/customer/RestGrid.svelte index 27e34fd8c..663c3c56d 100644 --- a/examples/demo/src/svelteDataList/customer/RestGrid.svelte +++ b/examples/demo/src/svelteDataList/customer/RestGrid.svelte @@ -20,5 +20,7 @@

dataApi is {dataApi.key}

foo is {foo}

+WTF +google diff --git a/examples/demo/src/svelteDataList/simple/QuickFilter.svelte b/examples/demo/src/svelteDataList/simple/QuickFilter.svelte new file mode 100644 index 000000000..1a3027c85 --- /dev/null +++ b/examples/demo/src/svelteDataList/simple/QuickFilter.svelte @@ -0,0 +1,41 @@ + + + +
+ +
+
+ +
+ + diff --git a/examples/demo/src/svelteDataList/simple/SimpleGrid.svelte b/examples/demo/src/svelteDataList/simple/SimpleGrid.svelte index 577a8872b..b06333e6b 100644 --- a/examples/demo/src/svelteDataList/simple/SimpleGrid.svelte +++ b/examples/demo/src/svelteDataList/simple/SimpleGrid.svelte @@ -2,6 +2,7 @@ - + diff --git a/src/dataApi/AppConfigApi.js b/src/dataApi/AppConfigApi.js deleted file mode 100644 index 5f8beb6da..000000000 --- a/src/dataApi/AppConfigApi.js +++ /dev/null @@ -1,60 +0,0 @@ -import kyApi from './kyApi' - -const makeLocalCache = opts => { - const _values = {} - - return { - get(key) { return _values[key] }, - contains(key) { return key in _values }, - remove(key) { delete _values[key] }, - set(key, value) { _values[key] = value }, - values() { return _values }, - getSet(key, value) { - if (!this.contains(key)) { - this.set(key, typeof value === 'function' ? value() : value) - } - return this.get(key) - } - } -} -const _cache = makeLocalCache() - -/** main holder for api */ -export class AppConfigApi { - prefixUrl = 'api/appConfig/' - - // Allows to use custom function to generate config key, for example namespace_key - configKeyGenerator = (configKey) => { - return configKey - } - - setConfigKeyGenerator(generatorFunc) { - this.configKeyGenerator = generatorFunc - } - - getConfig(configKey) { - return this.configFromCache(`${this.prefixUrl}${this.configKeyGenerator(configKey)}`) - } - - /** - * checks cache and if not there then does a ky.get - */ - async configFromCache(key) { - if (_cache.contains(key)) { - return _cache.get(key) - } else { - let cfg = {} - try{ - cfg = await kyApi.ky.get(key).json() - } catch (er) { - console.error("problem getting config from server", er) - } - _cache.set(key, cfg) - return cfg - } - } -} - -const _instance = new AppConfigApi() - -export default _instance diff --git a/src/gridz/GridDataApiCtrl.js b/src/gridz/GridDataApiCtrl.js index ac2469bff..9dec96cd5 100644 --- a/src/gridz/GridDataApiCtrl.js +++ b/src/gridz/GridDataApiCtrl.js @@ -170,6 +170,11 @@ export default class GridDataApiCtrl { return this.jqGridEl.jqGrid('resetSelection') } + selectRow(selRowId) { + this.clearSelection() + return this.jqGridEl.jqGrid('setSelection', selRowId) + } + // Returns an array with data of the requested id = rowid. // The returned array is of type name:value, where the name is // a name from colModel and the value from the associated column in that row. @@ -184,9 +189,7 @@ export default class GridDataApiCtrl { } updateFooter(data) { - setTimeout(_ => { - this.getGridEl().footerData('set', data) - }) + if(this.jqGridEl) this.jqGridEl.footerData('set', data) } // Populates the grid with the given data. @@ -316,7 +319,7 @@ export default class GridDataApiCtrl { // The syntax of data array is: {name1:value1,name2: value2...} // where the name is the name of the column as described in the colModel // and the value is the new value. - updateRow(id, data, emptyMissingCells) { + updateRow(id, data, emptyMissingCells = false) { if (emptyMissingCells == null) { emptyMissingCells = true } const flatData = flattenObject(data) @@ -422,7 +425,7 @@ export default class GridDataApiCtrl { return this.reload() } - saveRow(id, data) { + addOrUpdateRow(id, data) { if (this.hasRow(id)) { return this.updateRow(id, data) } else { @@ -518,7 +521,6 @@ export default class GridDataApiCtrl { if(!_.isEmpty(q)){ p.q = q } - Log.debug("gridLoader search " + this.dataApi.key, p) const data = await this.dataApi.search(p) // this.addJSONData(data) } catch (er) { diff --git a/src/gridz/jq.formatters.js b/src/gridz/jq.formatters.js index 016ed7c92..46b40c511 100644 --- a/src/gridz/jq.formatters.js +++ b/src/gridz/jq.formatters.js @@ -29,14 +29,13 @@ $.extend($.fn.fmatter, { /** for the Svelte popovers */ editPopoverLink(cellVal, options, rowdata) { // console.log("editPopoverLink", cellVal, options, rowdata) + if (!cellVal) return '' const ident = rowdata['id'] const popoverId = `#${options.gid}-popover-edit` return `${cellVal}` }, gridLink(cellVal, options, rowdata) { - Log.debug("gridLink options", options) - Log.debug("gridLink rowdata", rowdata) const id = rowdata.id return `${cellVal}` }, diff --git a/src/gridz/makeListDataCtrl.js b/src/gridz/makeListDataCtrl.js index d9b92de7f..7feec24f9 100644 --- a/src/gridz/makeListDataCtrl.js +++ b/src/gridz/makeListDataCtrl.js @@ -2,7 +2,7 @@ // import _ from 'lodash' import { get, writable } from 'svelte/store'; import { isEmpty, cloneDeep, isFunction, merge } from '@yakit/core/dash' -import appConfigApi from '../dataApi/AppConfigApi' +import appConfigApi from '@yakit/core/stores/AppConfigApi' import toast from '@yakit/ui/growl' import Swal from '@yakit/ui/swal' @@ -13,7 +13,7 @@ const makeListDataCtrl = (opts) => { let defaultToolbarOpts = { selectedButtons: { bulkUpdate: { icon: 'edit_note', tooltip: 'Bulk Update' }, - xlsExport: { icon: 'mdi-microsoft-excel', tooltip: 'Export to Excel' } + xlsExport: { icon: 'view_module', label: 'Export to Excel' } }, leftButtons: { create: { icon: 'add_box', tooltip: 'Create New' } @@ -62,12 +62,16 @@ const makeListDataCtrl = (opts) => { //if ctx toolbar option were passed in with context if(ctx.toolbarOptions) merge(tbopts, ctx.toolbarOptions) // setup search form show based on if searchForm is configured - if (ctx.searchForm === undefined) { + if (ctx.searchForm === undefined || gopts.searchFormEnabled == false) { gopts.showSearchForm = false ctx.state.showSearchForm = false tbopts.searchFormButton.class = 'hidden' } + if (ctx.editForm === undefined || gopts.createEnabled == false) { + tbopts.leftButtons.create.class = 'hidden' + } + if (ctx.bulkUpdateForm === undefined) { tbopts.selectedButtons.bulkUpdate.class = 'hidden' } @@ -112,7 +116,9 @@ const makeListDataCtrl = (opts) => { } }, + // Fires for common actions, will fall back to ctx.toobarHandler if nothing exists fireToolbarAction(btnItem, event) { + console.log("listDataCtrl fireToolbarAction", btnItem, event) switch (btnItem.key) { case 'create': return ctrl.create() @@ -123,7 +129,11 @@ const makeListDataCtrl = (opts) => { case 'delete': return ctrl.deleteSelected() default: - if (isFunction(ctrl[btnItem.key])) { + if(ctrl.ctx.toolbarHandler){ + return ctrl.ctx.toolbarHandler(btnItem, event) + } + //FIXME this is kind of dangerous and should be removes and use ctx.toolbarHandler + else if (isFunction(ctrl[btnItem.key])) { return ctrl[btnItem.key](btnItem, event) } } diff --git a/src/ng/common/directives/empty-links.js b/src/ng/common/directives/empty-links.js deleted file mode 100644 index dff4c10ac..000000000 --- a/src/ng/common/directives/empty-links.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict' -/** - * Prevent default action on empty links. -*/ -import commonModule from '../commonModule' - -angular.module(commonModule) - .directive('a', function() { - return { - restrict: 'E', - link: function(scope, elem, attrs) { - if (attrs.ngClick || attrs.href === '' || attrs.href === '#') { - elem.on('click', function(e) { - e.preventDefault() - }) - } - } - } - }) diff --git a/src/ng/common/directives/index.js b/src/ng/common/directives/index.js index 2f39e54ff..0ecf71090 100644 --- a/src/ng/common/directives/index.js +++ b/src/ng/common/directives/index.js @@ -13,5 +13,4 @@ import './sideMenu' import './tagInput' import './perfect-scrollbar' import './maxlength' -import './empty-links' import './letter-icon' diff --git a/src/ng/gridz/list-ds/ListDataApiCtrl.js b/src/ng/gridz/list-ds/ListDataApiCtrl.js index a664a5e31..16f1c0910 100644 --- a/src/ng/gridz/list-ds/ListDataApiCtrl.js +++ b/src/ng/gridz/list-ds/ListDataApiCtrl.js @@ -6,7 +6,7 @@ import { isEmpty } from '@yakit/core/dash' import EditModalCtrl from './EditModalCtrl' import BulkUpdateModalCtrl from './BulkUpdateModalCtrl' import { argsMerge } from '../../utils/classUtils' -import appConfigApi from '../../../dataApi/AppConfigApi' +import appConfigApi from '@yakit/core/stores/AppConfigApi' import toast from '@yakit/ui/growl' //import Swal from '../../../tools/swal' diff --git a/src/ng/gridz/list-ds/makeNgListDataCtrl.js b/src/ng/gridz/list-ds/makeNgListDataCtrl.js index 6477019c0..ebfcc690d 100644 --- a/src/ng/gridz/list-ds/makeNgListDataCtrl.js +++ b/src/ng/gridz/list-ds/makeNgListDataCtrl.js @@ -41,7 +41,7 @@ const makeNgListDataCtrl = (ctrl) => { ) modInst.result .then(editedVm => { - isUpdate ? ctrl.getGridCtrl().updateRow(editedVm.id, editedVm) : ctrl.getGridCtrl().addRow(editedVm.id, editedVm) + isUpdate ? ctrl.getGridCtrl().addOrUpdateRow(editedVm.id, editedVm) : ctrl.getGridCtrl().addRow(editedVm.id, editedVm) }) .catch(() => { console.log('Modal dismissed at: ' + new Date()) diff --git a/src/ng/gridz/list/BaseEditCtrl.js b/src/ng/gridz/list/BaseEditCtrl.js index 418482c6b..23f13a951 100644 --- a/src/ng/gridz/list/BaseEditCtrl.js +++ b/src/ng/gridz/list/BaseEditCtrl.js @@ -1,7 +1,7 @@ // import _ from 'lodash' import { argsMerge } from '../../utils/classUtils' -import appConfigApi from '../../../dataApi/AppConfigApi' +import appConfigApi from '@yakit/core/stores/AppConfigApi' import _ from 'lodash' export default class EditModalCtrl { diff --git a/src/ng/gridz/list/BaseListCtrl.js b/src/ng/gridz/list/BaseListCtrl.js index 89a978bff..7de306806 100644 --- a/src/ng/gridz/list/BaseListCtrl.js +++ b/src/ng/gridz/list/BaseListCtrl.js @@ -3,7 +3,7 @@ import _ from 'lodash' import EditModalCtrl from './EditModalCtrl' import BulkUpdateModalCtrl from './BulkUpdateModalCtrl' import { argsMerge } from '../../utils/classUtils' -import appConfigApi from '../../../dataApi/AppConfigApi' +import appConfigApi from '@yakit/core/stores/AppConfigApi' import toast from '@yakit/ui/growl' // import { transformOptions } from '../../controls/formly/helpers' diff --git a/src/ng/sidenav/ag-sidenav.html b/src/ng/sidenav/ag-sidenav.html index 99c86ea9e..da5946eb6 100644 --- a/src/ng/sidenav/ag-sidenav.html +++ b/src/ng/sidenav/ag-sidenav.html @@ -23,7 +23,7 @@
+ + + {#each schema as item} + {item.label} + {/each} + + diff --git a/yakit/svelte/Buttons/Segmented.svelte b/yakit/svelte/Buttons/Segmented.svelte new file mode 100644 index 000000000..65ffa572e --- /dev/null +++ b/yakit/svelte/Buttons/Segmented.svelte @@ -0,0 +1,77 @@ + + + +{#if tag === 'div'} +
+ + {#if strong || strongIos || strongMd || strongAurora} + {#if activeKey} + + {/if} + {/if} +
+{:else if tag === 'p'} +

+ + {#if strong || strongIos || strongMd || strongAurora} + {#if activeKey} + + {/if} + {/if} +

+{/if} + + diff --git a/yakit/svelte/Buttons/index.js b/yakit/svelte/Buttons/index.js new file mode 100644 index 000000000..a1fbfa6b4 --- /dev/null +++ b/yakit/svelte/Buttons/index.js @@ -0,0 +1,4 @@ +export { default as Button } from './Button.svelte'; +export { default as Button7 } from './Button7.svelte'; +export { default as Segmented } from './Segmented.svelte'; +export { default as ButtonToggleGroup } from './ButtonToggleGroup.svelte'; diff --git a/yakit/svelte/DataApiList/EditPopover.svelte b/yakit/svelte/DataApiList/EditPopover.svelte index ddf9a13ec..38b3d4800 100644 --- a/yakit/svelte/DataApiList/EditPopover.svelte +++ b/yakit/svelte/DataApiList/EditPopover.svelte @@ -36,16 +36,15 @@ _defaults(formOpts, { async onSubmit(values, form, errors){ try { - dispatch('beforeSubmit', {values, form, errors}); - // Log.debug("onSubmit", values) + dispatch('beforeEditSubmit', values); // await dataApi.delay(2000) const savedItem = await dataApi.save(values) popoverOpened = false - dispatch('submitSuccess', savedItem); + dispatch('afterEditSubmit', savedItem); } catch (er) { + console.error(er) handleError(er) } - } }) diff --git a/yakit/svelte/DataApiList/Gridz.svelte b/yakit/svelte/DataApiList/Gridz.svelte index 6b5c59f97..60f3951f8 100644 --- a/yakit/svelte/DataApiList/Gridz.svelte +++ b/yakit/svelte/DataApiList/Gridz.svelte @@ -3,7 +3,7 @@ --> -{#if isConfigured } - {#if searchSchema } +{#if inialized } + {#if searchSchema && searchFormEnabled } {/if}
{#if ctx.toolbarOptions } - + {/if}
{#if editSchema } - + {/if} diff --git a/yakit/svelte/DataApiList/SearchForm.svelte b/yakit/svelte/DataApiList/SearchForm.svelte index 22edd400f..60744aebd 100644 --- a/yakit/svelte/DataApiList/SearchForm.svelte +++ b/yakit/svelte/DataApiList/SearchForm.svelte @@ -3,11 +3,14 @@ --> - - - - - - +
+
+ + + + + + +
+
diff --git a/yakit/svelte/DataApiList/toolbar/ListOptionsPopover.svelte b/yakit/svelte/DataApiList/toolbar/ListOptionsPopover.svelte index aa71b9608..af55b8da2 100644 --- a/yakit/svelte/DataApiList/toolbar/ListOptionsPopover.svelte +++ b/yakit/svelte/DataApiList/toolbar/ListOptionsPopover.svelte @@ -7,6 +7,8 @@ import { isFunction } from '@yakit/core/dash'; export let listController + export let popoverId = undefined + $: stateStore = listController.ctx.stateStore let defaultMenuItems = [ @@ -50,7 +52,7 @@ - + {#each displayMenutItems as item} import { fade, fly } from "svelte/transition"; import {Button, Button7, Segmented} from '@yakit/svelte/index' - import TbButton from './TbButton.svelte' - import QuickFilter from './QuickFilter.svelte' + import TbButton from '../../Toolbar/TbButton.svelte' import { merge } from '@yakit/core/dash'; import { classNames } from '../../shared/utils' import ListOptionsPopover from './ListOptionsPopover.svelte' //toolbar options export let title = undefined - export let options = {} + export let opts = {} export let listController + export let listId = undefined + + /** the quickfilter buttons to add to toolbar */ + export let QuickFilter = undefined $: stateStore = listController.ctx.stateStore let isLoading = false + let optionsPopoverId = `${listId}-options-popover` - let opts = options + // let opts = options //turn object to array with key field and returns only visible function filterVisible(buttonOpts){ @@ -56,7 +60,8 @@ if (_.isFunction(btnItem.action)) { await btnItem.action(btnItem, event) } else { - await listController.ctx.gridOptions.fireToolbarAction(btnItem, event) + // calls the listController fireToolbarAction, which will fallback to the ctx.toolbarHandler + await listController.fireToolbarAction(btnItem, event) } } finally { isLoading = false @@ -100,14 +105,15 @@ {/if} {/each} + {#if title} -
{title}
+
+
{title}
{/if}
- - +
@@ -126,13 +132,13 @@
- {#if options.searchFormButton.class !== 'hidden' } + {#if opts.searchFormButton.class !== 'hidden' }
- + diff --git a/yakit/svelte/Formify/Formify.svelte b/yakit/svelte/Formify/Formify.svelte index fe60e8820..84208d8fd 100644 --- a/yakit/svelte/Formify/Formify.svelte +++ b/yakit/svelte/Formify/Formify.svelte @@ -24,12 +24,22 @@ export let state = undefined export let isSubmitting = undefined export let isModified = undefined + export let isModifying = undefined + export let isDisableSave = undefined + /** The transformed schema */ - export let transformedSchema = transformFields(schema) + export let transformedSchema = undefined + /** Function to call after transformFields to do any post processing */ + export let onTransformedSchema = (_) => {} export let denseLayout = false export let cardLayout = true + /* Do the Schema tranformation */ + transformedSchema = transformFields(schema) + //this gets run but for some reason select is not seeing it? + onTransformedSchema(transformedSchema) + let className = undefined; export { className as class } $: formClasses = classNames(className, { @@ -38,6 +48,14 @@ 'cardLayout': cardLayout }) + $: tileWrapperClasses = classNames( + 'card-content', + 'formify-tile-wrapper', + { + 'pt-1': ($$slots.header), + } + ); + className let isColLayout $: if(transformedSchema.columns){ @@ -59,14 +77,17 @@ // $: disableSave = !($isModified) || $isSubmitting // TODO Need a way to disable submit but if isModified is used then wont allow until onBlur when its updated - $: disableSave = $isSubmitting - - + // $: { + // disableSave = !($isModifying || $isModified) + // if($isSubmitting) disableSave = true + // } $: if(formContext) { //state store state = formContext.state isSubmitting = formContext.isSubmitting isModified = formContext.isModified + isModifying = formContext.isModifying + isDisableSave = formContext.isDisableSave } @@ -80,14 +101,15 @@ {#if !($$slots.footer)} Cancel - Save + Save {/if} {:else} - + +
{#each transformedSchema.columns as colCfg}
@@ -105,11 +127,11 @@
{/each}
- +
{#if !($$slots.footer)} Cancel - Save + Save {/if} diff --git a/yakit/svelte/Formify/FormifyField.svelte b/yakit/svelte/Formify/FormifyField.svelte index d336438df..2035eb3ed 100644 --- a/yakit/svelte/Formify/FormifyField.svelte +++ b/yakit/svelte/Formify/FormifyField.svelte @@ -24,12 +24,10 @@ if(data) selectOptions.itemData = data if(multiple) selectOptions.isMulti = true - console.log(`${name} multiple`, multiple) if(minimumInputLength || minSearchChars) { selectOptions.isEagerLoad = false } - console.log(`${name} selectOptions`, selectOptions) //merge in label selectOptions.label = opts.label } diff --git a/yakit/svelte/Formify/ListChipInput.svelte b/yakit/svelte/Formify/ListChipInput.svelte index 4e7358bcb..c0fd65722 100644 --- a/yakit/svelte/Formify/ListChipInput.svelte +++ b/yakit/svelte/Formify/ListChipInput.svelte @@ -6,7 +6,7 @@ import ListInput from './ListInput.svelte' import { classNames } from '../shared/utils'; import { fieldDefaults } from '@yakit/core/transformer' - + import { uniqueId } from '@yakit/core/dash' const dispatch = createEventDispatcher() /** name is the required key or object field path */ @@ -15,7 +15,6 @@ export let placeholder = undefined export let opts = {} - Log.debug("Chip options", cloneDeep(opts)) let selectOpts = omit(opts, 'input', 'key', 'label', 'name', 'type', 'validation') // fieldDefaults(name, opts) label = opts.label @@ -65,7 +64,7 @@ } // create unique id if not set - if (!id) id = _.uniqueId('chips') + if (!id) id = uniqueId('chips') _defaults(selectOpts, { Item, id, inputStyles, listOffset, noOptionsMessage, items, placeholder}) diff --git a/yakit/svelte/Formify/ListField.svelte b/yakit/svelte/Formify/ListField.svelte index 4b8c537e4..f57953942 100644 --- a/yakit/svelte/Formify/ListField.svelte +++ b/yakit/svelte/Formify/ListField.svelte @@ -61,23 +61,17 @@ 'item-input-required': opts.required, }) - const {form, updateValidateField, getValue, errors, formOpts} = getContext(ctxKey); + let isChanged = false + + const formContext = getContext(ctxKey); + const {form, updateValidateField, getValue, formOpts} = formContext; if(!formOpts.showPlaceholders) listInputOpts['placeholder'] = "" - // listInputOpts.placeholder = "foo" export let value = null $: value = getValue($form, name) - $: errorMessage = get($errors, name) || '' - - function handleChangeWrap(evt) { - console.log("handleChangeWrap evt", evt) - console.log("handleChangeWrap value", value) - // handleChange(evt) - } - function handleChange(event) { const element = event.target; const field = element.name || element.id; @@ -96,26 +90,15 @@ handleChange(evt) } - let oldVal = value - let isChanged = false function onChange(evt) { - // console.log("onChange evt", evt) - // console.log("onChange value", value) - // console.log("onChange oldVal", oldVal) isChanged = true - // handleChange(evt) } - function onInput(evt) { - // console.log("onInput evt", evt) - // console.log("onInput value", value) - // handleChange(evt) - } + {onChange} {onBlur} bind:value /> {#if isButton } - {:else}