diff --git a/CHANGELOG.md b/CHANGELOG.md index ff4eacb..676ed09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,74 @@ +## 3.0.0-beta.6 + +- `Moment`: + - `moment(DateTime)`: changed to construct moment object from ISO 8601 string instead of `dateTime.toJSDeep` conversion. + +- dom_tools: ^3.0.0-beta.15 +- dom_builder: ^3.0.0-beta.8 +- build_web_compilers: ^4.4.6 + +## 3.0.0-beta.5 + +- `BSDateRangePicker`: + - `_jsQueryCallback`: change parameters to `JSArray args` to avoid a bug passing a JS string to a JSObject in a Dart function. + +- bones_ui: ^3.0.0-beta.19 +- dom_tools: ^3.0.0-beta.13 +- dom_builder: ^3.0.0-beta.7 +- web_utils: ^1.0.19 + +- build_runner: ^2.10.4 +- build_web_compilers: ^4.4.3 +- test: ^1.28.0 + +- Removed dev dependency `sass_builder`. + +## 3.0.0-beta.4 + +- `BSDateRangePicker`: + - `_configureDatePicker`: + - Fix `JQuery.$(_textElement).call()`, pass fallback as `_jsQueryCallback.toJS`, avoiding `jsify` issues. + +- bones_ui: ^3.0.0-beta.7 +- swiss_knife: ^3.3.3 +- dom_tools: ^3.0.0-beta.12 +- dom_builder: ^3.0.0-beta.4 +- web: ^1.1.1 +- web_utils: ^1.0.16 + +- build_runner: ^2.10.0 +- build_web_compilers: ^4.3.0 +- sass_builder: ^2.4.0 +- test: ^1.26.3 + +## 3.0.0-beta.3 + +- bones_ui: ^3.0.0-beta.5 +- swiss_knife: ^3.3.0 +- dom_tools: ^3.0.0-beta.5 +- intl_messages: ^3.0.0-beta.1 +- web_utils: ^1.0.9 + +## 3.0.0-beta.2 + +- Using `JSDate` from `js_interop_utils: ^1.0.6`. + +- bones_ui: ^3.0.0-beta.4 +- web_utils: ^1.0.8 + +## 3.0.0-beta.1 + +- Migrate `dart:html` (deprecated) to package `web`. + +- sdk: '>=3.6.0 <4.0.0' + +- bones_ui: ^3.0.0-beta.2 +- amdjs: ^3.0.0-beta.2 +- dom_tools: ^3.0.0-beta.4 +- dom_builder: ^3.0.0-beta.2 +- web: ^1.1.0 +- web_utils: ^1.0.6 + ## 2.3.1 - sdk: '>=3.5.0 <4.0.0' diff --git a/example/main.dart b/example/main.dart index 0cce0c0..7fa2dfb 100644 --- a/example/main.dart +++ b/example/main.dart @@ -1,6 +1,3 @@ -// ignore: deprecated_member_use -import 'dart:html'; - import 'package:bones_ui/bones_ui_kit.dart'; import 'package:bones_ui_bootstrap/bones_ui_bootstrap.dart'; @@ -49,10 +46,10 @@ class MyPage extends UIComponent { ' ...', '
', 'BSDateRangePicker:  ', - BSDateRangePicker(content!), + BSDateRangePicker(null), '
', 'BSAccordion:
', - BSAccordion(content!, [ + BSAccordion(null, [ AccordionItem('A Title', 'A text'), AccordionItem('B Title', 'B text'), AccordionItem('C Title', 'C text'), diff --git a/lib/components/daterangepicker/daterangepicker.js b/lib/components/daterangepicker/daterangepicker.js index 31a901f..663ae4f 100644 --- a/lib/components/daterangepicker/daterangepicker.js +++ b/lib/components/daterangepicker/daterangepicker.js @@ -1131,7 +1131,7 @@ //if a new date range was selected, invoke the user callback function if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) - this.callback(this.startDate.clone(), this.endDate.clone(), this.chosenLabel); + this.callback([this.startDate.clone(), this.endDate.clone(), this.chosenLabel]); //if picker is attached to a text input, update it this.updateElement(); diff --git a/lib/src/bones_ui_bootstrap_base.dart b/lib/src/bones_ui_bootstrap_base.dart index 193ff6e..60c67aa 100644 --- a/lib/src/bones_ui_bootstrap_base.dart +++ b/lib/src/bones_ui_bootstrap_base.dart @@ -1,5 +1,4 @@ -// ignore: deprecated_member_use -import 'dart:js'; +import 'dart:js_interop_unsafe'; import 'package:amdjs/amdjs.dart'; import 'package:bones_ui/bones_ui.dart'; @@ -142,12 +141,12 @@ class JQuery { } /// Does JQuery [query] - static JQuery $(dynamic query) { - var o = context.callMethod(r'$', [query]); + static JQuery $(Object? query) { + var o = globalContext.callMethod(r'$'.toJS, query.toJSDeep); return JQuery(o); } - final JsObject? _o; + final JSObject? _o; JQuery(this._o); @@ -156,7 +155,8 @@ class JQuery { /// [method] The method to call. /// [args] Arguments to the method. dynamic call(String method, [List? args]) { - return _o!.callMethod(method, args); + var arguments = args?.map((e) => (e as Object?).toJSDeep).toList(); + return _o!.callMethodVarArgs(method.toJS, arguments).dartify(); } /// Opens a new Window. @@ -164,7 +164,7 @@ class JQuery { /// - [name] of the Window. /// - [html] the Window HTML. /// - [print] if `true` will print the window. - static JsObject openWindow({String? name, String? html, bool print = false}) { + static JSObject openWindow({String? name, String? html, bool print = false}) { var openParams = []; if (name != null) { @@ -174,18 +174,19 @@ class JQuery { openParams.add(name); } - var w = context.callMethod('open', openParams) as JsObject; + var w = globalContext.callMethodVarArgs('open'.toJS, + openParams.map((e) => (e as Object?).toJSDeep).toList()) as JSObject; if (html != null && html.isNotEmpty) { - var doc = w['document'] as JsObject; - var body = doc['body'] as JsObject; - var o = context.callMethod(r'$', [body]) as JsObject; - o.callMethod('html', [html]); + var doc = w['document'] as JSObject; + var body = doc['body'] as JSObject; + var o = globalContext.callMethod(r'$'.toJS, body) as JSObject; + o.callMethod('html'.toJS, html.toJS); } if (print) { - w.callMethod('focus'); - w.callMethod('print'); + w.callMethod('focus'.toJS); + w.callMethod('print'.toJS); } return w; @@ -215,7 +216,7 @@ class Moment { static bool get isSuccessfullyLoaded => _load.isLoaded && _load.loadSuccessful!; - static JsFunction? _moment; + static JSFunction? _moment; /// Loads Moment JS library. static Future load() { @@ -228,7 +229,7 @@ class Moment { var okJS = await AMDJS.require('moment', jsFullPath: jsFullPath, globalJSVariableName: 'moment'); - _moment = context['moment'] as JsFunction?; + _moment = globalContext['moment'] as JSFunction?; var okMoment = _moment != null; @@ -245,29 +246,32 @@ class Moment { locale = locale.replaceFirst('_', '-'); - _moment!.callMethod('locale', [locale]); + _moment!.callMethod('locale'.toJS, locale.toJS); return true; } /// Parses a [DateTime] to a moment object. - static JsObject moment(DateTime dateTime) { - return JsObject(_moment!, [dateTime]); + static JSObject moment(DateTime dateTime) { + var dateStr = dateTime.toIso8601String(); + return _moment!.callAsConstructor(dateStr.toJS); } /// Formats [dateTime] to [format]. - static String? format(DateTime dateTime, format) { - return moment(dateTime).callMethod('format', format); + static String? format(DateTime dateTime, Object format) { + return moment(dateTime) + .callMethod('format'.toJS, format.toJSDeep) + ?.toDart; } - static String? jsObjectFormat(JsObject moment, format) { - return moment.callMethod('format', [format]); + static String? jsObjectFormat(JSObject moment, Object format) { + return moment.callMethod('format'.toJS, format.toJSDeep).toDart; } - static int? jsObjectToMillisecondsSinceEpoch(JsObject moment) { - return moment.callMethod('valueOf'); + static int? jsObjectToMillisecondsSinceEpoch(JSObject moment) { + return moment.callMethod('valueOf'.toJS)?.toDartInt; } - static DateTime jsObjectToDateTime(JsObject moment) { + static DateTime jsObjectToDateTime(JSObject moment) { var time = jsObjectToMillisecondsSinceEpoch(moment)!; return DateTime.fromMillisecondsSinceEpoch(time); } diff --git a/lib/src/bones_ui_bootstrap_icons.dart b/lib/src/bones_ui_bootstrap_icons.dart index ec80f2d..c979fc5 100644 --- a/lib/src/bones_ui_bootstrap_icons.dart +++ b/lib/src/bones_ui_bootstrap_icons.dart @@ -1,8 +1,6 @@ -// ignore: deprecated_member_use -import 'dart:html'; - import 'package:dom_tools/dom_tools.dart'; import 'package:swiss_knife/swiss_knife.dart'; +import 'package:web/web.dart'; import 'bones_ui_bootstrap_base.dart'; @@ -393,7 +391,7 @@ building-x.svg currency-rupee.svg filetype-key.svg motherboard-fill.svg sign-tur } /// Returns an [Element] of a SVG icon with [name]. - static Element svgIconElement(String name, + static HTMLElement svgIconElement(String name, {String? title, int? width, int? height, @@ -405,7 +403,7 @@ building-x.svg currency-rupee.svg filetype-key.svg motherboard-fill.svg sign-tur height: height, classes: classes, style: style); - return createHTML(iconHTML); + return createHTML(html: iconHTML); } static final ResourceContentCache _resourceContentCache = diff --git a/lib/src/components/daterangepicker.dart b/lib/src/components/daterangepicker.dart index b8777e5..d921d02 100644 --- a/lib/src/components/daterangepicker.dart +++ b/lib/src/components/daterangepicker.dart @@ -1,13 +1,10 @@ import 'dart:collection'; -// ignore: deprecated_member_use -import 'dart:html'; -// ignore: deprecated_member_use -import 'dart:js'; import 'package:bones_ui/bones_ui.dart'; import 'package:dom_tools/dom_tools.dart'; import 'package:intl_messages/intl_messages.dart'; import 'package:swiss_knife/swiss_knife.dart'; +import 'package:web_utils/web_utils.dart'; import '../bones_ui_bootstrap_base.dart'; import '../bones_ui_bootstrap_icons.dart'; @@ -124,29 +121,31 @@ class BSDateRangePicker extends UIComponent implements UIField> { _load.onLoad.listen((_) => refresh()); } - Element? _icon; + HTMLElement? _icon; - Element? _textElement; + HTMLElement? _textElement; @override dynamic render() { if (_load.isNotLoaded) return '...'; - if (_icon != null) { - _icon!.remove(); + var prevIcon = _icon; + if (prevIcon != null) { + prevIcon.remove(); } - if (_textElement != null) { - _textElement!.remove(); + var prevTextElement = _textElement; + if (prevTextElement != null) { + prevTextElement.remove(); } - _icon = BootstrapIcons.svgIconElement('calendar'); + var icon = _icon = BootstrapIcons.svgIconElement('calendar'); - _textElement = createHTML(''' + var textElement = _textElement = createHTML(html: '''
'''); - _textElement!.children.add(_icon!); + textElement.appendChild(icon); _configureLocale(); _buildDateRanges(); @@ -186,8 +185,8 @@ class BSDateRangePicker extends UIComponent implements UIField> { late bool _localeUsesAMPM; void _configureLocale() { - _locale = IntlLocale.getDefaultIntlLocale(); - Moment.locale(_locale!.code); + var locale = _locale = IntlLocale.getDefaultIntlLocale(); + Moment.locale(locale.code); _localeWeekFirstDay = getFirstDayOfWeek(_locale); _localeUsesAMPM = getTimeFormatUsesAMPM(_locale); @@ -205,8 +204,10 @@ class BSDateRangePicker extends UIComponent implements UIField> { var dateTimeRange = getDateTimeRange(dateRangeType, now, weekFirstDay); rangesTypesDateTimeRange[dateRangeType] = dateTimeRange; - var dateRangeTypeTitle = - toUpperCaseInitials(getDateRangeTypeTitle(dateRangeType)!); + var typeTitle = + getDateRangeTypeTitle(dateRangeType) ?? dateRangeType.name; + + var dateRangeTypeTitle = toUpperCaseInitials(typeTitle); dateRanges[dateRangeTypeTitle] = [ dateTimeRange.a.millisecondsSinceEpoch, dateTimeRange.b.millisecondsSinceEpoch @@ -236,27 +237,39 @@ class BSDateRangePicker extends UIComponent implements UIField> { 'timePicker': hasTimePicker, if (hasTimePicker) 'timePicker24Hour': !_localeUsesAMPM, if (hasTimePicker) 'timePickerIncrement': _getTimePickerMinutesInterval(), - if (_dateRanges!.isNotEmpty) 'ranges': _dateRanges, + if (_dateRanges?.isNotEmpty ?? false) 'ranges': _dateRanges, if (configLocale.isNotEmpty) 'locale': configLocale }; print(config); - JQuery.$(_textElement).call('daterangepicker', - [JsObject.jsify(config), ([a, b, c]) => _setDateRange(a, b)]); + JQuery.$(_textElement).call( + 'daterangepicker', + [config.toJSDeep, _jsQueryCallback.toJS], + ); _updateTextElement(); } - void _setDateRange(JsObject jsStartTime, JsObject jsEndTime) { + void _jsQueryCallback(JSArray args) { + var a = args[0].asJSObject; + var b = args[1].asJSObject; + _setDateRange(a, b); + } + + void _setDateRange(JSObject? jsStartTime, JSObject? jsEndTime) { + if (jsStartTime == null || jsEndTime == null) return; + setDateRange(Moment.jsObjectToDateTime(jsStartTime), Moment.jsObjectToDateTime(jsEndTime)); } /// Sets the selected date range by [dateRangeType]. void setDateRangeByType(DateRangeType dateRangeType) { - var range = _rangesTypesDateTimeRange != null - ? _rangesTypesDateTimeRange![dateRangeType] + var rangesTypesDateTimeRange = _rangesTypesDateTimeRange; + + var range = rangesTypesDateTimeRange != null + ? rangesTypesDateTimeRange[dateRangeType] : null; range ??= getDateTimeRange(dateRangeType, DateTime.now(), weekFirstDay); @@ -285,16 +298,20 @@ class BSDateRangePicker extends UIComponent implements UIField> { d.year, d.month, d.day, d.hour, d.minute, seconds, millisecond, 0); void _updateTextElement() { - if (_textElement == null) return; + final textElement = _textElement; + if (textElement == null) return; var text = dateText; - _textElement!.children.clear(); + textElement.clear(); - _textElement!.children.add(createSpan(text)); + textElement.appendChild(createSpan(html: text)); - _icon!.style.paddingLeft = '10px'; - _textElement!.children.add(_icon!); + var icon = _icon; + if (icon != null) { + icon.style.paddingLeft = '10px'; + textElement.appendChild(icon); + } } String get dateText => _getDateText(_startTime, _endTime); @@ -317,12 +334,13 @@ class BSDateRangePicker extends UIComponent implements UIField> { } String? _buildDateTextTitle(DateTime startTime, DateTime endTime) { - if (_dateRanges == null) return null; + var dateRanges = _dateRanges; + if (dateRanges == null) return null; var startMillis = startTime.millisecondsSinceEpoch; var endMillis = endTime.millisecondsSinceEpoch; - for (var entry in _dateRanges!.entries) { + for (var entry in dateRanges.entries) { var rangeInit = entry.value[0]; var rangeEnd = entry.value[1]; diff --git a/pubspec.yaml b/pubspec.yaml index 0bd8e6e..68b49a3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,26 +1,28 @@ name: bones_ui_bootstrap description: Adds Bootstrap 4+ support to Dart package bones_ui, allowing use of Bootstrap components and CSS. -version: 2.3.1 +version: 3.0.0-beta.6 homepage: https://github.com/Colossus-Services/bones_ui_bootstrap environment: - sdk: '>=3.5.0 <4.0.0' + sdk: '>=3.6.0 <4.0.0' dependencies: - bones_ui: ^2.5.13 - swiss_knife: ^3.2.3 - amdjs: ^2.0.4 - dom_tools: ^2.3.2 - dom_builder: ^2.2.7 - intl_messages: ^2.3.4 + bones_ui: ^3.0.0-beta.19 + swiss_knife: ^3.3.3 + amdjs: ^3.0.0-beta.2 + dom_tools: ^3.0.0-beta.15 + dom_builder: ^3.0.0-beta.8 + intl_messages: ^3.0.0-beta.1 + web: ^1.1.1 + web_utils: ^1.0.19 dev_dependencies: - build_runner: ^2.4.15 - build_web_compilers: ^4.1.1 - sass_builder: ^2.2.1 # To automatically build SCSS files. + build_runner: ^2.10.4 + build_web_compilers: ^4.4.6 + #sass_builder: ^2.4.0 # To automatically build SCSS files. lints: ^5.1.1 dependency_validator: ^3.2.3 - test: ^1.25.15 + test: ^1.28.0 #dependency_overrides: # bones_ui: @@ -28,8 +30,10 @@ dev_dependencies: # swiss_knife: # path: ../swiss_knife # amdjs: -# path: ../amdjs +# path: ../amdjs.dart # dom_tools: # path: ../dom_tools +# web_utils: +# path: ../web_utils # intl_messages: # path: ../intl_messages diff --git a/test/bones_ui_bootstrap_test.dart b/test/bones_ui_bootstrap_test.dart index f94b930..12972d8 100644 --- a/test/bones_ui_bootstrap_test.dart +++ b/test/bones_ui_bootstrap_test.dart @@ -1,16 +1,14 @@ @TestOn('browser') library; -// ignore: deprecated_member_use -import 'dart:html'; - +import 'package:web_utils/web_utils.dart'; import 'package:bones_ui/bones_ui.dart'; import 'package:bones_ui_bootstrap/bones_ui_bootstrap.dart'; import 'package:test/test.dart'; void main() { group('Components', () { - final rootContainer = DivElement(); + final rootContainer = HTMLDivElement(); late final MyRoot root; setUpAll(() { @@ -22,12 +20,12 @@ void main() { await root.onFinishRender.first; var myHome = rootContainer.querySelector('#my-home'); - expect(myHome, isA()); + expect(myHome, isA()); }); test('BSAccordion', () async { var myAccordion = rootContainer.querySelector('#my-accordion'); - expect(myAccordion, isA()); + expect(myAccordion, isA()); }); }); }