From a2eb6709f86045dc457a31a248829022e66a805b Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Mon, 16 Aug 2021 11:58:42 +0200 Subject: [PATCH 01/33] setup karma and rollup --- .gitignore | 36 +++++++------ js/src/bundle.js | 1 + js/src/widget.js | 42 ++++++++++++++++ js/tests/test_test.js | 3 ++ karma.conf.js | 50 +++++++++++++++++++ package.json | 13 +++++ rollup.conf.js | 50 +++++++++++++++++++ scripts/clean.sh | 16 ++++++ scripts/install.sh | 28 +++++++++++ scripts/karma.sh | 6 +++ scripts/rollup.sh | 5 ++ scripts/watch.sh | 11 ++++ .../multiselect/yafowil.widget.multiselect.js | 15 ++++++ .../yafowil.widget.multiselect.js.map | 1 + .../yafowil.widget.multiselect.min.js | 2 + .../yafowil.widget.multiselect.min.js.map | 1 + 16 files changed, 266 insertions(+), 14 deletions(-) create mode 100644 js/src/bundle.js create mode 100644 js/src/widget.js create mode 100644 js/tests/test_test.js create mode 100644 karma.conf.js create mode 100644 package.json create mode 100644 rollup.conf.js create mode 100755 scripts/clean.sh create mode 100755 scripts/install.sh create mode 100755 scripts/karma.sh create mode 100755 scripts/rollup.sh create mode 100755 scripts/watch.sh create mode 100644 src/yafowil/widget/multiselect/yafowil.widget.multiselect.js create mode 100644 src/yafowil/widget/multiselect/yafowil.widget.multiselect.js.map create mode 100644 src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js create mode 100644 src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js.map diff --git a/.gitignore b/.gitignore index f5f6b26..e0bcb01 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,26 @@ -*~ -*#* + +*.egg-info +*.mo *.pyc *.pyo -*.mo -*.egg-info -/develop-eggs/ -/parts/ -/bin/ -/eggs/ -/downloads/ -/var/ -/dist/ -/.installed.cfg -/.pydevproject -/.project +*#* +*~ /.DS_Store +/.installed.cfg /.mr.developer.cfg +/.project +/.pydevproject +/bin/ +/develop-eggs/ +/dist/ +/downloads/ +/eggs/ +/karma/ +/lib/ +/lib64 +/node_modules/ +/package-lock.json +/parts/ +/pyvenv.cfg +/share/ +/var/ \ No newline at end of file diff --git a/js/src/bundle.js b/js/src/bundle.js new file mode 100644 index 0000000..acda54d --- /dev/null +++ b/js/src/bundle.js @@ -0,0 +1 @@ +import $ from 'jquery'; \ No newline at end of file diff --git a/js/src/widget.js b/js/src/widget.js new file mode 100644 index 0000000..82b7659 --- /dev/null +++ b/js/src/widget.js @@ -0,0 +1,42 @@ +/* + * yafowil multiselect widget + * + * Optional: bdajax + */ + +if (typeof(window['yafowil']) == "undefined") yafowil = {}; + +(function($) { + + $(document).ready(function() { + // initial binding + yafowil.multiselect.binder(); + + // add after ajax binding if bdajax present + if (typeof(window['bdajax']) != "undefined") { + $.extend(bdajax.binders, { + multiselect_binder: yafowil.multiselect.binder + }); + } + }); + + $.extend(yafowil, { + + multiselect: { + + binder: function(context) { + + $('select.multiselect', context).each(function(event) { + + var id = $(this).attr('id'); + var element = $('#' + id); + element.multiSelect(); + + }); + + } + } + }); + + +})(jQuery); diff --git a/js/tests/test_test.js b/js/tests/test_test.js new file mode 100644 index 0000000..7259cde --- /dev/null +++ b/js/tests/test_test.js @@ -0,0 +1,3 @@ +QUnit.test('test', assert => { + assert.ok(true); +}); \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..39a9f9f --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,50 @@ +// chromium binary +process.env.CHROME_BIN = '/usr/bin/chromium'; + +// karma config +module.exports = function(config) { + config.set({ + basePath: 'karma', + frameworks: [ + 'qunit' + ], + files: [{ + pattern: '../node_modules/jquery/src/**/*.js', + type: 'module', + included: false + }, { + pattern: '../js/src/*.js', + type: 'module', + included: false + }, { + pattern: '../js/tests/test_*.js', + type: 'module' + }], + browsers: [ + 'ChromeHeadless' + ], + singlerun: true, + reporters: [ + 'progress', + 'coverage' + ], + preprocessors: { + '../js/src/*.js': [ + 'coverage', + 'module-resolver' + ], + '../js/tests/*.js': [ + 'coverage', + 'module-resolver' + ] + }, + moduleResolverPreprocessor: { + addExtension: 'js', + customResolver: null, + ecmaVersion: 6, + aliases: { + jquery: '../node_modules/jquery/src/jquery.js' + } + } + }); +}; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..e5fd799 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "devDependencies": { + "karma": "^4.4.1", + "karma-chrome-launcher": "^3.1.0", + "karma-coverage": "^2.0.3", + "karma-module-resolver-preprocessor": "^1.1.2", + "karma-qunit": "^4.1.2", + "qunit": "^2.16.0", + "rollup": "^2.56.2", + "rollup-plugin-cleanup": "^3.2.1", + "rollup-plugin-terser": "^7.0.2" + } +} diff --git a/rollup.conf.js b/rollup.conf.js new file mode 100644 index 0000000..2c4d970 --- /dev/null +++ b/rollup.conf.js @@ -0,0 +1,50 @@ +import cleanup from 'rollup-plugin-cleanup'; +import {terser} from 'rollup-plugin-terser'; + +const outro = ` +if (window.yafowil === undefined) { + window.yafowil = {}; +} + +window.yafowil.multiselect = exports; +`; + +export default args => { + let conf = { + input: 'js/src/bundle.js', + plugins: [ + cleanup() + ], + output: [{ + file: 'src/yafowil/widget/multiselect/yafowil.widget.multiselect.js', + format: 'iife', + outro: outro, + globals: { + jquery: 'jQuery' + }, + interop: 'default', + sourcemap: true, + sourcemapExcludeSources: true + }], + external: [ + 'jquery' + ] + }; + if (args.configDebug !== true) { + conf.output.push({ + file: 'src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js', + format: 'iife', + plugins: [ + terser() + ], + outro: outro, + globals: { + jquery: 'jQuery' + }, + interop: 'default', + sourcemap: true, + sourcemapExcludeSources: true + }); + } + return conf; +}; diff --git a/scripts/clean.sh b/scripts/clean.sh new file mode 100755 index 0000000..df6781b --- /dev/null +++ b/scripts/clean.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# +# Clean development environment. + +set -e + +to_remove=( + bin build bundle dist include karma lib lib64 node_modules + package-lock.json pyvenv.cfg share +) + +for item in "${to_remove[@]}"; do + if [ -e "$item" ]; then + rm -r "$item" + fi +done diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100755 index 0000000..ef6712d --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# +# Install development environment. + +set -e + +./scripts/clean.sh + +if ! which npm &> /dev/null; then + sudo apt-get install npm +fi + +npm --save-dev install \ + qunit \ + karma \ + karma-qunit \ + karma-coverage \ + karma-chrome-launcher \ + karma-module-resolver-preprocessor \ + rollup \ + rollup-plugin-cleanup \ + rollup-plugin-terser + +npm --no-save install https://github.com/jquery/jquery#main + +python3 -m venv . +./bin/pip install wheel +./bin/pip install -e .[test] diff --git a/scripts/karma.sh b/scripts/karma.sh new file mode 100755 index 0000000..3f5bf0f --- /dev/null +++ b/scripts/karma.sh @@ -0,0 +1,6 @@ +#!/bin/bash +# +# Run karma tests. + +clear +node_modules/karma/bin/karma start karma.conf.js diff --git a/scripts/rollup.sh b/scripts/rollup.sh new file mode 100755 index 0000000..e272e23 --- /dev/null +++ b/scripts/rollup.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# +# Create JS bundles. + +node_modules/rollup/dist/bin/rollup --config rollup.conf.js "$@" diff --git a/scripts/watch.sh b/scripts/watch.sh new file mode 100755 index 0000000..1973006 --- /dev/null +++ b/scripts/watch.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# +# Watch source directory for changes and run rollup.sh. +# +# Install dependencies: +# sudo apt-install inotify-tools + +while res=$(inotifywait -e create -e modify -e delete -e move ./js/src); do + echo "changed: $res, run rollup" + ./scripts/rollup.sh --configDebug +done diff --git a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js new file mode 100644 index 0000000..12ef155 --- /dev/null +++ b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js @@ -0,0 +1,15 @@ +(function () { + 'use strict'; + + + + + if (window.yafowil === undefined) { + window.yafowil = {}; + } + + window.yafowil.multiselect = exports; + + +}()); +//# sourceMappingURL=yafowil.widget.multiselect.js.map diff --git a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js.map b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js.map new file mode 100644 index 0000000..6ca87c1 --- /dev/null +++ b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js.map @@ -0,0 +1 @@ +{"version":3,"file":"yafowil.widget.multiselect.js","sources":[],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js new file mode 100644 index 0000000..73cb40f --- /dev/null +++ b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js @@ -0,0 +1,2 @@ +!function(){"use strict";void 0===window.yafowil&&(window.yafowil={}),window.yafowil.multiselect=exports}(); +//# sourceMappingURL=yafowil.widget.multiselect.min.js.map diff --git a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js.map b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js.map new file mode 100644 index 0000000..e3c403d --- /dev/null +++ b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"yafowil.widget.multiselect.min.js","sources":[],"sourcesContent":null,"names":[],"mappings":""} \ No newline at end of file From cdd0961b45e8ccf6f78ee2a0e6ad5d0ff8f05c4f Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Thu, 20 Jan 2022 12:54:00 +0100 Subject: [PATCH 02/33] es6 structure --- js/src/bundle.js | 14 ++++- js/src/widget.js | 56 +++++------------- package.json | 10 ++-- rollup.conf.js | 4 +- .../widget/multiselect/resources/widget.css | 6 ++ .../widget/multiselect/resources/widget.js | 57 +++++++++---------- .../multiselect/yafowil.widget.multiselect.js | 15 ----- .../yafowil.widget.multiselect.js.map | 1 - .../yafowil.widget.multiselect.min.js | 2 - .../yafowil.widget.multiselect.min.js.map | 1 - 10 files changed, 67 insertions(+), 99 deletions(-) delete mode 100644 src/yafowil/widget/multiselect/yafowil.widget.multiselect.js delete mode 100644 src/yafowil/widget/multiselect/yafowil.widget.multiselect.js.map delete mode 100644 src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js delete mode 100644 src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js.map diff --git a/js/src/bundle.js b/js/src/bundle.js index acda54d..56a9a0f 100644 --- a/js/src/bundle.js +++ b/js/src/bundle.js @@ -1 +1,13 @@ -import $ from 'jquery'; \ No newline at end of file +import $ from 'jquery'; + +import {MultiselectWidget} from './widget.js'; + +export * from './widget.js'; + +$(function() { + if (window.ts !== undefined) { + ts.ajax.register(MultiselectWidget.initialize, true); + } else { + MultiselectWidget.initialize(); + } +}); diff --git a/js/src/widget.js b/js/src/widget.js index 82b7659..982ca13 100644 --- a/js/src/widget.js +++ b/js/src/widget.js @@ -1,42 +1,14 @@ -/* - * yafowil multiselect widget - * - * Optional: bdajax - */ - -if (typeof(window['yafowil']) == "undefined") yafowil = {}; - -(function($) { - - $(document).ready(function() { - // initial binding - yafowil.multiselect.binder(); - - // add after ajax binding if bdajax present - if (typeof(window['bdajax']) != "undefined") { - $.extend(bdajax.binders, { - multiselect_binder: yafowil.multiselect.binder - }); - } - }); - - $.extend(yafowil, { - - multiselect: { - - binder: function(context) { - - $('select.multiselect', context).each(function(event) { - - var id = $(this).attr('id'); - var element = $('#' + id); - element.multiSelect(); - - }); - - } - } - }); - - -})(jQuery); +import $ from 'jquery'; + +export class MultiselectWidget { + static initialize(context) { + $('select.multiselect', context).each(function() { + new MultiselectWidget($(this)); + }); + } + + constructor(elem) { + this.elem = elem; + this.elem.multiSelect(); + } +} diff --git a/package.json b/package.json index e5fd799..2900cd1 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "devDependencies": { - "karma": "^4.4.1", + "karma": "^6.3.11", "karma-chrome-launcher": "^3.1.0", - "karma-coverage": "^2.0.3", - "karma-module-resolver-preprocessor": "^1.1.2", + "karma-coverage": "^2.1.0", + "karma-module-resolver-preprocessor": "^1.1.3", "karma-qunit": "^4.1.2", - "qunit": "^2.16.0", - "rollup": "^2.56.2", + "qunit": "^2.17.2", + "rollup": "^2.64.0", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-terser": "^7.0.2" } diff --git a/rollup.conf.js b/rollup.conf.js index 2c4d970..73318a4 100644 --- a/rollup.conf.js +++ b/rollup.conf.js @@ -16,7 +16,7 @@ export default args => { cleanup() ], output: [{ - file: 'src/yafowil/widget/multiselect/yafowil.widget.multiselect.js', + file: 'src/yafowil/widget/multiselect/resources/widget.js', format: 'iife', outro: outro, globals: { @@ -32,7 +32,7 @@ export default args => { }; if (args.configDebug !== true) { conf.output.push({ - file: 'src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js', + file: 'src/yafowil/widget/multiselect/resources/widget.min.js', format: 'iife', plugins: [ terser() diff --git a/src/yafowil/widget/multiselect/resources/widget.css b/src/yafowil/widget/multiselect/resources/widget.css index 25dcb6c..2251fd5 100644 --- a/src/yafowil/widget/multiselect/resources/widget.css +++ b/src/yafowil/widget/multiselect/resources/widget.css @@ -2,3 +2,9 @@ iframe.multiselect-sandbox { width:100% !important; height:30em !important; } + + +.ms-container .ms-selectable li.ms-hover, .ms-container .ms-selection li.ms-hover { + background-color: #b1dbfb; + color: black; +} \ No newline at end of file diff --git a/src/yafowil/widget/multiselect/resources/widget.js b/src/yafowil/widget/multiselect/resources/widget.js index 82b7659..d41f5c7 100644 --- a/src/yafowil/widget/multiselect/resources/widget.js +++ b/src/yafowil/widget/multiselect/resources/widget.js @@ -1,42 +1,39 @@ -/* - * yafowil multiselect widget - * - * Optional: bdajax - */ +(function (exports, $) { + 'use strict'; -if (typeof(window['yafowil']) == "undefined") yafowil = {}; - -(function($) { - - $(document).ready(function() { - // initial binding - yafowil.multiselect.binder(); - - // add after ajax binding if bdajax present - if (typeof(window['bdajax']) != "undefined") { - $.extend(bdajax.binders, { - multiselect_binder: yafowil.multiselect.binder + class MultiselectWidget { + static initialize(context) { + $('select.multiselect', context).each(function() { + new MultiselectWidget($(this)); }); } - }); + constructor(elem) { + this.elem = elem; + this.elem.multiSelect(); + } + } - $.extend(yafowil, { + $(function() { + if (window.ts !== undefined) { + ts.ajax.register(MultiselectWidget.initialize, true); + } else { + MultiselectWidget.initialize(); + } + }); - multiselect: { + exports.MultiselectWidget = MultiselectWidget; - binder: function(context) { + Object.defineProperty(exports, '__esModule', { value: true }); - $('select.multiselect', context).each(function(event) { - var id = $(this).attr('id'); - var element = $('#' + id); - element.multiSelect(); + if (window.yafowil === undefined) { + window.yafowil = {}; + } - }); + window.yafowil.multiselect = exports; - } - } - }); + return exports; -})(jQuery); +})({}, jQuery); +//# sourceMappingURL=widget.js.map diff --git a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js deleted file mode 100644 index 12ef155..0000000 --- a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js +++ /dev/null @@ -1,15 +0,0 @@ -(function () { - 'use strict'; - - - - - if (window.yafowil === undefined) { - window.yafowil = {}; - } - - window.yafowil.multiselect = exports; - - -}()); -//# sourceMappingURL=yafowil.widget.multiselect.js.map diff --git a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js.map b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js.map deleted file mode 100644 index 6ca87c1..0000000 --- a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"yafowil.widget.multiselect.js","sources":[],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js deleted file mode 100644 index 73cb40f..0000000 --- a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(){"use strict";void 0===window.yafowil&&(window.yafowil={}),window.yafowil.multiselect=exports}(); -//# sourceMappingURL=yafowil.widget.multiselect.min.js.map diff --git a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js.map b/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js.map deleted file mode 100644 index e3c403d..0000000 --- a/src/yafowil/widget/multiselect/yafowil.widget.multiselect.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"yafowil.widget.multiselect.min.js","sources":[],"sourcesContent":null,"names":[],"mappings":""} \ No newline at end of file From e1cb3c502cecf7e3f6584627d83fd14acad50b02 Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Thu, 20 Jan 2022 12:54:39 +0100 Subject: [PATCH 03/33] rollup output to resources --- src/yafowil/widget/multiselect/resources/widget.js.map | 1 + src/yafowil/widget/multiselect/resources/widget.min.js | 2 ++ src/yafowil/widget/multiselect/resources/widget.min.js.map | 1 + 3 files changed, 4 insertions(+) create mode 100644 src/yafowil/widget/multiselect/resources/widget.js.map create mode 100644 src/yafowil/widget/multiselect/resources/widget.min.js create mode 100644 src/yafowil/widget/multiselect/resources/widget.min.js.map diff --git a/src/yafowil/widget/multiselect/resources/widget.js.map b/src/yafowil/widget/multiselect/resources/widget.js.map new file mode 100644 index 0000000..c120b23 --- /dev/null +++ b/src/yafowil/widget/multiselect/resources/widget.js.map @@ -0,0 +1 @@ +{"version":3,"file":"widget.js","sources":["../../../../../js/src/widget.js","../../../../../js/src/bundle.js"],"sourcesContent":null,"names":[],"mappings":";;;IAEO,MAAM,iBAAiB,CAAC;IAC/B,IAAI,OAAO,UAAU,CAAC,OAAO,EAAE;IAC/B,QAAQ,CAAC,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW;IACzD,YAAY,IAAI,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,SAAS,CAAC,CAAC;IACX,KAAK;IAEL,IAAI,WAAW,CAAC,IAAI,EAAE;IACtB,QAAQ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACzB,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,KAAK;IACL;;ICPA,CAAC,CAAC,WAAW;IACb,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE;IACjC,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC7D,KAAK,MAAM;IACX,QAAQ,iBAAiB,CAAC,UAAU,EAAE,CAAC;IACvC,KAAK;IACL,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/src/yafowil/widget/multiselect/resources/widget.min.js b/src/yafowil/widget/multiselect/resources/widget.min.js new file mode 100644 index 0000000..5bccb5c --- /dev/null +++ b/src/yafowil/widget/multiselect/resources/widget.min.js @@ -0,0 +1,2 @@ +!function(i,e){"use strict";class t{static initialize(i){e("select.multiselect",i).each((function(){new t(e(this))}))}constructor(i){this.elem=i,this.elem.multiSelect()}}e((function(){void 0!==window.ts?ts.ajax.register(t.initialize,!0):t.initialize()})),i.MultiselectWidget=t,Object.defineProperty(i,"__esModule",{value:!0}),void 0===window.yafowil&&(window.yafowil={}),window.yafowil.multiselect=i}({},jQuery); +//# sourceMappingURL=widget.min.js.map diff --git a/src/yafowil/widget/multiselect/resources/widget.min.js.map b/src/yafowil/widget/multiselect/resources/widget.min.js.map new file mode 100644 index 0000000..9e524e6 --- /dev/null +++ b/src/yafowil/widget/multiselect/resources/widget.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"widget.min.js","sources":["../../../../../js/src/widget.js","../../../../../js/src/bundle.js"],"sourcesContent":null,"names":["MultiselectWidget","static","context","$","each","this","constructor","elem","multiSelect","undefined","window","ts","ajax","register","initialize"],"mappings":"4BAEO,MAAMA,EACTC,kBAAkBC,GACdC,EAAE,qBAAsBD,GAASE,MAAK,WAClC,IAAIJ,EAAkBG,EAAEE,UAIhCC,YAAYC,GACRF,KAAKE,KAAOA,EACZF,KAAKE,KAAKC,eCLlBL,GAAE,gBACoBM,IAAdC,OAAOC,GACPA,GAAGC,KAAKC,SAASb,EAAkBc,YAAY,GAE/Cd,EAAkBc"} \ No newline at end of file From 4bf27ddf5e67f59b54ad78de7a4f2d2c95709ba7 Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Fri, 21 Jan 2022 12:14:02 +0100 Subject: [PATCH 04/33] move karma and rollup conf --- .gitignore | 2 +- karma.conf.js => js/karma.conf.js | 12 ++++++------ rollup.conf.js => js/rollup.conf.js | 0 scripts/karma.sh | 2 +- scripts/rollup.sh | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) rename karma.conf.js => js/karma.conf.js (77%) rename rollup.conf.js => js/rollup.conf.js (100%) diff --git a/.gitignore b/.gitignore index e0bcb01..23d9f84 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,7 @@ /dist/ /downloads/ /eggs/ -/karma/ +/js/karma/ /lib/ /lib64 /node_modules/ diff --git a/karma.conf.js b/js/karma.conf.js similarity index 77% rename from karma.conf.js rename to js/karma.conf.js index 39a9f9f..460c024 100644 --- a/karma.conf.js +++ b/js/karma.conf.js @@ -9,15 +9,15 @@ module.exports = function(config) { 'qunit' ], files: [{ - pattern: '../node_modules/jquery/src/**/*.js', + pattern: '../../node_modules/jquery/src/**/*.js', type: 'module', included: false }, { - pattern: '../js/src/*.js', + pattern: '../src/*.js', type: 'module', included: false }, { - pattern: '../js/tests/test_*.js', + pattern: '../tests/test_*.js', type: 'module' }], browsers: [ @@ -29,11 +29,11 @@ module.exports = function(config) { 'coverage' ], preprocessors: { - '../js/src/*.js': [ + '../src/*.js': [ 'coverage', 'module-resolver' ], - '../js/tests/*.js': [ + '../tests/*.js': [ 'coverage', 'module-resolver' ] @@ -43,7 +43,7 @@ module.exports = function(config) { customResolver: null, ecmaVersion: 6, aliases: { - jquery: '../node_modules/jquery/src/jquery.js' + jquery: '../../node_modules/jquery/src/jquery.js' } } }); diff --git a/rollup.conf.js b/js/rollup.conf.js similarity index 100% rename from rollup.conf.js rename to js/rollup.conf.js diff --git a/scripts/karma.sh b/scripts/karma.sh index 3f5bf0f..b04cf41 100755 --- a/scripts/karma.sh +++ b/scripts/karma.sh @@ -3,4 +3,4 @@ # Run karma tests. clear -node_modules/karma/bin/karma start karma.conf.js +node_modules/karma/bin/karma start js/karma.conf.js diff --git a/scripts/rollup.sh b/scripts/rollup.sh index e272e23..ba06613 100755 --- a/scripts/rollup.sh +++ b/scripts/rollup.sh @@ -2,4 +2,4 @@ # # Create JS bundles. -node_modules/rollup/dist/bin/rollup --config rollup.conf.js "$@" +node_modules/rollup/dist/bin/rollup --config js/rollup.conf.js "$@" From 22c3d4e634ca9b306f7d2281aa8e6f722fbfea3b Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Tue, 15 Mar 2022 08:59:56 +0100 Subject: [PATCH 05/33] housekeeping --- .gitignore | 1 + CHANGES.rst | 5 +- LICENSE.rst | 2 +- README.rst | 2 + bootstrap.py | 170 ------------------ buildout.cfg | 32 ---- js/rollup.conf.js | 16 +- package.json | 10 +- scripts/clean.sh | 4 +- scripts/install.sh | 2 + setup.py | 2 +- .../widget/multiselect/resources/widget.js | 3 +- .../multiselect/resources/widget.js.map | 1 - .../multiselect/resources/widget.min.js | 3 +- .../multiselect/resources/widget.min.js.map | 1 - 15 files changed, 27 insertions(+), 227 deletions(-) delete mode 100644 bootstrap.py delete mode 100644 buildout.cfg delete mode 100644 src/yafowil/widget/multiselect/resources/widget.js.map delete mode 100644 src/yafowil/widget/multiselect/resources/widget.min.js.map diff --git a/.gitignore b/.gitignore index 23d9f84..e88fecf 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ *.pyo *#* *~ +/.coverage /.DS_Store /.installed.cfg /.mr.developer.cfg diff --git a/CHANGES.rst b/CHANGES.rst index 0d8edb3..b1c4f5d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,10 +1,11 @@ Changes ======= -1.4 (unreleased) +2.0 (unreleased) ---------------- -- No changes yet. +- Rewrite JavaScript using ES6. + [lenadax] 1.3 (2018-07-16) diff --git a/LICENSE.rst b/LICENSE.rst index 01c1de3..f1304c3 100644 --- a/LICENSE.rst +++ b/LICENSE.rst @@ -2,7 +2,7 @@ License ======= Copyright (c) 2012-2021, BlueDynamics Alliance, Austria, Germany, Switzerland -Copyright (c) 2021, Yafowil Contributors +Copyright (c) 2021-2022, Yafowil Contributors All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.rst b/README.rst index 150190e..43b2039 100644 --- a/README.rst +++ b/README.rst @@ -24,3 +24,5 @@ Contributors - Robert Niederreiter - Georg Bernhard + +- Lena Daxenbichler diff --git a/bootstrap.py b/bootstrap.py deleted file mode 100644 index f78186f..0000000 --- a/bootstrap.py +++ /dev/null @@ -1,170 +0,0 @@ -############################################################################## -# -# Copyright (c) 2006 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Bootstrap a buildout-based project - -Simply run this script in a directory containing a buildout.cfg. -The script accepts buildout command-line options, so you can -use the -c option to specify an alternate configuration file. -""" - -import os -import shutil -import sys -import tempfile - -from optparse import OptionParser - -tmpeggs = tempfile.mkdtemp() - -usage = '''\ -[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options] - -Bootstraps a buildout-based project. - -Simply run this script in a directory containing a buildout.cfg, using the -Python that you want bin/buildout to use. - -Note that by using --find-links to point to local resources, you can keep -this script from going over the network. -''' - -parser = OptionParser(usage=usage) -parser.add_option("-v", "--version", help="use a specific zc.buildout version") - -parser.add_option("-t", "--accept-buildout-test-releases", - dest='accept_buildout_test_releases', - action="store_true", default=False, - help=("Normally, if you do not specify a --version, the " - "bootstrap script and buildout gets the newest " - "*final* versions of zc.buildout and its recipes and " - "extensions for you. If you use this flag, " - "bootstrap and buildout will get the newest releases " - "even if they are alphas or betas.")) -parser.add_option("-c", "--config-file", - help=("Specify the path to the buildout configuration " - "file to be used.")) -parser.add_option("-f", "--find-links", - help=("Specify a URL to search for buildout releases")) - - -options, args = parser.parse_args() - -###################################################################### -# load/install setuptools - -to_reload = False -try: - import pkg_resources - import setuptools -except ImportError: - ez = {} - - try: - from urllib.request import urlopen - except ImportError: - from urllib2 import urlopen - - # XXX use a more permanent ez_setup.py URL when available. - exec(urlopen('https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py' - ).read(), ez) - setup_args = dict(to_dir=tmpeggs, download_delay=0) - ez['use_setuptools'](**setup_args) - - if to_reload: - reload(pkg_resources) - import pkg_resources - # This does not (always?) update the default working set. We will - # do it. - for path in sys.path: - if path not in pkg_resources.working_set.entries: - pkg_resources.working_set.add_entry(path) - -###################################################################### -# Install buildout - -ws = pkg_resources.working_set - -cmd = [sys.executable, '-c', - 'from setuptools.command.easy_install import main; main()', - '-mZqNxd', tmpeggs] - -find_links = os.environ.get( - 'bootstrap-testing-find-links', - options.find_links or - ('http://downloads.buildout.org/' - if options.accept_buildout_test_releases else None) - ) -if find_links: - cmd.extend(['-f', find_links]) - -setuptools_path = ws.find( - pkg_resources.Requirement.parse('setuptools')).location - -requirement = 'zc.buildout' -version = options.version -if version is None and not options.accept_buildout_test_releases: - # Figure out the most recent final version of zc.buildout. - import setuptools.package_index - _final_parts = '*final-', '*final' - - def _final_version(parsed_version): - for part in parsed_version: - if (part[:1] == '*') and (part not in _final_parts): - return False - return True - index = setuptools.package_index.PackageIndex( - search_path=[setuptools_path]) - if find_links: - index.add_find_links((find_links,)) - req = pkg_resources.Requirement.parse(requirement) - if index.obtain(req) is not None: - best = [] - bestv = None - for dist in index[req.project_name]: - distv = dist.parsed_version - if _final_version(distv): - if bestv is None or distv > bestv: - best = [dist] - bestv = distv - elif distv == bestv: - best.append(dist) - if best: - best.sort() - version = best[-1].version -if version: - requirement = '=='.join((requirement, version)) -cmd.append(requirement) - -import subprocess -if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=setuptools_path)) != 0: - raise Exception( - "Failed to execute command:\n%s", - repr(cmd)[1:-1]) - -###################################################################### -# Import and run buildout - -ws.add_entry(tmpeggs) -ws.require(requirement) -import zc.buildout.buildout - -if not [a for a in args if '=' not in a]: - args.append('bootstrap') - -# if -c was provided, we push it back into args for buildout' main function -if options.config_file is not None: - args[0:0] = ['-c', options.config_file] - -zc.buildout.buildout.main(args) -shutil.rmtree(tmpeggs) diff --git a/buildout.cfg b/buildout.cfg deleted file mode 100644 index 8e26a69..0000000 --- a/buildout.cfg +++ /dev/null @@ -1,32 +0,0 @@ -[buildout] -parts = test coverage py -develop = . - -extensions = mr.developer -sources-dir = ${buildout:directory}/devsrc -always-checkout = force -auto-checkout = * - -[remotes] -cs = git://github.com/conestack -cs_push = git@github.com:conestack - -[sources] -yafowil = git ${remotes:cs}/yafowil.git pushurl=${remotes:cs_push}/yafowil.git - -[test] -recipe = zc.recipe.testrunner -eggs = - yafowil[test] - yafowil.widget.multiselect[test] -defaults = ['--auto-color', '--auto-progress'] - -[coverage] -recipe = zc.recipe.testrunner -eggs = ${test:eggs} -defaults = ['--coverage', '../../coverage', '-v', '--auto-progress'] - -[py] -recipe = zc.recipe.egg -eggs = ${test:eggs} -interpreter = py diff --git a/js/rollup.conf.js b/js/rollup.conf.js index 73318a4..3dfa6b3 100644 --- a/js/rollup.conf.js +++ b/js/rollup.conf.js @@ -1,6 +1,8 @@ import cleanup from 'rollup-plugin-cleanup'; import {terser} from 'rollup-plugin-terser'; +const out_dir = 'src/yafowil/widget/multiselect/resources'; + const outro = ` if (window.yafowil === undefined) { window.yafowil = {}; @@ -16,15 +18,14 @@ export default args => { cleanup() ], output: [{ - file: 'src/yafowil/widget/multiselect/resources/widget.js', + name: 'yafowil_multiselect', + file: `${out_dir}/widget.js`, format: 'iife', outro: outro, globals: { jquery: 'jQuery' }, - interop: 'default', - sourcemap: true, - sourcemapExcludeSources: true + interop: 'default' }], external: [ 'jquery' @@ -32,7 +33,8 @@ export default args => { }; if (args.configDebug !== true) { conf.output.push({ - file: 'src/yafowil/widget/multiselect/resources/widget.min.js', + name: 'yafowil_multiselect', + file: `${out_dir}/widget.min.js`, format: 'iife', plugins: [ terser() @@ -41,9 +43,7 @@ export default args => { globals: { jquery: 'jQuery' }, - interop: 'default', - sourcemap: true, - sourcemapExcludeSources: true + interop: 'default' }); } return conf; diff --git a/package.json b/package.json index 2900cd1..161c63a 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "devDependencies": { - "karma": "^6.3.11", - "karma-chrome-launcher": "^3.1.0", - "karma-coverage": "^2.1.0", + "karma": "^6.3.17", + "karma-chrome-launcher": "^3.1.1", + "karma-coverage": "^2.2.0", "karma-module-resolver-preprocessor": "^1.1.3", "karma-qunit": "^4.1.2", - "qunit": "^2.17.2", - "rollup": "^2.64.0", + "qunit": "^2.18.0", + "rollup": "^2.70.1", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-terser": "^7.0.2" } diff --git a/scripts/clean.sh b/scripts/clean.sh index df6781b..43904b1 100755 --- a/scripts/clean.sh +++ b/scripts/clean.sh @@ -5,8 +5,8 @@ set -e to_remove=( - bin build bundle dist include karma lib lib64 node_modules - package-lock.json pyvenv.cfg share + .coverage bin dist include htmlcov js/karma lib64 lib + node_modules package-lock.json pyvenv.cfg share ) for item in "${to_remove[@]}"; do diff --git a/scripts/install.sh b/scripts/install.sh index ef6712d..c2ec577 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -25,4 +25,6 @@ npm --no-save install https://github.com/jquery/jquery#main python3 -m venv . ./bin/pip install wheel +./bin/pip install coverage +./bin/pip install yafowil[test] ./bin/pip install -e .[test] diff --git a/setup.py b/setup.py index 70988fa..1b84658 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ def read_file(name): return f.read() -version = '1.4.dev0' +version = '2.0.dev0' shortdesc = 'multiselect widget for YAFOWIL' longdesc = '\n\n'.join([read_file(name) for name in [ 'README.rst', diff --git a/src/yafowil/widget/multiselect/resources/widget.js b/src/yafowil/widget/multiselect/resources/widget.js index d41f5c7..fcfa999 100644 --- a/src/yafowil/widget/multiselect/resources/widget.js +++ b/src/yafowil/widget/multiselect/resources/widget.js @@ -1,4 +1,4 @@ -(function (exports, $) { +var yafowil_multiselect = (function (exports, $) { 'use strict'; class MultiselectWidget { @@ -36,4 +36,3 @@ return exports; })({}, jQuery); -//# sourceMappingURL=widget.js.map diff --git a/src/yafowil/widget/multiselect/resources/widget.js.map b/src/yafowil/widget/multiselect/resources/widget.js.map deleted file mode 100644 index c120b23..0000000 --- a/src/yafowil/widget/multiselect/resources/widget.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"widget.js","sources":["../../../../../js/src/widget.js","../../../../../js/src/bundle.js"],"sourcesContent":null,"names":[],"mappings":";;;IAEO,MAAM,iBAAiB,CAAC;IAC/B,IAAI,OAAO,UAAU,CAAC,OAAO,EAAE;IAC/B,QAAQ,CAAC,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW;IACzD,YAAY,IAAI,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,SAAS,CAAC,CAAC;IACX,KAAK;IAEL,IAAI,WAAW,CAAC,IAAI,EAAE;IACtB,QAAQ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACzB,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,KAAK;IACL;;ICPA,CAAC,CAAC,WAAW;IACb,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE;IACjC,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC7D,KAAK,MAAM;IACX,QAAQ,iBAAiB,CAAC,UAAU,EAAE,CAAC;IACvC,KAAK;IACL,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/src/yafowil/widget/multiselect/resources/widget.min.js b/src/yafowil/widget/multiselect/resources/widget.min.js index 5bccb5c..6939a6a 100644 --- a/src/yafowil/widget/multiselect/resources/widget.min.js +++ b/src/yafowil/widget/multiselect/resources/widget.min.js @@ -1,2 +1 @@ -!function(i,e){"use strict";class t{static initialize(i){e("select.multiselect",i).each((function(){new t(e(this))}))}constructor(i){this.elem=i,this.elem.multiSelect()}}e((function(){void 0!==window.ts?ts.ajax.register(t.initialize,!0):t.initialize()})),i.MultiselectWidget=t,Object.defineProperty(i,"__esModule",{value:!0}),void 0===window.yafowil&&(window.yafowil={}),window.yafowil.multiselect=i}({},jQuery); -//# sourceMappingURL=widget.min.js.map +var yafowil_multiselect=function(i,e){"use strict";class t{static initialize(i){e("select.multiselect",i).each((function(){new t(e(this))}))}constructor(i){this.elem=i,this.elem.multiSelect()}}return e((function(){void 0!==window.ts?ts.ajax.register(t.initialize,!0):t.initialize()})),i.MultiselectWidget=t,Object.defineProperty(i,"__esModule",{value:!0}),void 0===window.yafowil&&(window.yafowil={}),window.yafowil.multiselect=i,i}({},jQuery); diff --git a/src/yafowil/widget/multiselect/resources/widget.min.js.map b/src/yafowil/widget/multiselect/resources/widget.min.js.map deleted file mode 100644 index 9e524e6..0000000 --- a/src/yafowil/widget/multiselect/resources/widget.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"widget.min.js","sources":["../../../../../js/src/widget.js","../../../../../js/src/bundle.js"],"sourcesContent":null,"names":["MultiselectWidget","static","context","$","each","this","constructor","elem","multiSelect","undefined","window","ts","ajax","register","initialize"],"mappings":"4BAEO,MAAMA,EACTC,kBAAkBC,GACdC,EAAE,qBAAsBD,GAASE,MAAK,WAClC,IAAIJ,EAAkBG,EAAEE,UAIhCC,YAAYC,GACRF,KAAKE,KAAOA,EACZF,KAAKE,KAAKC,eCLlBL,GAAE,gBACoBM,IAAdC,OAAOC,GACPA,GAAGC,KAAKC,SAASb,EAAkBc,YAAY,GAE/Cd,EAAkBc"} \ No newline at end of file From b8db253708576924184475aa0a3293d2c33d14f7 Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Thu, 17 Mar 2022 08:57:23 +0100 Subject: [PATCH 06/33] add test and coverage shell scripts --- scripts/coverage.sh | 10 ++++++++++ scripts/test.sh | 5 +++++ 2 files changed, 15 insertions(+) create mode 100755 scripts/coverage.sh create mode 100755 scripts/test.sh diff --git a/scripts/coverage.sh b/scripts/coverage.sh new file mode 100755 index 0000000..9998c23 --- /dev/null +++ b/scripts/coverage.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +set -e + +./bin/coverage run \ + --source src/yafowil/widget/multiselect \ + --omit src/yafowil/widget/multiselect/example.py \ + -m yafowil.widget.multiselect.tests +./bin/coverage report +./bin/coverage html diff --git a/scripts/test.sh b/scripts/test.sh new file mode 100755 index 0000000..d73b97c --- /dev/null +++ b/scripts/test.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# +# Run python tests. + +./bin/python -m yafowil.widget.multiselect.tests From 8f59afb1bc90d8421775fcb5bf8d9567089a853d Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Thu, 17 Mar 2022 09:22:32 +0100 Subject: [PATCH 07/33] update autoWatch config --- js/karma.conf.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/karma.conf.js b/js/karma.conf.js index 460c024..bc0da6f 100644 --- a/js/karma.conf.js +++ b/js/karma.conf.js @@ -23,7 +23,8 @@ module.exports = function(config) { browsers: [ 'ChromeHeadless' ], - singlerun: true, + autoWatch: false, + singleRun: true, reporters: [ 'progress', 'coverage' From 0f6556c22371d44b5e6ba06db5588138b87d204c Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Tue, 19 Apr 2022 13:28:51 +0200 Subject: [PATCH 08/33] use root vars with fallback --- src/yafowil/widget/multiselect/resources/widget.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yafowil/widget/multiselect/resources/widget.css b/src/yafowil/widget/multiselect/resources/widget.css index 2251fd5..9b80b96 100644 --- a/src/yafowil/widget/multiselect/resources/widget.css +++ b/src/yafowil/widget/multiselect/resources/widget.css @@ -5,6 +5,6 @@ iframe.multiselect-sandbox { .ms-container .ms-selectable li.ms-hover, .ms-container .ms-selection li.ms-hover { - background-color: #b1dbfb; - color: black; + background-color: var(--yafowil-accent-color, #b1dbfb); + color: var(--yafowil-accent-font-color, #000); } \ No newline at end of file From 3caa9dcdb1e97039e3565dd97870fb8065499c3d Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Wed, 4 May 2022 13:40:23 +0200 Subject: [PATCH 09/33] change fallback color to bs5 blue --- src/yafowil/widget/multiselect/resources/widget.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yafowil/widget/multiselect/resources/widget.css b/src/yafowil/widget/multiselect/resources/widget.css index 9b80b96..f47acbc 100644 --- a/src/yafowil/widget/multiselect/resources/widget.css +++ b/src/yafowil/widget/multiselect/resources/widget.css @@ -5,6 +5,6 @@ iframe.multiselect-sandbox { .ms-container .ms-selectable li.ms-hover, .ms-container .ms-selection li.ms-hover { - background-color: var(--yafowil-accent-color, #b1dbfb); - color: var(--yafowil-accent-font-color, #000); + background-color: var(--yafowil-accent-color, #0d6efd); + color: var(--yafowil-accent-font-color, #fff); } \ No newline at end of file From 4fa75f3ad9f9aa6c8140033c6debbcb31bc395c3 Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Thu, 5 May 2022 11:56:48 +0200 Subject: [PATCH 10/33] housekeeping --- .gitignore | 1 + package.json | 6 +++--- src/yafowil/widget/multiselect/resources/widget.css | 3 +-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index e88fecf..a93f0fb 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ /dist/ /downloads/ /eggs/ +/include/ /js/karma/ /lib/ /lib64 diff --git a/package.json b/package.json index 161c63a..9d8c4f6 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "devDependencies": { - "karma": "^6.3.17", + "karma": "^6.3.19", "karma-chrome-launcher": "^3.1.1", "karma-coverage": "^2.2.0", "karma-module-resolver-preprocessor": "^1.1.3", "karma-qunit": "^4.1.2", - "qunit": "^2.18.0", - "rollup": "^2.70.1", + "qunit": "^2.19.1", + "rollup": "^2.72.0", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-terser": "^7.0.2" } diff --git a/src/yafowil/widget/multiselect/resources/widget.css b/src/yafowil/widget/multiselect/resources/widget.css index f47acbc..e947b46 100644 --- a/src/yafowil/widget/multiselect/resources/widget.css +++ b/src/yafowil/widget/multiselect/resources/widget.css @@ -3,8 +3,7 @@ iframe.multiselect-sandbox { height:30em !important; } - .ms-container .ms-selectable li.ms-hover, .ms-container .ms-selection li.ms-hover { background-color: var(--yafowil-accent-color, #0d6efd); color: var(--yafowil-accent-font-color, #fff); -} \ No newline at end of file +} From e280f98a511c1b8911088559b1e294ff2cfe88a4 Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Thu, 5 May 2022 12:38:08 +0200 Subject: [PATCH 11/33] test setup --- js/karma.conf.js | 6 ++++++ js/tests/test_test.js | 3 --- 2 files changed, 6 insertions(+), 3 deletions(-) delete mode 100644 js/tests/test_test.js diff --git a/js/karma.conf.js b/js/karma.conf.js index bc0da6f..2e303e1 100644 --- a/js/karma.conf.js +++ b/js/karma.conf.js @@ -1,6 +1,8 @@ // chromium binary process.env.CHROME_BIN = '/usr/bin/chromium'; +const RESOURCE_DIR = '../../src/yafowil/widget/multiselect/resources'; + // karma config module.exports = function(config) { config.set({ @@ -19,6 +21,10 @@ module.exports = function(config) { }, { pattern: '../tests/test_*.js', type: 'module' + }, { + pattern: `${RESOURCE_DIR}/multi-select/js/jquery.multi-select.js`, + type: 'module', + included: true }], browsers: [ 'ChromeHeadless' diff --git a/js/tests/test_test.js b/js/tests/test_test.js deleted file mode 100644 index 7259cde..0000000 --- a/js/tests/test_test.js +++ /dev/null @@ -1,3 +0,0 @@ -QUnit.test('test', assert => { - assert.ok(true); -}); \ No newline at end of file From fe827c97d117497a8eeb27b9eec30a3140b9ef51 Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Fri, 6 May 2022 12:38:41 +0200 Subject: [PATCH 12/33] add github tests --- .github/workflows/test_py.yaml | 49 ++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/test_py.yaml diff --git a/.github/workflows/test_py.yaml b/.github/workflows/test_py.yaml new file mode 100644 index 0000000..34dbab0 --- /dev/null +++ b/.github/workflows/test_py.yaml @@ -0,0 +1,49 @@ +name: Test multiselect + +on: + push: + +jobs: + test: + name: Test ${{ matrix.python }} - ${{ matrix.os }} + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + - windows-latest + - macos-latest + + python: + - "2.7" + - "3.7" + - "3.8" + - "3.9" + - "3.10" + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python }} + + - name: Install + run: | + pip install wheel + pip install coverage + pip install lxml + pip install zope.testrunner + pip install https://github.com/conestack/yafowil/archive/master.zip + pip install -e .[test] + - name: Run tests + run: | + python --version + python -m yafowil.widget.multiselect.tests + - name: Run coverage + run: | + coverage run --source=src/yafowil/widget/multiselect --omit=src/yafowil/widget/multiselect/example.py -m yafowil.widget.multiselect.tests + coverage report --fail-under=99 \ No newline at end of file From a0dea799db1d2a5a1e7a795c3350369dca490820 Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Tue, 10 May 2022 10:49:15 +0200 Subject: [PATCH 13/33] add js action --- .github/workflows/test_js.yaml | 34 ++++++++++++++++++++++++++++++++++ .github/workflows/test_py.yaml | 2 ++ js/karma-coverage.js | 17 +++++++++++++++++ js/karma.conf.js | 13 +++++++++++++ js/tests/test_widget.js | 9 +++++++++ package.json | 4 ++++ 6 files changed, 79 insertions(+) create mode 100644 .github/workflows/test_js.yaml create mode 100644 js/karma-coverage.js create mode 100644 js/tests/test_widget.js diff --git a/.github/workflows/test_js.yaml b/.github/workflows/test_js.yaml new file mode 100644 index 0000000..e605500 --- /dev/null +++ b/.github/workflows/test_js.yaml @@ -0,0 +1,34 @@ +name: JS Test multiselect + +on: + push: + paths: + - '**.js' + +jobs: + test: + name: TEST MULTISELECT + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Install + run: | + npm --save-dev install \ + qunit \ + karma \ + karma-qunit \ + karma-coverage \ + karma-chrome-launcher \ + karma-module-resolver-preprocessor + npm --no-save install https://github.com/jquery/jquery#main + + - name: Run tests + run: | + node_modules/karma/bin/karma start js/karma.conf.js + + - name: Run coverage + run: | + npm run karma-test:coverage diff --git a/.github/workflows/test_py.yaml b/.github/workflows/test_py.yaml index 34dbab0..df859dd 100644 --- a/.github/workflows/test_py.yaml +++ b/.github/workflows/test_py.yaml @@ -2,6 +2,8 @@ name: Test multiselect on: push: + paths: + - '**.py' jobs: test: diff --git a/js/karma-coverage.js b/js/karma-coverage.js new file mode 100644 index 0000000..887137b --- /dev/null +++ b/js/karma-coverage.js @@ -0,0 +1,17 @@ +const percentage = { + lines: 100, + statements: 100, + functions: 100, + branches: 100 +} +var summary = require('./karma/coverage/coverage-summary.json'); + +for (let res in summary.total) { + if (summary.total[res].pct < percentage[res]) { + throw new Error( + `Coverage too low on ${res}, + expected: ${percentage[res]}, + got: ${summary.total[res].pct}` + ); + } +} \ No newline at end of file diff --git a/js/karma.conf.js b/js/karma.conf.js index 2e303e1..a12e076 100644 --- a/js/karma.conf.js +++ b/js/karma.conf.js @@ -35,6 +35,19 @@ module.exports = function(config) { 'progress', 'coverage' ], + coverageReporter: { + reporters: [ + { + type: 'json-summary', + dir: 'coverage/', + subdir: '.' + }, { + type: 'html', + dir: 'coverage/', + subdir: 'chrome-headless' + } + ] + }, preprocessors: { '../src/*.js': [ 'coverage', diff --git a/js/tests/test_widget.js b/js/tests/test_widget.js new file mode 100644 index 0000000..c4f7923 --- /dev/null +++ b/js/tests/test_widget.js @@ -0,0 +1,9 @@ +import {MultiselectWidget} from '../src/widget.js'; + +QUnit.test('initialize', assert => { + let el = $('').addClass('multiselect').appendTo('body'); MultiselectWidget.initialize(); - let wid = el.data('multiselect'); + let wid = el.data('yafowil-multiselect'); assert.ok(wid); }); From 24ec0cc419f7753d12b7017e3840b6ab45dd88ec Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Sat, 21 May 2022 06:52:37 +0200 Subject: [PATCH 19/33] "Register resources with webresource" --- src/yafowil/widget/multiselect/__init__.py | 57 ++++++++++++++++++++-- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/src/yafowil/widget/multiselect/__init__.py b/src/yafowil/widget/multiselect/__init__.py index c09c41f..0cba98d 100644 --- a/src/yafowil/widget/multiselect/__init__.py +++ b/src/yafowil/widget/multiselect/__init__.py @@ -1,9 +1,52 @@ from yafowil.base import factory from yafowil.utils import entry_point import os +import webresource as wr -resourcedir = os.path.join(os.path.dirname(__file__), 'resources') +resources_dir = os.path.join(os.path.dirname(__file__), 'resources') + + +############################################################################## +# Default +############################################################################## + +# webresource ################################################################ + +scripts = wr.ResourceGroup(name='scripts') +scripts.add(wr.ScriptResource( + name='multiselect-js', + depends='jquery-js', + directory=os.path.join(resources_dir, 'multi-select', 'js'), + resource='jquery.multi-select.js' +)) +scripts.add(wr.ScriptResource( + name='yafowil-multiselect-js', + depends='multiselect-js', + directory=resources_dir, + resource='widget.js', + compressed='widget.min.js' +)) + +styles = wr.ResourceGroup(name='styles') +styles.add(wr.StyleResource( + name='multiselect-css', + directory=os.path.join(resources_dir, 'multi-select', 'css'), + resource='multi-select.css' +)) +styles.add(wr.StyleResource( + name='yafowil-multiselect-css', + depends='multiselect-css', + directory=resources_dir, + resource='widget.css' +)) + +resources = wr.ResourceGroup(name='multiselect-resources') +resources.add(scripts) +resources.add(styles) + +# B/C resources ############################################################## + js = [{ 'group': 'yafowil.widget.multiselect.dependencies', 'resource': 'multi-select/js/jquery.multi-select.js', @@ -24,8 +67,16 @@ }] +############################################################################## +# Registration +############################################################################## + @entry_point(order=10) def register(): from yafowil.widget.multiselect import widget # noqa - factory.register_theme('default', 'yafowil.widget.multiselect', - resourcedir, js=js, css=css) + + # Default + factory.register_theme( + 'default', 'yafowil.widget.multiselect', resources_dir, + js=js, css=css, resources=resources + ) From 77f5a378080ca9103f966b73a443af750d7c1963 Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Mon, 23 May 2022 13:31:54 +0200 Subject: [PATCH 20/33] Update bundle --- package.json | 4 ++-- src/yafowil/widget/multiselect/resources/widget.js | 8 ++++---- src/yafowil/widget/multiselect/resources/widget.min.js | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 12ccb62..a4dc161 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,13 @@ "karma-test:coverage": "node js/karma-coverage.js" }, "devDependencies": { - "karma": "^6.3.19", + "karma": "^6.3.20", "karma-chrome-launcher": "^3.1.1", "karma-coverage": "^2.2.0", "karma-module-resolver-preprocessor": "^1.1.3", "karma-qunit": "^4.1.2", "qunit": "^2.19.1", - "rollup": "^2.72.0", + "rollup": "^2.74.1", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-terser": "^7.0.2" } diff --git a/src/yafowil/widget/multiselect/resources/widget.js b/src/yafowil/widget/multiselect/resources/widget.js index fcfa999..f656c09 100644 --- a/src/yafowil/widget/multiselect/resources/widget.js +++ b/src/yafowil/widget/multiselect/resources/widget.js @@ -8,6 +8,7 @@ var yafowil_multiselect = (function (exports, $) { }); } constructor(elem) { + elem.data('yafowil-multiselect', this); this.elem = elem; this.elem.multiSelect(); } @@ -16,6 +17,8 @@ var yafowil_multiselect = (function (exports, $) { $(function() { if (window.ts !== undefined) { ts.ajax.register(MultiselectWidget.initialize, true); + } else if (window.bdajax !== undefined) { + bdajax.register(MultiselectWidget.initialize, true); } else { MultiselectWidget.initialize(); } @@ -26,10 +29,7 @@ var yafowil_multiselect = (function (exports, $) { Object.defineProperty(exports, '__esModule', { value: true }); - if (window.yafowil === undefined) { - window.yafowil = {}; - } - + window.yafowil = window.yafowil || {}; window.yafowil.multiselect = exports; diff --git a/src/yafowil/widget/multiselect/resources/widget.min.js b/src/yafowil/widget/multiselect/resources/widget.min.js index 6939a6a..bcdede2 100644 --- a/src/yafowil/widget/multiselect/resources/widget.min.js +++ b/src/yafowil/widget/multiselect/resources/widget.min.js @@ -1 +1 @@ -var yafowil_multiselect=function(i,e){"use strict";class t{static initialize(i){e("select.multiselect",i).each((function(){new t(e(this))}))}constructor(i){this.elem=i,this.elem.multiSelect()}}return e((function(){void 0!==window.ts?ts.ajax.register(t.initialize,!0):t.initialize()})),i.MultiselectWidget=t,Object.defineProperty(i,"__esModule",{value:!0}),void 0===window.yafowil&&(window.yafowil={}),window.yafowil.multiselect=i,i}({},jQuery); +var yafowil_multiselect=function(i,e){"use strict";class t{static initialize(i){e("select.multiselect",i).each((function(){new t(e(this))}))}constructor(i){i.data("yafowil-multiselect",this),this.elem=i,this.elem.multiSelect()}}return e((function(){void 0!==window.ts?ts.ajax.register(t.initialize,!0):void 0!==window.bdajax?bdajax.register(t.initialize,!0):t.initialize()})),i.MultiselectWidget=t,Object.defineProperty(i,"__esModule",{value:!0}),window.yafowil=window.yafowil||{},window.yafowil.multiselect=i,i}({},jQuery); From 959ea2dbb54a9413c92c8991e13f036faa707f17 Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Wed, 25 May 2022 09:06:17 +0200 Subject: [PATCH 21/33] "Update webresource registration" --- src/yafowil/widget/multiselect/__init__.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/yafowil/widget/multiselect/__init__.py b/src/yafowil/widget/multiselect/__init__.py index 0cba98d..6ba135a 100644 --- a/src/yafowil/widget/multiselect/__init__.py +++ b/src/yafowil/widget/multiselect/__init__.py @@ -13,7 +13,7 @@ # webresource ################################################################ -scripts = wr.ResourceGroup(name='scripts') +scripts = wr.ResourceGroup(name='yafowil-multiselect-scripts') scripts.add(wr.ScriptResource( name='multiselect-js', depends='jquery-js', @@ -28,7 +28,7 @@ compressed='widget.min.js' )) -styles = wr.ResourceGroup(name='styles') +styles = wr.ResourceGroup(name='yafowil-multiselect-styles') styles.add(wr.StyleResource( name='multiselect-css', directory=os.path.join(resources_dir, 'multi-select', 'css'), @@ -41,10 +41,6 @@ resource='widget.css' )) -resources = wr.ResourceGroup(name='multiselect-resources') -resources.add(scripts) -resources.add(styles) - # B/C resources ############################################################## js = [{ @@ -78,5 +74,7 @@ def register(): # Default factory.register_theme( 'default', 'yafowil.widget.multiselect', resources_dir, - js=js, css=css, resources=resources + js=js, css=css ) + factory.register_scripts('default', 'yafowil.widget.multiselect', scripts) + factory.register_styles('default', 'yafowil.widget.multiselect', styles) From 7d58797b29d03b4de6dbbfef75b1e7f80bb62efb Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Wed, 25 May 2022 11:00:19 +0200 Subject: [PATCH 22/33] "Add path to webresource groups" --- src/yafowil/widget/multiselect/__init__.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/yafowil/widget/multiselect/__init__.py b/src/yafowil/widget/multiselect/__init__.py index 6ba135a..723a798 100644 --- a/src/yafowil/widget/multiselect/__init__.py +++ b/src/yafowil/widget/multiselect/__init__.py @@ -13,7 +13,10 @@ # webresource ################################################################ -scripts = wr.ResourceGroup(name='yafowil-multiselect-scripts') +scripts = wr.ResourceGroup( + name='yafowil-multiselect-scripts', + path='yafowil.widget.multiselect' +) scripts.add(wr.ScriptResource( name='multiselect-js', depends='jquery-js', @@ -28,7 +31,10 @@ compressed='widget.min.js' )) -styles = wr.ResourceGroup(name='yafowil-multiselect-styles') +styles = wr.ResourceGroup( + name='yafowil-multiselect-styles', + path='yafowil.widget.multiselect' +) styles.add(wr.StyleResource( name='multiselect-css', directory=os.path.join(resources_dir, 'multi-select', 'css'), From 72db961ae0e4c4f9067bc3214dd3d27be8912cbe Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Sat, 28 May 2022 15:41:03 +0200 Subject: [PATCH 23/33] "Adopt webresource registrations" --- src/yafowil/widget/multiselect/__init__.py | 36 +++++++++++----------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/yafowil/widget/multiselect/__init__.py b/src/yafowil/widget/multiselect/__init__.py index 723a798..927852d 100644 --- a/src/yafowil/widget/multiselect/__init__.py +++ b/src/yafowil/widget/multiselect/__init__.py @@ -13,37 +13,33 @@ # webresource ################################################################ -scripts = wr.ResourceGroup( - name='yafowil-multiselect-scripts', - path='yafowil.widget.multiselect' +resources = wr.ResourceGroup( + name='yafowil-multiselect-resources', + directory=resources_dir, + path='yafowil-multiselect' ) -scripts.add(wr.ScriptResource( +resources.add(wr.ScriptResource( name='multiselect-js', depends='jquery-js', directory=os.path.join(resources_dir, 'multi-select', 'js'), + path='yafowil-multiselect/multi-select/js', resource='jquery.multi-select.js' )) -scripts.add(wr.ScriptResource( +resources.add(wr.ScriptResource( name='yafowil-multiselect-js', depends='multiselect-js', - directory=resources_dir, resource='widget.js', compressed='widget.min.js' )) - -styles = wr.ResourceGroup( - name='yafowil-multiselect-styles', - path='yafowil.widget.multiselect' -) -styles.add(wr.StyleResource( +resources.add(wr.StyleResource( name='multiselect-css', directory=os.path.join(resources_dir, 'multi-select', 'css'), + path='yafowil-multiselect/multi-select/css', resource='multi-select.css' )) -styles.add(wr.StyleResource( +resources.add(wr.StyleResource( name='yafowil-multiselect-css', depends='multiselect-css', - directory=resources_dir, resource='widget.css' )) @@ -77,10 +73,14 @@ def register(): from yafowil.widget.multiselect import widget # noqa + widget_name = 'yafowil.widget.multiselect' + # Default factory.register_theme( - 'default', 'yafowil.widget.multiselect', resources_dir, - js=js, css=css + 'default', + widget_name, + resources_dir, + js=js, + css=css ) - factory.register_scripts('default', 'yafowil.widget.multiselect', scripts) - factory.register_styles('default', 'yafowil.widget.multiselect', styles) + factory.register_resources('default', widget_name, resources) From eb8692a9897eb685541b8f2b0639f5c6b010d103 Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Sun, 29 May 2022 11:32:30 +0200 Subject: [PATCH 24/33] "Install webresource from repo for tests" --- .github/workflows/test_py.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test_py.yaml b/.github/workflows/test_py.yaml index df859dd..3c76870 100644 --- a/.github/workflows/test_py.yaml +++ b/.github/workflows/test_py.yaml @@ -39,6 +39,7 @@ jobs: pip install coverage pip install lxml pip install zope.testrunner + pip install https://github.com/conestack/webresource/archive/master.zip pip install https://github.com/conestack/yafowil/archive/master.zip pip install -e .[test] - name: Run tests From 14679ed91804de14b354fa77934a05315bf17568 Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Mon, 30 May 2022 10:57:20 +0200 Subject: [PATCH 25/33] "Add resource tests" --- src/yafowil/widget/multiselect/tests.py | 53 +++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/src/yafowil/widget/multiselect/tests.py b/src/yafowil/widget/multiselect/tests.py index 9bfd719..d5f59b4 100644 --- a/src/yafowil/widget/multiselect/tests.py +++ b/src/yafowil/widget/multiselect/tests.py @@ -2,20 +2,25 @@ from yafowil.base import factory from yafowil.compat import IS_PY2 from yafowil.tests import YafowilTestCase +import os import unittest -import yafowil.loader # noqa if not IS_PY2: from importlib import reload +def np(path): + return path.replace('/', os.path.sep) + + class TestMultiselectWidget(YafowilTestCase): def setUp(self): super(TestMultiselectWidget, self).setUp() - from yafowil.widget.multiselect import widget - reload(widget) + from yafowil.widget import multiselect + reload(multiselect.widget) + multiselect.register() def test_edit_renderer(self): # Render widget @@ -73,6 +78,48 @@ def test_extraction(self): self.assertEqual(data.errors, []) self.assertEqual(data.extracted, ['1']) + def test_resources(self): + factory.theme = 'default' + resources = factory.get_resources('yafowil.widget.multiselect') + self.assertTrue( + resources.directory.endswith(np('/multiselect/resources')) + ) + self.assertEqual(resources.path, 'yafowil-multiselect') + + scripts = resources.scripts + self.assertEqual(len(scripts), 2) + + self.assertTrue(scripts[0].directory.endswith( + np('/multiselect/resources/multi-select/js') + )) + self.assertEqual(scripts[0].path, 'yafowil-multiselect/multi-select/js') + self.assertEqual(scripts[0].file_name, 'jquery.multi-select.js') + self.assertTrue(os.path.exists(scripts[0].file_path)) + + self.assertTrue( + scripts[1].directory.endswith(np('/multiselect/resources')) + ) + self.assertEqual(scripts[1].path, 'yafowil-multiselect') + self.assertEqual(scripts[1].file_name, 'widget.min.js') + self.assertTrue(os.path.exists(scripts[1].file_path)) + + styles = resources.styles + self.assertEqual(len(styles), 2) + + self.assertTrue(styles[0].directory.endswith( + np('/multiselect/resources/multi-select/css') + )) + self.assertEqual(styles[0].path, 'yafowil-multiselect/multi-select/css') + self.assertEqual(styles[0].file_name, 'multi-select.css') + self.assertTrue(os.path.exists(styles[0].file_path)) + + self.assertTrue( + styles[1].directory.endswith(np('/multiselect/resources')) + ) + self.assertEqual(styles[1].path, 'yafowil-multiselect') + self.assertEqual(styles[1].file_name, 'widget.css') + self.assertTrue(os.path.exists(styles[1].file_path)) + if __name__ == '__main__': unittest.main() From 6f906ce0ab4be6bba640c1b787107352bd2b6050 Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Mon, 30 May 2022 11:19:29 +0200 Subject: [PATCH 26/33] "dedicated widget import in tests" --- src/yafowil/widget/multiselect/tests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/yafowil/widget/multiselect/tests.py b/src/yafowil/widget/multiselect/tests.py index d5f59b4..3041a71 100644 --- a/src/yafowil/widget/multiselect/tests.py +++ b/src/yafowil/widget/multiselect/tests.py @@ -19,7 +19,8 @@ class TestMultiselectWidget(YafowilTestCase): def setUp(self): super(TestMultiselectWidget, self).setUp() from yafowil.widget import multiselect - reload(multiselect.widget) + from yafowil.widget.multiselect import widget + reload(widget) multiselect.register() def test_edit_renderer(self): From c7125bf0bf25c1654fbc25e2c1fdfc4b393cd000 Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Mon, 30 May 2022 13:25:32 +0200 Subject: [PATCH 27/33] Resource group name is widget name. --- .gitignore | 24 ++++---------------- package.json | 2 +- scripts/clean.sh | 11 +++++++-- scripts/coverage.sh | 26 ++++++++++++++++------ scripts/install.sh | 23 ++++++++++++++----- scripts/test.sh | 14 +++++++++++- setup.py | 13 ++++++----- src/yafowil/widget/multiselect/__init__.py | 2 +- src/yafowil/widget/multiselect/tests.py | 1 + 9 files changed, 74 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index a93f0fb..904259c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,28 +1,12 @@ - *.egg-info -*.mo *.pyc *.pyo -*#* -*~ /.coverage -/.DS_Store -/.installed.cfg -/.mr.developer.cfg -/.project -/.pydevproject -/bin/ -/develop-eggs/ /dist/ -/downloads/ -/eggs/ -/include/ +/htmlcov/ /js/karma/ -/lib/ -/lib64 /node_modules/ /package-lock.json -/parts/ -/pyvenv.cfg -/share/ -/var/ \ No newline at end of file +/py2/ +/py3/ +/pypy3/ diff --git a/package.json b/package.json index a4dc161..37cbaba 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "karma-module-resolver-preprocessor": "^1.1.3", "karma-qunit": "^4.1.2", "qunit": "^2.19.1", - "rollup": "^2.74.1", + "rollup": "^2.75.3", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-terser": "^7.0.2" } diff --git a/scripts/clean.sh b/scripts/clean.sh index 43904b1..a38829c 100755 --- a/scripts/clean.sh +++ b/scripts/clean.sh @@ -5,8 +5,15 @@ set -e to_remove=( - .coverage bin dist include htmlcov js/karma lib64 lib - node_modules package-lock.json pyvenv.cfg share + .coverage + dist + htmlcov + js/karma + node_modules + package-lock.json + py2 + py3 + pypy3 ) for item in "${to_remove[@]}"; do diff --git a/scripts/coverage.sh b/scripts/coverage.sh index 9998c23..db810d0 100755 --- a/scripts/coverage.sh +++ b/scripts/coverage.sh @@ -1,10 +1,22 @@ -#!/bin/sh +#!/bin/bash set -e -./bin/coverage run \ - --source src/yafowil/widget/multiselect \ - --omit src/yafowil/widget/multiselect/example.py \ - -m yafowil.widget.multiselect.tests -./bin/coverage report -./bin/coverage html +function run_coverage { + local target=$1 + + if [ -e "$target" ]; then + ./$target/bin/coverage run \ + --source src/yafowil/widget/multiselect \ + --omit src/yafowil/widget/multiselect/example.py \ + -m yafowil.widget.multiselect.tests + ./$target/bin/coverage report + ./$target/bin/coverage html + else + echo "Target $target not found." + fi +} + +run_coverage py2 +run_coverage py3 +run_coverage pypy3 diff --git a/scripts/install.sh b/scripts/install.sh index e6aec47..55f3c7d 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -23,8 +23,21 @@ npm --prefix . --save-dev install \ npm --prefix . --no-save install https://github.com/jquery/jquery#main -python3 -m venv . -./bin/pip install wheel -./bin/pip install coverage -./bin/pip install yafowil[test] -./bin/pip install -e .[test] +function install { + local interpreter=$1 + local target=$2 + + if [ -x "$(which $interpreter)" ]; then + virtualenv --clear -p $interpreter $target + ./$target/bin/pip install wheel coverage + ./$target/bin/pip install https://github.com/conestack/webresource/archive/master.zip + ./$target/bin/pip install https://github.com/conestack/yafowil/archive/master.zip + ./$target/bin/pip install -e .[test] + else + echo "Interpreter $interpreter not found. Skip install." + fi +} + +install python2 py2 +install python3 py3 +install pypy3 pypy3 diff --git a/scripts/test.sh b/scripts/test.sh index d73b97c..4caafbd 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -2,4 +2,16 @@ # # Run python tests. -./bin/python -m yafowil.widget.multiselect.tests +function run_tests { + local target=$1 + + if [ -e "$target" ]; then + ./$target/bin/python -m yafowil.widget.multiselect.tests + else + echo "Target $target not found." + fi +} + +run_tests py2 +run_tests py3 +run_tests pypy3 diff --git a/setup.py b/setup.py index 1b84658..2e324a2 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,6 @@ def read_file(name): 'CHANGES.rst', 'LICENSE.rst' ]]) -tests_require = ['yafowil[test]'] setup( @@ -48,10 +47,14 @@ def read_file(name): 'setuptools', 'yafowil>2.1.99', ], - tests_require=tests_require, - extras_require=dict( - test=tests_require, - ), + tests_require=[ + 'lxml', + 'zope.testrunner' + ], + extras_require=dict(test=[ + 'lxml', + 'zope.testrunner' + ]), test_suite="yafowil.widget.multiselect.tests", entry_points=""" [yafowil.plugin] diff --git a/src/yafowil/widget/multiselect/__init__.py b/src/yafowil/widget/multiselect/__init__.py index 927852d..2813eb8 100644 --- a/src/yafowil/widget/multiselect/__init__.py +++ b/src/yafowil/widget/multiselect/__init__.py @@ -14,7 +14,7 @@ # webresource ################################################################ resources = wr.ResourceGroup( - name='yafowil-multiselect-resources', + name='yafowil.widget.multiselect', directory=resources_dir, path='yafowil-multiselect' ) diff --git a/src/yafowil/widget/multiselect/tests.py b/src/yafowil/widget/multiselect/tests.py index 3041a71..99cfd29 100644 --- a/src/yafowil/widget/multiselect/tests.py +++ b/src/yafowil/widget/multiselect/tests.py @@ -85,6 +85,7 @@ def test_resources(self): self.assertTrue( resources.directory.endswith(np('/multiselect/resources')) ) + self.assertEqual(resources.name, 'yafowil.widget.multiselect') self.assertEqual(resources.path, 'yafowil-multiselect') scripts = resources.scripts From 8929ed9065eb63f757a6029df02ad45c8ba81cb0 Mon Sep 17 00:00:00 2001 From: toalba Date: Thu, 15 Dec 2022 08:46:20 +0100 Subject: [PATCH 28/33] added hook for yawofil.widget.array --- js/src/widget.js | 32 +++++++++++++++++++ .../widget/multiselect/resources/widget.js | 24 ++++++++++++++ .../multiselect/resources/widget.min.js | 2 +- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/js/src/widget.js b/js/src/widget.js index 73435dd..fe80edc 100644 --- a/js/src/widget.js +++ b/js/src/widget.js @@ -13,3 +13,35 @@ export class MultiselectWidget { this.elem.multiSelect(); } } + + +////////////////////////////////////////////////////////////////////////////// +// yafowil.widget.array integration +////////////////////////////////////////////////////////////////////////////// + +function multiselect_on_array_add(inst, context) { + MultiselectWidget.initialize(context); +} + +function multiselect_on_array_index(inst, row, index) { + $('select.multiselect', row).each(function() { + let trigger = $(this), + ref_name = trigger.data('reference-name'), + base_id = inst.base_id(row), + base_name = base_id.replace(/\-/g, '.'); + trigger.data('reference-name', inst.set_value_index( + ref_name, + base_name, + index, + '.' + )); + }); +} + +$(function() { + if (yafowil_array === undefined) { + return; + } + yafowil_array.on_array_event('on_add', multiselect_on_array_add); + yafowil_array.on_array_event('on_index', multiselect_on_array_index); +}); \ No newline at end of file diff --git a/src/yafowil/widget/multiselect/resources/widget.js b/src/yafowil/widget/multiselect/resources/widget.js index f656c09..e8ef1a5 100644 --- a/src/yafowil/widget/multiselect/resources/widget.js +++ b/src/yafowil/widget/multiselect/resources/widget.js @@ -13,6 +13,30 @@ var yafowil_multiselect = (function (exports, $) { this.elem.multiSelect(); } } + function multiselect_on_array_add(inst, context) { + MultiselectWidget.initialize(context); + } + function multiselect_on_array_index(inst, row, index) { + $('select.multiselect', row).each(function() { + let trigger = $(this), + ref_name = trigger.data('reference-name'), + base_id = inst.base_id(row), + base_name = base_id.replace(/\-/g, '.'); + trigger.data('reference-name', inst.set_value_index( + ref_name, + base_name, + index, + '.' + )); + }); + } + $(function() { + if (yafowil_array === undefined) { + return; + } + yafowil_array.on_array_event('on_add', multiselect_on_array_add); + yafowil_array.on_array_event('on_index', multiselect_on_array_index); + }); $(function() { if (window.ts !== undefined) { diff --git a/src/yafowil/widget/multiselect/resources/widget.min.js b/src/yafowil/widget/multiselect/resources/widget.min.js index bcdede2..dc38744 100644 --- a/src/yafowil/widget/multiselect/resources/widget.min.js +++ b/src/yafowil/widget/multiselect/resources/widget.min.js @@ -1 +1 @@ -var yafowil_multiselect=function(i,e){"use strict";class t{static initialize(i){e("select.multiselect",i).each((function(){new t(e(this))}))}constructor(i){i.data("yafowil-multiselect",this),this.elem=i,this.elem.multiSelect()}}return e((function(){void 0!==window.ts?ts.ajax.register(t.initialize,!0):void 0!==window.bdajax?bdajax.register(t.initialize,!0):t.initialize()})),i.MultiselectWidget=t,Object.defineProperty(i,"__esModule",{value:!0}),window.yafowil=window.yafowil||{},window.yafowil.multiselect=i,i}({},jQuery); +var yafowil_multiselect=function(e,i){"use strict";class t{static initialize(e){i("select.multiselect",e).each((function(){new t(i(this))}))}constructor(e){e.data("yafowil-multiselect",this),this.elem=e,this.elem.multiSelect()}}function a(e,i){t.initialize(i)}function n(e,t,a){i("select.multiselect",t).each((function(){let n=i(this),l=n.data("reference-name"),o=e.base_id(t).replace(/\-/g,".");n.data("reference-name",e.set_value_index(l,o,a,"."))}))}return i((function(){void 0!==yafowil_array&&(yafowil_array.on_array_event("on_add",a),yafowil_array.on_array_event("on_index",n))})),i((function(){void 0!==window.ts?ts.ajax.register(t.initialize,!0):void 0!==window.bdajax?bdajax.register(t.initialize,!0):t.initialize()})),e.MultiselectWidget=t,Object.defineProperty(e,"__esModule",{value:!0}),window.yafowil=window.yafowil||{},window.yafowil.multiselect=e,e}({},jQuery); From c26fe2d7b8d2db8fc2dff7d8c193aaacc3cd5926 Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Mon, 19 Dec 2022 09:15:03 +0100 Subject: [PATCH 29/33] tests coverage --- js/karma-coverage.js | 8 ++++---- js/tests/test_widget.js | 2 ++ package.json | 6 +++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/js/karma-coverage.js b/js/karma-coverage.js index 0072d7d..14a7ffa 100644 --- a/js/karma-coverage.js +++ b/js/karma-coverage.js @@ -1,8 +1,8 @@ const percentage = { - lines: 100, - statements: 100, - functions: 100, - branches: 100 + lines: 60, + statements: 60, + functions: 60, + branches: 50 } var summary = require('./karma/coverage/coverage-summary.json'); diff --git a/js/tests/test_widget.js b/js/tests/test_widget.js index f5f9e66..2ebc41c 100644 --- a/js/tests/test_widget.js +++ b/js/tests/test_widget.js @@ -1,5 +1,7 @@ import {MultiselectWidget} from '../src/widget.js'; +window.yafowil_array = undefined; + QUnit.test('initialize', assert => { let el = $('').addClass('multiselect').appendTo('body'); MultiselectWidget.initialize(); let wid = el.data('yafowil-multiselect'); - assert.ok(wid); }); + +QUnit.test('register_array_subscribers', assert => { + let _array_subscribers = { + on_add: [] + }; + + // window.yafowil_array is undefined - return + register_array_subscribers(); + assert.deepEqual(_array_subscribers['on_add'], []); + + // patch yafowil_array + window.yafowil_array = { + on_array_event: function(evt_name, evt_function) { + _array_subscribers[evt_name] = evt_function; + } + }; + register_array_subscribers(); + + // create table DOM + let table = $('') + .append($('')) + .append($('
')) + .appendTo('body'); + + let el = $(`