From 93518e79ea4301990ca0fc3dcfd6fed1ada64293 Mon Sep 17 00:00:00 2001 From: Joshua B Date: Fri, 4 Feb 2022 10:48:05 -0700 Subject: [PATCH 01/11] move appConfigApi to have it call, add commons ref to schema --- .../demo/src/pages/batchList/edit/editCtrl.js | 2 +- src/dataApi/AppConfigApi.js | 60 -------------- src/gridz/jq.formatters.js | 2 - src/gridz/makeListDataCtrl.js | 8 +- src/ng/gridz/list-ds/ListDataApiCtrl.js | 2 +- src/ng/gridz/list/BaseEditCtrl.js | 2 +- src/ng/gridz/list/BaseListCtrl.js | 2 +- src/styles/framework7/framework7.less | 3 + .../core/schema/__tests__/testSchemaModel.js | 7 ++ .../schema/__tests__/transformSchema.spec.js | 77 +++++++++++++++++ yakit/core/schema/__tests__/yup.spec.js | 2 +- yakit/core/schema/schemaRefs.js | 20 +++++ yakit/core/schema/transformSchema.js | 54 ++++++++---- yakit/core/stores/AppConfigApi.js | 82 +++++++++++++++++++ yakit/svelte/DataApiList/Gridz.svelte | 7 +- yakit/svelte/DataApiList/SearchForm.svelte | 49 ++++++++--- yakit/svelte/Formify/Formify.svelte | 1 + yakit/svelte/Formify/FormifyField.svelte | 1 - yakit/svelte/f7-components.js | 5 ++ 19 files changed, 289 insertions(+), 97 deletions(-) delete mode 100644 src/dataApi/AppConfigApi.js create mode 100644 yakit/core/schema/schemaRefs.js create mode 100644 yakit/core/stores/AppConfigApi.js 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/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/jq.formatters.js b/src/gridz/jq.formatters.js index 016ed7c92..e4ef87561 100644 --- a/src/gridz/jq.formatters.js +++ b/src/gridz/jq.formatters.js @@ -35,8 +35,6 @@ $.extend($.fn.fmatter, { }, 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..d4a22fb6f 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' @@ -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' } 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/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/styles/framework7/framework7.less b/src/styles/framework7/framework7.less index 884f10144..3c70f2f5d 100644 --- a/src/styles/framework7/framework7.less +++ b/src/styles/framework7/framework7.less @@ -37,6 +37,9 @@ // needs to come from framework7 not source because it has the font built into it @import '~framework7/components/app/app.less'; // @import './components/statusbar/statusbar.less'; + +@import '~framework7/components/accordion/accordion.less'; + @import '~framework7/components/view/view.less'; @import '~framework7/components/page/page.less'; @import '~framework7/components/link/link.less'; diff --git a/yakit/core/schema/__tests__/testSchemaModel.js b/yakit/core/schema/__tests__/testSchemaModel.js index 39dc25510..ea246936d 100644 --- a/yakit/core/schema/__tests__/testSchemaModel.js +++ b/yakit/core/schema/__tests__/testSchemaModel.js @@ -17,6 +17,13 @@ const testSchema = { type: 'string', enum: [ 'Customer', 'Vendor', 'Prospect'] }, + picker:{ + input: 'select', + options:{ + isValueObject: true, + data:['foo', 'bar'] + } + }, inactive: { type: 'boolean' }, diff --git a/yakit/core/schema/__tests__/transformSchema.spec.js b/yakit/core/schema/__tests__/transformSchema.spec.js index df2aeb7b5..9fea21163 100644 --- a/yakit/core/schema/__tests__/transformSchema.spec.js +++ b/yakit/core/schema/__tests__/transformSchema.spec.js @@ -2,6 +2,7 @@ import _ from 'lodash' import {transformFields} from '../transformSchema' import { testSchema, testSchemaColumns } from './testSchemaModel' import {expect as x} from '@jest/globals' +import schemaRefs from '../schemaRefs' describe('transformFields', () => { @@ -48,6 +49,18 @@ describe('transformFields', () => { data: [ 'Customer', 'Vendor', 'Prospect'] } }, + { + key: 'picker', + type: 'object', + name: 'picker', + label: 'Picker', + placeholder: 'Picker', + input: 'select', + selectOptions:{ + isValueObject: true, + data:['foo', 'bar'] + } + }, { key: 'inactive', type: 'boolean', @@ -153,12 +166,76 @@ describe('transformFields', () => { describe('tranformOptions from object', function() { it('should tranformOptions from object', function() { let topts = transformFields(testSchema) + console.log("topts", topts) topts.forEach((item, i) => { x(item).toEqual(resultSchema[i]) }) //expect(topts).toEqual(resultOpts) }) + it('should tranformOptions options to selectOption', function() { + let topts = transformFields({ + picker:{ + input: 'select', + options:{ + isValueObject: true, + data:['foo', 'bar'] + } + } + }) + console.log("topts", topts) + x(topts[0].selectOptions).toEqual({ + isValueObject: true, + data:['foo', 'bar'] + }) + }) + + it('should merge in refs', function() { + schemaRefs.refs = { + some:{ + picklists:{ + fooinator:{ + label: 'pick a foo', + input: 'select', + type: 'string', + placeholder: 'pick a foo', + options:{ + isValueObject: true, + data:['foo', 'bar'] + } + } + } + } + } + let topts = transformFields({ + fooPick:{ + label: 'better foo', + '$ref': '#/some/picklists/fooinator', + options:{ + dataApi:{ + key: 'foo' + } + } + } + }) + console.log("topts", topts) + x(topts[0]).toEqual({ + key: 'fooPick', + label: 'better foo', + name: 'fooPick', + type: 'string', + input: 'select', + placeholder: "pick a foo", + selectOptions:{ + isValueObject: true, + data:['foo', 'bar'], + dataApi:{ + key: 'foo' + } + } + }) + }) + it('should work with columns', function() { let testCols = { diff --git a/yakit/core/schema/__tests__/yup.spec.js b/yakit/core/schema/__tests__/yup.spec.js index 19d3c7ad1..8660022c3 100644 --- a/yakit/core/schema/__tests__/yup.spec.js +++ b/yakit/core/schema/__tests__/yup.spec.js @@ -128,7 +128,7 @@ describe('yup sanity check', () => { let descObj = yupSchema.describe() let fldKeys = Object.keys(yupSchema.fields) - x(fldKeys.length).toEqual(9) + x(fldKeys.length).toEqual(10) //user should have 2 nested fields let userKeys = Object.keys(yupSchema.fields.user.fields) diff --git a/yakit/core/schema/schemaRefs.js b/yakit/core/schema/schemaRefs.js new file mode 100644 index 000000000..14fe55612 --- /dev/null +++ b/yakit/core/schema/schemaRefs.js @@ -0,0 +1,20 @@ + +/** + * Holder 'statics' for $ + */ + + import { get, isEmpty } from '../dash' + +const schemaRefs = { + refs:{}, + + get(key){ + return get(schemaRefs.refs, key) + }, + + isEmpty(){ + return isEmpty(schemaRefs.refs) + } +} + +export default schemaRefs diff --git a/yakit/core/schema/transformSchema.js b/yakit/core/schema/transformSchema.js index e17077da7..66ab8a1bf 100644 --- a/yakit/core/schema/transformSchema.js +++ b/yakit/core/schema/transformSchema.js @@ -5,11 +5,12 @@ */ import { makeLabel } from '../nameUtils' -import { map, _defaults, pick, omit, defaultsDeep } from '../dash' +import { map, _defaults, pick, omit, defaultsDeep, merge, get} from '../dash' import { isUndefined, isPlainObject, isEmpty } from '../is' +import schemaRefs from './schemaRefs' export function transformFields(fields, ctrl) { - console.log("fields", fields) + // console.log("fields", fields) if(isEmpty(fields)) return fields // if its a plain object and first key starts with column and its a columns layout if (isPlainObject(fields) && Object.keys(fields)[0].startsWith('column')) { @@ -54,8 +55,8 @@ function ensureArray(cfg) { } function doReduce(optsAr, ctrl) { - const tplOptsKeys = ['label', 'required', 'placeholder', 'hint', 'minLength', - 'maxLength', 'rows', 'dataApi', 'selectOptions', 'disabled', 'addon'] + // const tplOptsKeys = ['label', 'required', 'placeholder', 'hint', 'minLength', + // 'maxLength', 'rows', 'dataApi', 'selectOptions', 'options', 'disabled', 'addon'] return optsAr.reduce(function(accum, field) { if (field.fieldGroup) { field.fieldGroup = doTransform(field.fieldGroup) @@ -66,14 +67,12 @@ function doReduce(optsAr, ctrl) { _defaults(field, { className: 'columns' }) } else { const key = field.key + ///merge in ref if it exists + refMerge(field) selectOptions(field) fieldSchemaType(field) fieldDefaults(key, field) - // if (field.input === 'select') { - // defaultsDeep(field, { selectOptions: { useDataObject: true } }) - // } - if (field.input.indexOf('addon') > -1) { field.onClick = ($event) => { if (!$event) return @@ -92,25 +91,50 @@ function doReduce(optsAr, ctrl) { }, []) } +/** + * if field has a $ref then do lookup and merge in if found + * uses a fairly primitive json pointer https://datatracker.ietf.org/doc/html/rfc6901 + * and only works with string starting with '#/' right now + */ +export function refMerge(field) { + let refKey = field['$ref'] + if(refKey){ + //should start with '#/' + refKey = refKey.substring(2).replaceAll('/','.') + const refObj = schemaRefs.get(refKey) + if(isEmpty(refObj)) return + delete field['$ref'] + defaultsDeep(field, refObj) + } +} /** * if enum is specified then this will setup selectOptions for it */ export function selectOptions(field) { - if(field.selectOptions) { + //options or selectOptions will work + let options = field.selectOptions || field.options + console.log("options", options) + if(options) { if(!field.input) field.input = 'select' //if isValueObject and no type is set then make it object - if(!field.type && field.selectOptions.isValueObject) field.type = 'object' - return + if(!field.type && options.isValueObject) field.type = 'object' + // return } + //check enum and merge it in const fieldEnum = field['enum'] - if(fieldEnum){ - field.selectOptions = { + if(!isEmpty(fieldEnum)){ + if(!options) options = {} + options = _defaults(options, { data: fieldEnum - } - field.input = 'select' + }) + if(!field.input) field.input = 'select' } + field.selectOptions = options + //remove the field.options if its there + if(field.options) delete field.options } + /** * adds an input based on the schema type. if no schema type then defaults to type:string and input:text */ diff --git a/yakit/core/stores/AppConfigApi.js b/yakit/core/stores/AppConfigApi.js new file mode 100644 index 000000000..b9338ad19 --- /dev/null +++ b/yakit/core/stores/AppConfigApi.js @@ -0,0 +1,82 @@ +import { kyFetch } from './ky' +import schemaRefs from '../schema/schemaRefs' +import growl from '@yakit/ui/growl' +import { isEmpty } from '../is' + +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/' + restApi = kyFetch('appConfig') + + // Allows to use custom function to generate config key, for example namespace_key + configKeyGenerator = (configKey) => { + return configKey + } + + // setConfigKeyGenerator(generatorFunc) { + // this.configKeyGenerator = generatorFunc + // } + + async getConfig(configKey) { + const cfg = await this.configFromCache(configKey) + //on the first call ref needs to be pulled, make sure we have it + await this.ensureRefsLoaded() + return cfg + } + + /** + * checks cache and if not there then does a ky.get + */ + async configFromCache(configKey) { + if (_cache.contains(configKey)) { + return _cache.get(configKey) + } else { + let cfg = {} + try{ + cfg = await this.restApi.get({path: configKey}) + } catch (er) { + growl.error(er, "problem getting app config from server") + } + _cache.set(configKey, cfg) + return cfg + } + } + + /** + * gets the refs file for json pointer lookups with $ref + */ + async refs() { + return this.configFromCache('refs') + } + + async ensureRefsLoaded(){ + if(schemaRefs.isEmpty()){ + const refs = await this.configFromCache('refs') + schemaRefs.refs = refs + } + } + +} + +const _instance = new AppConfigApi() + +export default _instance diff --git a/yakit/svelte/DataApiList/Gridz.svelte b/yakit/svelte/DataApiList/Gridz.svelte index 6b5c59f97..4b0db78bc 100644 --- a/yakit/svelte/DataApiList/Gridz.svelte +++ b/yakit/svelte/DataApiList/Gridz.svelte @@ -12,6 +12,7 @@ import { classNames } from '../shared/utils'; import stringify from '@yakit/core/stringify'; import growl from "@yakit/ui/growl" + import { get as _get } from "@yakit/core/dash" export let ctx = undefined export let dataApi = undefined @@ -37,6 +38,7 @@ let stateStore let editSchema let searchSchema + let searchFormEnabled onMount(async () => { await setupListCtrl() @@ -47,6 +49,7 @@ ctx = listController.ctx gridId = ctx.gridOptions.gridId stateStore = listController.ctx.stateStore + searchFormEnabled = _get(ctx, 'gridOptions.searchFormEnabled', true) setupToolbarOpts(ctx) //needs to be either editSchema = ctx.editPopover || ctx.editForm @@ -61,7 +64,7 @@ let tbopts = ctx.toolbarOptions //it will always exists if tbopts is present so no null checks should be needed, just check class if(tbopts && tbopts.leftButtons.create.class !== 'hidden' ){ - tbopts.leftButtons.create['popoverId'] = `#${ctx.gridOptions.gridId}-popover-edit` + tbopts.leftButtons.create['popoverId'] = `#${gridId}-popover-edit` } } @@ -91,7 +94,7 @@ {#if isConfigured } - {#if searchSchema } + {#if searchSchema && searchFormEnabled } {/if}
diff --git a/yakit/svelte/DataApiList/SearchForm.svelte b/yakit/svelte/DataApiList/SearchForm.svelte index 22edd400f..21c88df85 100644 --- a/yakit/svelte/DataApiList/SearchForm.svelte +++ b/yakit/svelte/DataApiList/SearchForm.svelte @@ -3,11 +3,13 @@ --> - - - - - - +
+
+ + + + + + +
+
diff --git a/yakit/svelte/Formify/Formify.svelte b/yakit/svelte/Formify/Formify.svelte index fe60e8820..16395cd48 100644 --- a/yakit/svelte/Formify/Formify.svelte +++ b/yakit/svelte/Formify/Formify.svelte @@ -61,6 +61,7 @@ // TODO Need a way to disable submit but if isModified is used then wont allow until onBlur when its updated $: disableSave = $isSubmitting + Log.debug('transformedSchema', transformedSchema) $: if(formContext) { //state store diff --git a/yakit/svelte/Formify/FormifyField.svelte b/yakit/svelte/Formify/FormifyField.svelte index d336438df..553494381 100644 --- a/yakit/svelte/Formify/FormifyField.svelte +++ b/yakit/svelte/Formify/FormifyField.svelte @@ -24,7 +24,6 @@ if(data) selectOptions.itemData = data if(multiple) selectOptions.isMulti = true - console.log(`${name} multiple`, multiple) if(minimumInputLength || minSearchChars) { selectOptions.isEagerLoad = false diff --git a/yakit/svelte/f7-components.js b/yakit/svelte/f7-components.js index 4c5225d49..f395d47cc 100644 --- a/yakit/svelte/f7-components.js +++ b/yakit/svelte/f7-components.js @@ -5,6 +5,11 @@ export { default as Page } from 'framework7-svelte/esm/svelte/page.svelte'; export { default as PageContent } from 'framework7-svelte/esm/svelte/page-content.svelte'; export { default as Navbar } from 'framework7-svelte/esm/svelte/navbar.svelte'; +export { default as AccordionContent } from 'framework7-svelte/esm/svelte/accordion-content.svelte'; +export { default as AccordionItem } from 'framework7-svelte/esm/svelte/accordion-item.svelte'; +export { default as AccordionToggle } from 'framework7-svelte/esm/svelte/accordion-toggle.svelte'; +export { default as Accordion } from 'framework7-svelte/esm/svelte/accordion.svelte'; + export { default as Block } from 'framework7-svelte/esm/svelte/block.svelte'; export { default as BlockHeader } from 'framework7-svelte/esm/svelte/block-header.svelte'; export { default as BlockFooter } from 'framework7-svelte/esm/svelte/block-footer.svelte'; From 318f52ce06a747986a34276e97d6b530d79079e2 Mon Sep 17 00:00:00 2001 From: Joshua B Date: Sat, 5 Feb 2022 13:26:12 -0700 Subject: [PATCH 02/11] Svelte gridz (#677) * cleanup debugs, change saveRow name * make growl bigger and scroillable for unexpected errors * tweaks for forms --- src/gridz/GridDataApiCtrl.js | 9 +- src/gridz/makeListDataCtrl.js | 8 +- src/ng/gridz/list-ds/makeNgListDataCtrl.js | 2 +- src/styles/framework7/index.scss | 5 + src/styles/vendor/notyf.scss | 12 +- yakit/core/schema/create-form.js | 19 +++ yakit/core/schema/transformSchema.js | 21 ++- yakit/core/stores/rest/restQuery.js | 1 - yakit/svelte/DataApiList/EditPopover.svelte | 6 +- yakit/svelte/DataApiList/Gridz.svelte | 38 +++-- .../toolbar/ListOptionsPopover.svelte | 4 +- .../DataApiList/toolbar/ListToolbar.svelte | 21 ++- yakit/svelte/Formify/Formify.svelte | 17 ++- yakit/svelte/Formify/FormifyField.svelte | 1 - yakit/svelte/Formify/ListChipInput.svelte | 5 +- yakit/svelte/Formify/ListField.svelte | 27 +--- yakit/svelte/Formify/ListForm.svelte | 14 +- yakit/svelte/Formify/ListInput.svelte | 13 +- yakit/svelte/Formify/ListSelect.svelte | 8 +- yakit/svelte/Formify/problemHandler.js | 19 ++- .../svelte/Formify/toolbar/FormToolbar.svelte | 141 ++++++++++++++++++ .../Formify/toolbar/ListOptionsPopover.svelte | 68 +++++++++ .../svelte/Formify/toolbar/QuickFilter.svelte | 35 +++++ yakit/svelte/Select/Select.svelte | 4 +- .../toolbar => Toolbar}/TbButton.svelte | 4 +- yakit/ui/select/selectContext.js | 12 -- 26 files changed, 400 insertions(+), 114 deletions(-) create mode 100644 yakit/svelte/Formify/toolbar/FormToolbar.svelte create mode 100644 yakit/svelte/Formify/toolbar/ListOptionsPopover.svelte create mode 100644 yakit/svelte/Formify/toolbar/QuickFilter.svelte rename yakit/svelte/{DataApiList/toolbar => Toolbar}/TbButton.svelte (81%) diff --git a/src/gridz/GridDataApiCtrl.js b/src/gridz/GridDataApiCtrl.js index ac2469bff..bbcc9be64 100644 --- a/src/gridz/GridDataApiCtrl.js +++ b/src/gridz/GridDataApiCtrl.js @@ -184,9 +184,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 +314,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 +420,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 +516,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/makeListDataCtrl.js b/src/gridz/makeListDataCtrl.js index d4a22fb6f..4039fc6f4 100644 --- a/src/gridz/makeListDataCtrl.js +++ b/src/gridz/makeListDataCtrl.js @@ -116,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() @@ -127,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/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/styles/framework7/index.scss b/src/styles/framework7/index.scss index 47141f063..986e0a6b6 100644 --- a/src/styles/framework7/index.scss +++ b/src/styles/framework7/index.scss @@ -30,3 +30,8 @@ body { position: absolute; } } + +//makes it so select drop down is not hidden +.popover-inner { + overflow: visible; +} diff --git a/src/styles/vendor/notyf.scss b/src/styles/vendor/notyf.scss index 314778f33..abe1e8dde 100644 --- a/src/styles/vendor/notyf.scss +++ b/src/styles/vendor/notyf.scss @@ -140,7 +140,7 @@ $toast-padding: 15px; position: relative; padding: 0 $toast-padding; border-radius: 2px; - max-width: 320px; + max-width: 380px; transform: translateY(25%); box-sizing: border-box; flex-shrink: 0; @@ -180,19 +180,19 @@ $toast-padding: 15px; &--dismissible { .notyf__wrapper { - padding-right: 30px; + padding-right: 20px; } } } &__ripple { - height: 600px; - width: 400px; + height: 500px; + width: 600px; position: absolute; transform-origin: bottom right; right: 0; top: 0; - border-radius: 50%; + border-radius: 40%; transform: scale(0) translateY(-51%) translateX(13%); z-index: 5; animation: ripple 0.4s ease-out forwards; @@ -277,6 +277,8 @@ $toast-padding: 15px; animation: notyf-fadeinup 0.3s forwards; animation-delay: 0.25s; line-height: 1.5em; + overflow-y: auto; + max-height: 200px; } } diff --git a/yakit/core/schema/create-form.js b/yakit/core/schema/create-form.js index 4d5e05a64..e1672fed8 100644 --- a/yakit/core/schema/create-form.js +++ b/yakit/core/schema/create-form.js @@ -7,6 +7,7 @@ import {derived, writable, get} from 'svelte/store'; import {util} from './util'; +import {get as _get} from '../dash'; const NO_ERROR = ''; const IS_TOUCHED = true; @@ -51,6 +52,7 @@ export const createForm = (config) => { const isSubmitting = writable(false); const isValidating = writable(false); + const isModifying = writable(false); const isValid = derived(errors, ($errors) => { const noErrors = util @@ -73,6 +75,13 @@ export const createForm = (config) => { return util.getValues($modified).includes(true); }); + const isDisableSave = derived([isModified, isModifying, isSubmitting], + ([$isModified, $isModifying, $isSubmitting]) => { + //if its not modified and not modifying + let val = !($isModified || $isModifying) || $isSubmitting + return val + }); + function validateField(field) { return util .subscribeOnce(form) @@ -202,8 +211,15 @@ export const createForm = (config) => { handleReset(); } + /** The function used to get value form object */ + function getValue(obj, path){ + let val = _get(obj, path) + return val === undefined ? null : val + } + return { form, + data: form, errors, touched, modified, @@ -211,6 +227,7 @@ export const createForm = (config) => { isSubmitting, isValidating, isModified, + isDisableSave, handleChange, handleSubmit, handleReset, @@ -219,6 +236,8 @@ export const createForm = (config) => { updateTouched, validateField, updateInitialValues, + isModifying, + getValue, state: derived( [ form, diff --git a/yakit/core/schema/transformSchema.js b/yakit/core/schema/transformSchema.js index 66ab8a1bf..64427552c 100644 --- a/yakit/core/schema/transformSchema.js +++ b/yakit/core/schema/transformSchema.js @@ -10,7 +10,6 @@ import { isUndefined, isPlainObject, isEmpty } from '../is' import schemaRefs from './schemaRefs' export function transformFields(fields, ctrl) { - // console.log("fields", fields) if(isEmpty(fields)) return fields // if its a plain object and first key starts with column and its a columns layout if (isPlainObject(fields) && Object.keys(fields)[0].startsWith('column')) { @@ -113,7 +112,6 @@ export function refMerge(field) { export function selectOptions(field) { //options or selectOptions will work let options = field.selectOptions || field.options - console.log("options", options) if(options) { if(!field.input) field.input = 'select' //if isValueObject and no type is set then make it object @@ -140,7 +138,7 @@ export function selectOptions(field) { */ export function fieldSchemaType(field) { if(!field.type) field.type = 'string' - let {type = 'string', format, input } = field + let {type, format, input } = field //if input is specified then its been overriden so do nothing if(input) return @@ -149,16 +147,31 @@ export function fieldSchemaType(field) { format = type type = 'string' } + //if format starts with amount. we can have amount, amount-positive, amount-negative + if(format && format.startsWith("amount")){ + field.multipleOf = 0.01 + if(!type) type = 'number' + } if(format === 'date' || format === 'date-time'){ input = format } else if(type === 'boolean'){ input = 'toggle' - } else if(type === 'integer' || type === 'number' ){ + } else if(type === 'integer' ){ + input = type + } else if(type === 'number' ){ input = type } else { + if(!type) type = 'string' input = 'text' } + //do some special formats + if(format){ + if(format.endsWith("positive") && !field.min ) field.min = 0 + if(format.endsWith("negative") && !field.max ) field.max = 0 + } + + field.type = type field.input = input diff --git a/yakit/core/stores/rest/restQuery.js b/yakit/core/stores/rest/restQuery.js index d26e2ea2a..8e56fb51b 100644 --- a/yakit/core/stores/rest/restQuery.js +++ b/yakit/core/stores/rest/restQuery.js @@ -26,7 +26,6 @@ export const restQuery = ({ api }) => ds => { */ async search(params) { let searchParams = ds.setupSearchParams(params) - console.log("search ran with", searchParams) const page = await api.get({ searchParams }) ds.stores.setPageView(page) diff --git a/yakit/svelte/DataApiList/EditPopover.svelte b/yakit/svelte/DataApiList/EditPopover.svelte index ddf9a13ec..7e9b482f4 100644 --- a/yakit/svelte/DataApiList/EditPopover.svelte +++ b/yakit/svelte/DataApiList/EditPopover.svelte @@ -36,13 +36,13 @@ _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 4b0db78bc..25e7cab81 100644 --- a/yakit/svelte/DataApiList/Gridz.svelte +++ b/yakit/svelte/DataApiList/Gridz.svelte @@ -3,7 +3,7 @@ --> -{#if isConfigured } +{#if inialized } {#if searchSchema && searchFormEnabled } {/if}
{#if ctx.toolbarOptions } - + {/if}
{#if editSchema } - + {/if} 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 TbButton from '../../Toolbar/TbButton.svelte' import QuickFilter from './QuickFilter.svelte' import { merge } from '@yakit/core/dash'; import { classNames } from '../../shared/utils' @@ -12,14 +12,16 @@ //toolbar options export let title = undefined - export let options = {} + export let opts = {} export let listController + export let listId = 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 +58,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,8 +103,10 @@ {/if} {/each} + {#if title} -
{title}
+
+
{title}
{/if}
@@ -126,13 +131,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 16395cd48..bf087e244 100644 --- a/yakit/svelte/Formify/Formify.svelte +++ b/yakit/svelte/Formify/Formify.svelte @@ -24,6 +24,8 @@ 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) @@ -59,15 +61,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 - - Log.debug('transformedSchema', transformedSchema) - + // $: { + // 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 } @@ -81,13 +85,14 @@ {#if !($$slots.footer)} Cancel - Save + Save {/if} {:else} +
{#each transformedSchema.columns as colCfg} @@ -110,7 +115,7 @@ {#if !($$slots.footer)} Cancel - Save + Save {/if} diff --git a/yakit/svelte/Formify/FormifyField.svelte b/yakit/svelte/Formify/FormifyField.svelte index 553494381..2035eb3ed 100644 --- a/yakit/svelte/Formify/FormifyField.svelte +++ b/yakit/svelte/Formify/FormifyField.svelte @@ -28,7 +28,6 @@ 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 $stateStore.hasSelected } +
+
+ + + subdirectory_arrow_right +
+ {#each filterVisible(opts.selectedButtons) as btnItem} + fireButtonClick(btnItem)}/> + {/each} +
+
+ {/if} + {#each filterVisible(opts.leftButtons) as btnItem} + {#if btnItem.popoverId} + + {:else} + fireButtonClick(btnItem)}/> + {/if} + {/each} + + + {#if title} +
+
{title}
+ {/if} +
+ + + + + +
+
+ + + + + {#if qSearchEntry } + + + + {/if} +
+
+ + {#if opts.searchFormButton.class !== 'hidden' } +
+
+ + + + diff --git a/yakit/svelte/Formify/toolbar/ListOptionsPopover.svelte b/yakit/svelte/Formify/toolbar/ListOptionsPopover.svelte new file mode 100644 index 000000000..aa71b9608 --- /dev/null +++ b/yakit/svelte/Formify/toolbar/ListOptionsPopover.svelte @@ -0,0 +1,68 @@ + + + + + + {#each displayMenutItems as item} + + + {item.material} + + + + {/each} + + + + + diff --git a/yakit/svelte/Formify/toolbar/QuickFilter.svelte b/yakit/svelte/Formify/toolbar/QuickFilter.svelte new file mode 100644 index 000000000..41ca5e11e --- /dev/null +++ b/yakit/svelte/Formify/toolbar/QuickFilter.svelte @@ -0,0 +1,35 @@ + + + +
+ + Open + Closed + All + +
+ + + diff --git a/yakit/svelte/Select/Select.svelte b/yakit/svelte/Select/Select.svelte index 6e0e61e77..c6ef65c41 100644 --- a/yakit/svelte/Select/Select.svelte +++ b/yakit/svelte/Select/Select.svelte @@ -4,7 +4,7 @@ import Select from 'svelte-select' import ItemMulti from './ItemMulti.svelte' import ItemSingle from './ItemSingle.svelte' - + import { uniqueId } from '@yakit/core/dash' import apiHolder from '@yakit/core/stores/apiHolder' const dispatch = createEventDispatcher() @@ -95,7 +95,7 @@ } // create unique id if not set - if (!id) id = _.uniqueId('select') + if (!id) id = uniqueId('select') let opts = { dataApi, diff --git a/yakit/svelte/DataApiList/toolbar/TbButton.svelte b/yakit/svelte/Toolbar/TbButton.svelte similarity index 81% rename from yakit/svelte/DataApiList/toolbar/TbButton.svelte rename to yakit/svelte/Toolbar/TbButton.svelte index 15fe3a2c7..1c733d481 100644 --- a/yakit/svelte/DataApiList/toolbar/TbButton.svelte +++ b/yakit/svelte/Toolbar/TbButton.svelte @@ -28,7 +28,9 @@ {#if isButton } - {:else} diff --git a/yakit/svelte/DataApiList/toolbar/ListToolbar.svelte b/yakit/svelte/DataApiList/toolbar/ListToolbar.svelte index 2f5d7f98e..4e55762aa 100644 --- a/yakit/svelte/DataApiList/toolbar/ListToolbar.svelte +++ b/yakit/svelte/DataApiList/toolbar/ListToolbar.svelte @@ -106,7 +106,7 @@ {#if title}
-
{title}
+
{title}
{/if}
diff --git a/yakit/svelte/Formify/Formify.svelte b/yakit/svelte/Formify/Formify.svelte index bf087e244..c3c84aa16 100644 --- a/yakit/svelte/Formify/Formify.svelte +++ b/yakit/svelte/Formify/Formify.svelte @@ -26,12 +26,20 @@ 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, { From 95d3774c7e4b30d420aa551f568e77f85f10a560 Mon Sep 17 00:00:00 2001 From: Joshua B Date: Sat, 5 Feb 2022 18:18:34 -0700 Subject: [PATCH 04/11] fix so no top padding when toolbar is present --- yakit/svelte/Formify/Formify.svelte | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/yakit/svelte/Formify/Formify.svelte b/yakit/svelte/Formify/Formify.svelte index c3c84aa16..84208d8fd 100644 --- a/yakit/svelte/Formify/Formify.svelte +++ b/yakit/svelte/Formify/Formify.svelte @@ -48,6 +48,14 @@ 'cardLayout': cardLayout }) + $: tileWrapperClasses = classNames( + 'card-content', + 'formify-tile-wrapper', + { + 'pt-1': ($$slots.header), + } + ); + className let isColLayout $: if(transformedSchema.columns){ @@ -101,7 +109,7 @@ - +
{#each transformedSchema.columns as colCfg}
@@ -119,7 +127,7 @@
{/each}
- +
{#if !($$slots.footer)} Cancel From 3d1dee8720021175d4f3a916a859717cea47d282 Mon Sep 17 00:00:00 2001 From: Joshua B Date: Sun, 6 Feb 2022 02:06:09 -0700 Subject: [PATCH 05/11] refactor and add quickpick example --- .../svelteDataList/simple/QuickFilter.svelte | 41 +++++ .../svelteDataList/simple/SimpleGrid.svelte | 3 +- src/styles/framework7/index.scss | 6 + yakit/svelte/{ => Buttons}/Button.svelte | 16 +- yakit/svelte/{ => Buttons}/Button7.svelte | 20 ++- yakit/svelte/Buttons/ButtonToggleGroup.svelte | 26 ++++ yakit/svelte/Buttons/Segmented.svelte | 77 ++++++++++ yakit/svelte/Buttons/index.js | 4 + yakit/svelte/DataApiList/Gridz.svelte | 4 +- .../DataApiList/toolbar/ListToolbar.svelte | 7 +- .../svelte/Formify/toolbar/FormToolbar.svelte | 141 ------------------ .../Formify/toolbar/ListOptionsPopover.svelte | 68 --------- .../svelte/Formify/toolbar/QuickFilter.svelte | 35 ----- yakit/svelte/f7-components.js | 2 +- yakit/svelte/index.js | 5 +- 15 files changed, 187 insertions(+), 268 deletions(-) create mode 100644 examples/demo/src/svelteDataList/simple/QuickFilter.svelte rename yakit/svelte/{ => Buttons}/Button.svelte (91%) rename yakit/svelte/{ => Buttons}/Button7.svelte (90%) create mode 100644 yakit/svelte/Buttons/ButtonToggleGroup.svelte create mode 100644 yakit/svelte/Buttons/Segmented.svelte create mode 100644 yakit/svelte/Buttons/index.js delete mode 100644 yakit/svelte/Formify/toolbar/FormToolbar.svelte delete mode 100644 yakit/svelte/Formify/toolbar/ListOptionsPopover.svelte delete mode 100644 yakit/svelte/Formify/toolbar/QuickFilter.svelte 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 5a53203d4..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/styles/framework7/index.scss b/src/styles/framework7/index.scss index 986e0a6b6..553375862 100644 --- a/src/styles/framework7/index.scss +++ b/src/styles/framework7/index.scss @@ -16,6 +16,12 @@ body { } :root { + /* Sync default color theme */ + --f7-theme-color: #395e84; + --f7-theme-color-rgb: 57, 94, 132; + --f7-theme-color-shade: #2d4a68; + --f7-theme-color-tint: #4572a0; + --f7-page-bg-color: #{cvar(body)}; --f7-tabbar-link-inactive-color: #{cvar(text, light)}; --f7-input-clear-button-color: var(--color-shade-20); diff --git a/yakit/svelte/Button.svelte b/yakit/svelte/Buttons/Button.svelte similarity index 91% rename from yakit/svelte/Button.svelte rename to yakit/svelte/Buttons/Button.svelte index c5b981ce2..89a08086a 100644 --- a/yakit/svelte/Button.svelte +++ b/yakit/svelte/Buttons/Button.svelte @@ -2,9 +2,9 @@ import { onMount, createEventDispatcher } from 'svelte' import { getIconClass } from '@yakit/ui/icon' import { isTruthy } from '@yakit/core/truthy' - import createRipple from "./utils/ripple.js"; + import createRipple from "../utils/ripple.js"; // import { classNames } from './utils'; - import Icon from './Icon.svelte' + import Icon from '../Icon.svelte' import { colorClasses, @@ -12,14 +12,14 @@ routerClasses, actionsAttrs, actionsClasses, - } from './shared/mixins'; - import { classNames, extend, isStringProp, plainText, createEmitter } from './shared/utils'; - import { restProps } from './shared/rest-props'; - import { useTooltip } from './shared/use-tooltip'; + } from '../shared/mixins'; + import { classNames, extend, isStringProp, plainText, createEmitter } from '../shared/utils'; + import { restProps } from '../shared/rest-props'; + import { useTooltip } from '../shared/use-tooltip'; // import { useRouteProps } from '../shared/use-route-props'; - import { useIcon } from './shared/use-icon'; + import { useIcon } from '../shared/use-icon'; - import { UseIcon, Preloader } from './index'; + import { UseIcon, Preloader } from '../index'; /** HTML tag to use for button (either 'a' or 'button') * @svelte-prop {String} tag=button diff --git a/yakit/svelte/Button7.svelte b/yakit/svelte/Buttons/Button7.svelte similarity index 90% rename from yakit/svelte/Button7.svelte rename to yakit/svelte/Buttons/Button7.svelte index 89a5967f8..beb6901e8 100644 --- a/yakit/svelte/Button7.svelte +++ b/yakit/svelte/Buttons/Button7.svelte @@ -1,3 +1,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/Gridz.svelte b/yakit/svelte/DataApiList/Gridz.svelte index 25e7cab81..60f3951f8 100644 --- a/yakit/svelte/DataApiList/Gridz.svelte +++ b/yakit/svelte/DataApiList/Gridz.svelte @@ -24,6 +24,8 @@ export let gridCtrl = undefined /** toolbar title */ export let title = undefined + /** the quickfilter buttons to add to toolbar */ + export let QuickFilter = undefined gridCtrl = new GridDataApiCtrl() @@ -107,7 +109,7 @@ {/if}
{#if ctx.toolbarOptions } - + {/if}
diff --git a/yakit/svelte/DataApiList/toolbar/ListToolbar.svelte b/yakit/svelte/DataApiList/toolbar/ListToolbar.svelte index 4e55762aa..7dcfd17b1 100644 --- a/yakit/svelte/DataApiList/toolbar/ListToolbar.svelte +++ b/yakit/svelte/DataApiList/toolbar/ListToolbar.svelte @@ -5,7 +5,6 @@ import { fade, fly } from "svelte/transition"; import {Button, Button7, Segmented} from '@yakit/svelte/index' import TbButton from '../../Toolbar/TbButton.svelte' - import QuickFilter from './QuickFilter.svelte' import { merge } from '@yakit/core/dash'; import { classNames } from '../../shared/utils' import ListOptionsPopover from './ListOptionsPopover.svelte' @@ -16,6 +15,9 @@ 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 @@ -111,8 +113,7 @@
- - +
diff --git a/yakit/svelte/Formify/toolbar/FormToolbar.svelte b/yakit/svelte/Formify/toolbar/FormToolbar.svelte deleted file mode 100644 index 6cc465448..000000000 --- a/yakit/svelte/Formify/toolbar/FormToolbar.svelte +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - -
-
- {#if $stateStore.hasSelected } -
-
- - - subdirectory_arrow_right -
- {#each filterVisible(opts.selectedButtons) as btnItem} - fireButtonClick(btnItem)}/> - {/each} -
-
- {/if} - {#each filterVisible(opts.leftButtons) as btnItem} - {#if btnItem.popoverId} - - {:else} - fireButtonClick(btnItem)}/> - {/if} - {/each} - - - {#if title} -
-
{title}
- {/if} -
- - - - - -
-
- - - - - {#if qSearchEntry } - - - - {/if} -
-
- - {#if opts.searchFormButton.class !== 'hidden' } -
-
- - - - diff --git a/yakit/svelte/Formify/toolbar/ListOptionsPopover.svelte b/yakit/svelte/Formify/toolbar/ListOptionsPopover.svelte deleted file mode 100644 index aa71b9608..000000000 --- a/yakit/svelte/Formify/toolbar/ListOptionsPopover.svelte +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - {#each displayMenutItems as item} - - - {item.material} - - - - {/each} - - - - - diff --git a/yakit/svelte/Formify/toolbar/QuickFilter.svelte b/yakit/svelte/Formify/toolbar/QuickFilter.svelte deleted file mode 100644 index 41ca5e11e..000000000 --- a/yakit/svelte/Formify/toolbar/QuickFilter.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - -
- - Open - Closed - All - -
- - - diff --git a/yakit/svelte/f7-components.js b/yakit/svelte/f7-components.js index f395d47cc..8f8c13391 100644 --- a/yakit/svelte/f7-components.js +++ b/yakit/svelte/f7-components.js @@ -45,7 +45,7 @@ export { default as TextEditor } from 'framework7-svelte/esm/svelte/text-editor. export { default as Preloader } from 'framework7-svelte/esm/svelte/preloader.svelte'; export { default as UseIcon } from 'framework7-svelte/esm/svelte/use-icon.svelte'; -export { default as Segmented } from 'framework7-svelte/esm/svelte/segmented.svelte'; +// export { default as Segmented } from 'framework7-svelte/esm/svelte/segmented.svelte'; // export { default as Row } from 'framework7-svelte/esm/svelte/row.svelte'; // export { default as Col } from 'framework7-svelte/esm/svelte/col.svelte'; diff --git a/yakit/svelte/index.js b/yakit/svelte/index.js index d7ea96cf1..bd68913c7 100644 --- a/yakit/svelte/index.js +++ b/yakit/svelte/index.js @@ -1,6 +1,7 @@ export { default as Avatar } from './Avatar.svelte'; -export { default as Button } from './Button.svelte'; -export { default as Button7 } from './Button7.svelte'; + +export * from './Buttons'; + export { default as Col } from './Col.svelte'; export { default as Columns } from './Columns.svelte'; export { default as Row } from './Columns.svelte'; From 9d28ff108c3d8bbf2d1298e1a4ba5f61965e3444 Mon Sep 17 00:00:00 2001 From: alexeyzvegintcev Date: Sun, 6 Feb 2022 18:20:13 +0200 Subject: [PATCH 06/11] Hide searchForrm on after search --- yakit/svelte/DataApiList/SearchForm.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/yakit/svelte/DataApiList/SearchForm.svelte b/yakit/svelte/DataApiList/SearchForm.svelte index a24e22ce6..60744aebd 100644 --- a/yakit/svelte/DataApiList/SearchForm.svelte +++ b/yakit/svelte/DataApiList/SearchForm.svelte @@ -75,6 +75,7 @@ export let onSearch = async (event) => { formContext.handleSubmit() + searchFormOpened = false } // setup isMulti defaults for selects From e7170ad6dc96e3e6d3fbb50936f7742f485189b7 Mon Sep 17 00:00:00 2001 From: Joshua B Date: Mon, 7 Feb 2022 11:10:22 -0700 Subject: [PATCH 07/11] update for icons and fix so links will work if nav class is applied --- examples/demo/src/config.router.js | 1 + .../svelteDataList/customer/RestGrid.svelte | 2 ++ src/gridz/makeListDataCtrl.js | 2 +- src/ng/common/directives/empty-links.js | 19 ------------------- src/ng/common/directives/index.js | 1 - src/ng/sidenav/ag-sidenav.html | 2 +- src/ng/sidenav/ag-sidenav.js | 2 +- src/ng/uirouter/stateHelperInit.js | 14 +++++++------- src/styles/framework7/index.scss | 10 +++++++--- src/styles/init/typography.scss | 6 ++++-- yakit/svelte/Toolbar/TbButton.svelte | 10 +++++++--- yakit/svelte/framework7.js | 6 ++++++ yakit/ui/icon.js | 2 +- 13 files changed, 38 insertions(+), 39 deletions(-) delete mode 100644 src/ng/common/directives/empty-links.js 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/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/src/gridz/makeListDataCtrl.js b/src/gridz/makeListDataCtrl.js index 4039fc6f4..7feec24f9 100644 --- a/src/gridz/makeListDataCtrl.js +++ b/src/gridz/makeListDataCtrl.js @@ -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' } 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/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 @@